Tatsuya Iwai
/
set_real_time_clock
Display RTC on LCD. User is also able to update RTC from console.
main.cpp@1:1b17dcd80a7d, 2016-07-03 (annotated)
- Committer:
- iwaita2ya
- Date:
- Sun Jul 03 18:23:11 2016 +0000
- Revision:
- 1:1b17dcd80a7d
- Parent:
- 0:bad75bd13618
1st commit. Base function has been implemented.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
iwaita2ya | 1:1b17dcd80a7d | 1 | // Includes --------------------------------------------------------------------------------------- |
bcostm | 0:bad75bd13618 | 2 | #include "mbed.h" |
iwaita2ya | 1:1b17dcd80a7d | 3 | #include "TextLCD.h" |
iwaita2ya | 1:1b17dcd80a7d | 4 | |
iwaita2ya | 1:1b17dcd80a7d | 5 | // Objects ---------------------------------------------------------------------------------------- |
iwaita2ya | 1:1b17dcd80a7d | 6 | DigitalOut myled(LED1); |
iwaita2ya | 1:1b17dcd80a7d | 7 | Serial pc(USBTX, USBRX); // tx, rx |
iwaita2ya | 1:1b17dcd80a7d | 8 | TextLCD lcd(p24, p26, p27, p28, p29, p30); // rs, e, d4-d7, 16char, 2 lines |
iwaita2ya | 1:1b17dcd80a7d | 9 | Ticker ticker; |
iwaita2ya | 1:1b17dcd80a7d | 10 | time_t currentTime; |
bcostm | 0:bad75bd13618 | 11 | |
iwaita2ya | 1:1b17dcd80a7d | 12 | const int UPDATE_FREQ = 1; // sec |
iwaita2ya | 1:1b17dcd80a7d | 13 | char lcdBuffer[32]; // buffer for LCD (32=2x16) |
bcostm | 0:bad75bd13618 | 14 | |
iwaita2ya | 1:1b17dcd80a7d | 15 | // Function prototypes --------------------------------------------------------------------------- |
iwaita2ya | 1:1b17dcd80a7d | 16 | void displayOnLcd(); |
iwaita2ya | 1:1b17dcd80a7d | 17 | void updateRealTimeClock(char *buffer); |
iwaita2ya | 1:1b17dcd80a7d | 18 | void getLineFromSerial(char *keyBuffer, int bufferLength); |
iwaita2ya | 1:1b17dcd80a7d | 19 | void displayMessageOnConsole(); |
iwaita2ya | 1:1b17dcd80a7d | 20 | |
iwaita2ya | 1:1b17dcd80a7d | 21 | // Main ------------------------------------------------------------------------------------- |
bcostm | 0:bad75bd13618 | 22 | int main() { |
bcostm | 0:bad75bd13618 | 23 | |
iwaita2ya | 1:1b17dcd80a7d | 24 | char lineBuffer[32]; |
iwaita2ya | 1:1b17dcd80a7d | 25 | char *pointer; |
iwaita2ya | 1:1b17dcd80a7d | 26 | pointer = lineBuffer; |
iwaita2ya | 1:1b17dcd80a7d | 27 | |
iwaita2ya | 1:1b17dcd80a7d | 28 | // update time for every UPDATE_FREQ sec |
iwaita2ya | 1:1b17dcd80a7d | 29 | ticker.attach(&displayOnLcd, UPDATE_FREQ); |
bcostm | 0:bad75bd13618 | 30 | |
iwaita2ya | 1:1b17dcd80a7d | 31 | // |
iwaita2ya | 1:1b17dcd80a7d | 32 | for(;;) { |
iwaita2ya | 1:1b17dcd80a7d | 33 | // show initial message on console |
iwaita2ya | 1:1b17dcd80a7d | 34 | displayMessageOnConsole(); |
bcostm | 0:bad75bd13618 | 35 | |
iwaita2ya | 1:1b17dcd80a7d | 36 | // get input from console |
iwaita2ya | 1:1b17dcd80a7d | 37 | getLineFromSerial(pointer, sizeof(lineBuffer)); |
iwaita2ya | 1:1b17dcd80a7d | 38 | |
iwaita2ya | 1:1b17dcd80a7d | 39 | // update RTC based on input value |
iwaita2ya | 1:1b17dcd80a7d | 40 | updateRealTimeClock(pointer); |
bcostm | 0:bad75bd13618 | 41 | } |
bcostm | 0:bad75bd13618 | 42 | } |
iwaita2ya | 1:1b17dcd80a7d | 43 | |
iwaita2ya | 1:1b17dcd80a7d | 44 | // Functions ------------------------------------------------------------------------------------- |
iwaita2ya | 1:1b17dcd80a7d | 45 | // Display Current Time on LCD |
iwaita2ya | 1:1b17dcd80a7d | 46 | void displayOnLcd() { |
iwaita2ya | 1:1b17dcd80a7d | 47 | myled = !myled; |
iwaita2ya | 1:1b17dcd80a7d | 48 | |
iwaita2ya | 1:1b17dcd80a7d | 49 | currentTime = time(NULL); |
iwaita2ya | 1:1b17dcd80a7d | 50 | strftime(lcdBuffer, 32, "%Y/%m/%d %H:%M:%S", localtime(¤tTime)); |
iwaita2ya | 1:1b17dcd80a7d | 51 | |
iwaita2ya | 1:1b17dcd80a7d | 52 | lcd.cls(); |
iwaita2ya | 1:1b17dcd80a7d | 53 | lcd.locate(0,0); |
iwaita2ya | 1:1b17dcd80a7d | 54 | lcd.printf("RTC:%s", lcdBuffer); |
iwaita2ya | 1:1b17dcd80a7d | 55 | |
iwaita2ya | 1:1b17dcd80a7d | 56 | myled = !myled; |
iwaita2ya | 1:1b17dcd80a7d | 57 | }; |
iwaita2ya | 1:1b17dcd80a7d | 58 | |
iwaita2ya | 1:1b17dcd80a7d | 59 | // Update RTC |
iwaita2ya | 1:1b17dcd80a7d | 60 | void updateRealTimeClock(char *buffer) { |
iwaita2ya | 1:1b17dcd80a7d | 61 | char *tp; |
iwaita2ya | 1:1b17dcd80a7d | 62 | char *timeArray[6]; |
iwaita2ya | 1:1b17dcd80a7d | 63 | int arrayIndex; |
iwaita2ya | 1:1b17dcd80a7d | 64 | struct tm struct_time; |
iwaita2ya | 1:1b17dcd80a7d | 65 | |
iwaita2ya | 1:1b17dcd80a7d | 66 | // extract number from string |
iwaita2ya | 1:1b17dcd80a7d | 67 | arrayIndex = 0; |
iwaita2ya | 1:1b17dcd80a7d | 68 | tp = strtok( buffer, " /:-" ); |
iwaita2ya | 1:1b17dcd80a7d | 69 | timeArray[arrayIndex++] = tp; |
iwaita2ya | 1:1b17dcd80a7d | 70 | printf("%d ", atoi(tp)); |
iwaita2ya | 1:1b17dcd80a7d | 71 | while ( tp != NULL && arrayIndex < 6 ) { |
iwaita2ya | 1:1b17dcd80a7d | 72 | tp = strtok( NULL," /:-" ); |
iwaita2ya | 1:1b17dcd80a7d | 73 | timeArray[arrayIndex++] = tp; |
iwaita2ya | 1:1b17dcd80a7d | 74 | if ( tp != NULL ) { |
iwaita2ya | 1:1b17dcd80a7d | 75 | printf("%d ", atoi(tp)); |
iwaita2ya | 1:1b17dcd80a7d | 76 | } |
iwaita2ya | 1:1b17dcd80a7d | 77 | } |
iwaita2ya | 1:1b17dcd80a7d | 78 | printf("\r\n"); |
iwaita2ya | 1:1b17dcd80a7d | 79 | |
iwaita2ya | 1:1b17dcd80a7d | 80 | // store number into time struct |
iwaita2ya | 1:1b17dcd80a7d | 81 | struct_time.tm_year = atoi(timeArray[0]) - 1900; |
iwaita2ya | 1:1b17dcd80a7d | 82 | struct_time.tm_mon = atoi(timeArray[1]) - 1; |
iwaita2ya | 1:1b17dcd80a7d | 83 | struct_time.tm_mday = atoi(timeArray[2]); |
iwaita2ya | 1:1b17dcd80a7d | 84 | struct_time.tm_hour = atoi(timeArray[3]); |
iwaita2ya | 1:1b17dcd80a7d | 85 | struct_time.tm_min = atoi(timeArray[4]); |
iwaita2ya | 1:1b17dcd80a7d | 86 | struct_time.tm_sec = atoi(timeArray[5]); |
iwaita2ya | 1:1b17dcd80a7d | 87 | |
iwaita2ya | 1:1b17dcd80a7d | 88 | currentTime = mktime(&struct_time); |
iwaita2ya | 1:1b17dcd80a7d | 89 | set_time(currentTime); |
iwaita2ya | 1:1b17dcd80a7d | 90 | } |
iwaita2ya | 1:1b17dcd80a7d | 91 | |
iwaita2ya | 1:1b17dcd80a7d | 92 | // Read & display input data from console |
iwaita2ya | 1:1b17dcd80a7d | 93 | void getLineFromSerial(char *keyBuffer, int bufferLength) |
iwaita2ya | 1:1b17dcd80a7d | 94 | { |
iwaita2ya | 1:1b17dcd80a7d | 95 | char c; |
iwaita2ya | 1:1b17dcd80a7d | 96 | int index = 0; |
iwaita2ya | 1:1b17dcd80a7d | 97 | |
iwaita2ya | 1:1b17dcd80a7d | 98 | for (;;) { |
iwaita2ya | 1:1b17dcd80a7d | 99 | // break if keyBuffer is full |
iwaita2ya | 1:1b17dcd80a7d | 100 | if (index >= bufferLength) { |
iwaita2ya | 1:1b17dcd80a7d | 101 | break; |
iwaita2ya | 1:1b17dcd80a7d | 102 | } |
iwaita2ya | 1:1b17dcd80a7d | 103 | |
iwaita2ya | 1:1b17dcd80a7d | 104 | // read input |
iwaita2ya | 1:1b17dcd80a7d | 105 | c = pc.getc(); |
iwaita2ya | 1:1b17dcd80a7d | 106 | pc.putc(c); |
iwaita2ya | 1:1b17dcd80a7d | 107 | |
iwaita2ya | 1:1b17dcd80a7d | 108 | // break if end |
iwaita2ya | 1:1b17dcd80a7d | 109 | if (c == '\r') { |
iwaita2ya | 1:1b17dcd80a7d | 110 | keyBuffer[index++] = c; |
iwaita2ya | 1:1b17dcd80a7d | 111 | printf("\n"); |
iwaita2ya | 1:1b17dcd80a7d | 112 | break; |
iwaita2ya | 1:1b17dcd80a7d | 113 | } |
iwaita2ya | 1:1b17dcd80a7d | 114 | |
iwaita2ya | 1:1b17dcd80a7d | 115 | // store in keyBuffer |
iwaita2ya | 1:1b17dcd80a7d | 116 | keyBuffer[index++] = c; |
iwaita2ya | 1:1b17dcd80a7d | 117 | } |
iwaita2ya | 1:1b17dcd80a7d | 118 | } |
iwaita2ya | 1:1b17dcd80a7d | 119 | |
iwaita2ya | 1:1b17dcd80a7d | 120 | // display message and ask user to input time |
iwaita2ya | 1:1b17dcd80a7d | 121 | void displayMessageOnConsole() { |
iwaita2ya | 1:1b17dcd80a7d | 122 | currentTime = time(NULL); |
iwaita2ya | 1:1b17dcd80a7d | 123 | strftime(lcdBuffer, 32, "%Y/%m/%d %H:%M:%S", localtime(¤tTime)); |
iwaita2ya | 1:1b17dcd80a7d | 124 | |
iwaita2ya | 1:1b17dcd80a7d | 125 | printf("Current Time:%s\r\n", lcdBuffer); |
iwaita2ya | 1:1b17dcd80a7d | 126 | printf("Enter new Time (YYYY/mm/dd HH:MM:SS)\r\n"); |
iwaita2ya | 1:1b17dcd80a7d | 127 | } |
iwaita2ya | 1:1b17dcd80a7d | 128 |