Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: TextLCD nRF24L01P mbed
main.cpp@6:19012a85ce35, 2016-12-20 (annotated)
- Committer:
- jackmax
- Date:
- Tue Dec 20 10:47:22 2016 +0000
- Revision:
- 6:19012a85ce35
- Child:
- 8:0de75e0480aa
gdffhdhg
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| jackmax | 6:19012a85ce35 | 1 | #include "mbed.h" |
| jackmax | 6:19012a85ce35 | 2 | #include "rtos.h" |
| jackmax | 6:19012a85ce35 | 3 | #include "TextLCD.h" |
| jackmax | 6:19012a85ce35 | 4 | #include "custom-chars.h" |
| jackmax | 6:19012a85ce35 | 5 | |
| jackmax | 6:19012a85ce35 | 6 | // Host PC Communication channels |
| jackmax | 6:19012a85ce35 | 7 | Serial pc(USBTX, USBRX); // tx, rx |
| jackmax | 6:19012a85ce35 | 8 | |
| jackmax | 6:19012a85ce35 | 9 | I2C i2c_lcd(D5,D7); // SDA, SCL pins. Change if necessary |
| jackmax | 6:19012a85ce35 | 10 | TextLCD_I2C lcd(&i2c_lcd, 0x4E, TextLCD::LCD16x2); // I2C exp: I2C bus, PCF8574 Slaveaddress, LCD Type |
| jackmax | 6:19012a85ce35 | 11 | |
| jackmax | 6:19012a85ce35 | 12 | //Light sensor |
| jackmax | 6:19012a85ce35 | 13 | AnalogIn light_sensor(A1); |
| jackmax | 6:19012a85ce35 | 14 | |
| jackmax | 6:19012a85ce35 | 15 | void backlightTimeout(void const *arg); |
| jackmax | 6:19012a85ce35 | 16 | RtosTimer backlightTimer(&backlightTimeout, osTimerPeriodic, (void*)0); |
| jackmax | 6:19012a85ce35 | 17 | |
| jackmax | 6:19012a85ce35 | 18 | class Display{ |
| jackmax | 6:19012a85ce35 | 19 | public: |
| jackmax | 6:19012a85ce35 | 20 | int wifi_on; |
| jackmax | 6:19012a85ce35 | 21 | int alarm_on; |
| jackmax | 6:19012a85ce35 | 22 | int sync_in_progress; |
| jackmax | 6:19012a85ce35 | 23 | int wireless_in_progress; |
| jackmax | 6:19012a85ce35 | 24 | int frame; |
| jackmax | 6:19012a85ce35 | 25 | |
| jackmax | 6:19012a85ce35 | 26 | time_t seconds; |
| jackmax | 6:19012a85ce35 | 27 | char time_str[9]; |
| jackmax | 6:19012a85ce35 | 28 | char date_str[9]; |
| jackmax | 6:19012a85ce35 | 29 | |
| jackmax | 6:19012a85ce35 | 30 | static const int backlightTime = 5000; |
| jackmax | 6:19012a85ce35 | 31 | int backlightState; |
| jackmax | 6:19012a85ce35 | 32 | Display() |
| jackmax | 6:19012a85ce35 | 33 | { |
| jackmax | 6:19012a85ce35 | 34 | wifi_on = 0; |
| jackmax | 6:19012a85ce35 | 35 | alarm_on = 0; |
| jackmax | 6:19012a85ce35 | 36 | sync_in_progress = 0; |
| jackmax | 6:19012a85ce35 | 37 | wireless_in_progress = 0; |
| jackmax | 6:19012a85ce35 | 38 | frame = 0; |
| jackmax | 6:19012a85ce35 | 39 | backlightState = 0; |
| jackmax | 6:19012a85ce35 | 40 | |
| jackmax | 6:19012a85ce35 | 41 | lcd.setCursor(TextLCD::CurOff_BlkOff); |
| jackmax | 6:19012a85ce35 | 42 | lcd.setUDC(C_ALRM, cc_dzwonek); |
| jackmax | 6:19012a85ce35 | 43 | lcd.setUDC(C_WIFI, cc_wifi); |
| jackmax | 6:19012a85ce35 | 44 | lcd.setUDC(C_WLC , cc_wireless); |
| jackmax | 6:19012a85ce35 | 45 | } |
| jackmax | 6:19012a85ce35 | 46 | |
| jackmax | 6:19012a85ce35 | 47 | void backlightOff(){ |
| jackmax | 6:19012a85ce35 | 48 | lcd.setBacklight(TextLCD::LightOff); |
| jackmax | 6:19012a85ce35 | 49 | backlightState = 0; |
| jackmax | 6:19012a85ce35 | 50 | } |
| jackmax | 6:19012a85ce35 | 51 | |
| jackmax | 6:19012a85ce35 | 52 | void backlightOn(){ |
| jackmax | 6:19012a85ce35 | 53 | lcd.setBacklight(TextLCD::LightOn); |
| jackmax | 6:19012a85ce35 | 54 | backlightState = 1; |
| jackmax | 6:19012a85ce35 | 55 | backlightTimer.start(backlightTime); |
| jackmax | 6:19012a85ce35 | 56 | } |
| jackmax | 6:19012a85ce35 | 57 | |
| jackmax | 6:19012a85ce35 | 58 | void update(){ |
| jackmax | 6:19012a85ce35 | 59 | //Top row of display |
| jackmax | 6:19012a85ce35 | 60 | char ico1 = ' '; |
| jackmax | 6:19012a85ce35 | 61 | char ico2 = wireless_in_progress ? (frame % 2 ? C_WLC : ' ' ) : ' '; |
| jackmax | 6:19012a85ce35 | 62 | char ico3 = C_ALRM; |
| jackmax | 6:19012a85ce35 | 63 | int ah=85, am=84; |
| jackmax | 6:19012a85ce35 | 64 | |
| jackmax | 6:19012a85ce35 | 65 | time_t seconds_now = time(NULL); |
| jackmax | 6:19012a85ce35 | 66 | if (seconds_now != seconds) { |
| jackmax | 6:19012a85ce35 | 67 | seconds = seconds_now; |
| jackmax | 6:19012a85ce35 | 68 | strftime(time_str, 9, "%X", localtime(&seconds)); |
| jackmax | 6:19012a85ce35 | 69 | strftime(date_str, 9, "%x", localtime(&seconds)); |
| jackmax | 6:19012a85ce35 | 70 | } |
| jackmax | 6:19012a85ce35 | 71 | |
| jackmax | 6:19012a85ce35 | 72 | lcd.locate(0,0); //Put in top row |
| jackmax | 6:19012a85ce35 | 73 | lcd.printf("%s%c%c%c%02d:%02d",time_str,ico1,ico2,ico3,ah,am); |
| jackmax | 6:19012a85ce35 | 74 | |
| jackmax | 6:19012a85ce35 | 75 | lcd.locate(0,1); //Put in bottom row |
| jackmax | 6:19012a85ce35 | 76 | if (sync_in_progress) { |
| jackmax | 6:19012a85ce35 | 77 | lcd.printf("Synchronizacja.."); |
| jackmax | 6:19012a85ce35 | 78 | } |
| jackmax | 6:19012a85ce35 | 79 | else { |
| jackmax | 6:19012a85ce35 | 80 | if (frame % 60 < 30) { |
| jackmax | 6:19012a85ce35 | 81 | lcd.printf("SmartAlarm+ Pro "); |
| jackmax | 6:19012a85ce35 | 82 | } |
| jackmax | 6:19012a85ce35 | 83 | else { |
| jackmax | 6:19012a85ce35 | 84 | lcd.printf(" %08s ", date_str); |
| jackmax | 6:19012a85ce35 | 85 | } |
| jackmax | 6:19012a85ce35 | 86 | } |
| jackmax | 6:19012a85ce35 | 87 | frame++; |
| jackmax | 6:19012a85ce35 | 88 | } |
| jackmax | 6:19012a85ce35 | 89 | }; |
| jackmax | 6:19012a85ce35 | 90 | |
| jackmax | 6:19012a85ce35 | 91 | Display disp; |
| jackmax | 6:19012a85ce35 | 92 | |
| jackmax | 6:19012a85ce35 | 93 | //Handling user button presses |
| jackmax | 6:19012a85ce35 | 94 | InterruptIn button(D6); |
| jackmax | 6:19012a85ce35 | 95 | int userButtonLongPress = 300; //Time in ms; threshold for long press |
| jackmax | 6:19012a85ce35 | 96 | Timer userButtonTimer; |
| jackmax | 6:19012a85ce35 | 97 | |
| jackmax | 6:19012a85ce35 | 98 | int userButtonPressed = 0, userButtonReleased = 0, backlightTimedOut = 0; |
| jackmax | 6:19012a85ce35 | 99 | |
| jackmax | 6:19012a85ce35 | 100 | void userButtonPress(){ |
| jackmax | 6:19012a85ce35 | 101 | userButtonPressed = 1; |
| jackmax | 6:19012a85ce35 | 102 | } |
| jackmax | 6:19012a85ce35 | 103 | |
| jackmax | 6:19012a85ce35 | 104 | void userButtonRelease(){ |
| jackmax | 6:19012a85ce35 | 105 | userButtonReleased = 1; |
| jackmax | 6:19012a85ce35 | 106 | } |
| jackmax | 6:19012a85ce35 | 107 | |
| jackmax | 6:19012a85ce35 | 108 | void backlightTimeout(void const *arg){ |
| jackmax | 6:19012a85ce35 | 109 | backlightTimedOut = 1; |
| jackmax | 6:19012a85ce35 | 110 | } |
| jackmax | 6:19012a85ce35 | 111 | |
| jackmax | 6:19012a85ce35 | 112 | Ticker display_update_ticker; |
| jackmax | 6:19012a85ce35 | 113 | int main() { |
| jackmax | 6:19012a85ce35 | 114 | set_time(1256729737); //DEBUG: Set RTC time to Wed, 28 Oct 2009 11:35:37 |
| jackmax | 6:19012a85ce35 | 115 | //Initialization |
| jackmax | 6:19012a85ce35 | 116 | disp.backlightOn(); |
| jackmax | 6:19012a85ce35 | 117 | //display_update_ticker.attach(&display_update,0.2); |
| jackmax | 6:19012a85ce35 | 118 | button.rise(&userButtonPress); |
| jackmax | 6:19012a85ce35 | 119 | button.fall(&userButtonRelease); |
| jackmax | 6:19012a85ce35 | 120 | |
| jackmax | 6:19012a85ce35 | 121 | while (1){ |
| jackmax | 6:19012a85ce35 | 122 | pc.printf("ok\r\n"); |
| jackmax | 6:19012a85ce35 | 123 | |
| jackmax | 6:19012a85ce35 | 124 | if (userButtonPressed) { |
| jackmax | 6:19012a85ce35 | 125 | userButtonPressed = 0; |
| jackmax | 6:19012a85ce35 | 126 | userButtonTimer.reset(); |
| jackmax | 6:19012a85ce35 | 127 | userButtonTimer.start(); |
| jackmax | 6:19012a85ce35 | 128 | } |
| jackmax | 6:19012a85ce35 | 129 | |
| jackmax | 6:19012a85ce35 | 130 | if (userButtonReleased) { |
| jackmax | 6:19012a85ce35 | 131 | userButtonReleased = 0; |
| jackmax | 6:19012a85ce35 | 132 | userButtonTimer.stop(); |
| jackmax | 6:19012a85ce35 | 133 | if (userButtonTimer.read_ms() > userButtonLongPress){ |
| jackmax | 6:19012a85ce35 | 134 | pc.printf("User button long pressed"); |
| jackmax | 6:19012a85ce35 | 135 | disp.backlightOff(); |
| jackmax | 6:19012a85ce35 | 136 | } |
| jackmax | 6:19012a85ce35 | 137 | else { |
| jackmax | 6:19012a85ce35 | 138 | pc.printf("User button short pressed"); |
| jackmax | 6:19012a85ce35 | 139 | disp.backlightOn(); |
| jackmax | 6:19012a85ce35 | 140 | } |
| jackmax | 6:19012a85ce35 | 141 | } |
| jackmax | 6:19012a85ce35 | 142 | |
| jackmax | 6:19012a85ce35 | 143 | if (backlightTimedOut){ |
| jackmax | 6:19012a85ce35 | 144 | backlightTimedOut = 0; |
| jackmax | 6:19012a85ce35 | 145 | disp.backlightOff(); |
| jackmax | 6:19012a85ce35 | 146 | } |
| jackmax | 6:19012a85ce35 | 147 | |
| jackmax | 6:19012a85ce35 | 148 | disp.update(); |
| jackmax | 6:19012a85ce35 | 149 | Thread::wait(100); |
| jackmax | 6:19012a85ce35 | 150 | }; |
| jackmax | 6:19012a85ce35 | 151 | } |
| jackmax | 6:19012a85ce35 | 152 | |
| jackmax | 6:19012a85ce35 | 153 | |
| jackmax | 6:19012a85ce35 | 154 |

