Read NTP time from Ethernet and drive six 7-segment LEDs using a MAX7221 to show time, date, month, week, year etc....
Dependencies: NTPClient_NetServices mbed
Diff: main.cpp
- Revision:
- 0:e083abcfe7a8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Jun 22 01:31:47 2011 +0000 @@ -0,0 +1,707 @@ +/************************************************************* + Author: Derek Cheung + Email: cheungderek@hotmail.com + Web: http://clients.teksavvy.com/~cheungderek + Date: 21 Jun 2011 + Note: Just some testing but working code + Read NTP time and date to show Time, Date, Month, + Year automatically using MAX7221 to drive 6 LEDs + See my home page for details +*************************************************************/ + +#include "mbed.h" +#include "EthernetNetIf.h" +#include "HTTPClient.h" +#include "TextLCD.h" +#include "NTPClient.h" +#include "Max7221.h" + +#define BLINK_PERIOD 1.8 // LED on period (Initial data) +#define END_PERIOD 0.0001 // Finish period + +DigitalOut myled1(LED1); // Assign LED output port LED1 to LED4 +DigitalOut myled2(LED2); +DigitalOut myled3(LED3); +DigitalOut myled4(LED4); + +TextLCD lcd(p15, p16, p17, p26, p25, p24, p23, 16, 2); // rs,rw,e,d0,d1,d2,d3,16char's x 2 lines +SPI max7221_spi(p5, p6, p7, "max7221"); // mosi, miso, sclk +DigitalOut max7221_cs(p8); +Serial pc(USBTX, USBRX); // tx, rx + +unsigned int dec2bcd(unsigned int dec); +void max7221_control(unsigned control); +void display_weekOfDay_month(struct tm *tm_ptr); +void display_day_year(struct tm *tm_ptr); + + +/* +#include "USBHost.h" +#include "Utils.h" +#include "FATFileSystem.h" +void TestShell(); +*/ +EthernetNetIf eth; + +int main() { + + float tim; + char buf[40]; + struct tm *tm_ptr; + unsigned int tmp_int; + char *test_ptr; + time_t ctTime; + + NTPClient ntp; + + // Setup the spi for 16 bit data, sample at falling edge clcok at 1MHz + max7221_spi.format(16,0); + max7221_spi.frequency(1000000); + + // shutdown operation + // max7221_spi.write(0x0C00); + + // turn on all display + max7221_control(0x0F01); + + // set normal operation + max7221_control(0x0F00); + + // normal operation + max7221_control(0x0C01); + + // sacn 6 LED + max7221_control(0x0B05); + + // BCD mode + max7221_control(0x09FF); + + // full intensity - Derek + max7221_control(0x0A0F); + + // testing the char display on the LEDs + /* + tm_ptr = localtime(&ctTime); + tm_ptr->tm_mon=1; + tm_ptr->tm_mday = 0; + display_weekOfDay_month(tm_ptr); + tm_ptr->tm_mon=2; + tm_ptr->tm_mday = 1; + display_weekOfDay_month(tm_ptr); + tm_ptr->tm_mon=3; + tm_ptr->tm_mday = 2; + display_weekOfDay_month(tm_ptr); + tm_ptr->tm_mon=4; + tm_ptr->tm_mday = 3; + display_weekOfDay_month(tm_ptr); + tm_ptr->tm_mon=5; + tm_ptr->tm_mday = 4; + display_weekOfDay_month(tm_ptr); + tm_ptr->tm_mon=6; + tm_ptr->tm_mday = 5; + display_weekOfDay_month(tm_ptr); + tm_ptr->tm_mon=7; + tm_ptr->tm_mday = 6; + display_weekOfDay_month(tm_ptr); + tm_ptr->tm_mon=8; + display_weekOfDay_month(tm_ptr); + tm_ptr->tm_mon=9; + display_weekOfDay_month(tm_ptr); + tm_ptr->tm_mon=10; + display_weekOfDay_month(tm_ptr); + tm_ptr->tm_mon=11; + display_weekOfDay_month(tm_ptr); + tm_ptr->tm_mon=12; + display_weekOfDay_month(tm_ptr); + */ + + // BCD mode + // max7221_control(0x09FF); + + tim = BLINK_PERIOD; + lcd.cls(); + lcd.locate(0, 0); + + // 0 1 + // lcd.printf("1234567890123456"); + // lcd.locate(0, 1); + // lcd.printf("Derek Cheung v2"); + + // If you have implemented the "Windows USB Serial Port Driver", you can use follows. + // http://mbed.org/projects/handbook/wiki/WindowsSerialConfiguration + // printf("\r\n Derek Cheung Twitter Device Control - Setting up...\r\n"); + EthernetErr ethErr = eth.setup(); + if (ethErr) { + printf("Error %d in setup.\n", ethErr); + lcd.locate(0, 1); + lcd.printf("Network Failed "); + } + printf("\r\n Network Connection Setup OK\r\n"); + + HTTPClient twitter; + + HTTPMap msg; + msg["status"] = "Twitter Control logon successfully"; //A good example of Key/Value pair use with Web APIs + + twitter.basicAuth("cheungderek", "34563456"); //We use basic authentication, replace with you account's parameters + + //No need to retieve data sent back by the server + HTTPResult r = twitter.post("http://api.supertweet.net/1/statuses/update.xml", msg, NULL); + if ( r == HTTP_OK ) { + printf("Tweet sent with success!\n"); + } else { + printf("Problem during tweeting, return code %d\n", r); + } + + lcd.cls(); + + + unsigned short tmp_left_led_digit, tmp_right_led_digit; + int blink_value = 3; + Host server(IpAddr(), 123, "0.uk.pool.ntp.org"); + ntp.setTime(server); + int resyncNtpServerTimer = 0; + int mDayDisplayTimer = 0; + int monthDisplayTimer = 0; + HTTPText txt; + + while (1) { + /* for (tim =BLINK_PERIOD; tim >= END_PERIOD; tim /= 3) { + myled1 = 1; + wait(tim); + myled1 = 0; + myled2 = 1; + wait(tim); + myled2 = 0; + myled3 = 1; + wait(tim); + myled3 = 0; + myled4 = 1; + wait(tim); + myled4 = 0; + } + */ + + /* + printf("\r\n trying to get a tweet \r\n"); + twitter.get("http://api.supertweet.net/1/statuses/update.xml", &txt); //Blocking + printf("\r\n HTTP data %s \r\n", txt); + */ + + tmp_left_led_digit = 0; + tmp_right_led_digit = 0; + + // sprintf(buf,"loop # = %d", count); + ctTime = time(NULL) - 14400; // EST is 4 hours behind UTC + // set_time(ctTime); // set the RTC clock) + // printf("%d - RTC time is (UTC): %s \r \n", n++, ctime(&ctTime)); + tm_ptr = localtime(&ctTime); + + strftime(buf, 32, "%a %b %d %Y ", localtime(&ctTime)); + lcd.locate(0,0); // 1st line + lcd.printf(buf); + + blink_value++; + + // Display Seconds on the LED1 and LED2 + tmp_int = dec2bcd(tm_ptr->tm_sec); + // re-sync the NTP clock to RTC every 2 minutes / hours + resyncNtpServerTimer++; + if (resyncNtpServerTimer == 100000) { + lcd.locate(0, 1); + lcd.printf("NTP Server Sync "); + wait(1); + // ethErr = eth.setup(); + if (ethErr) { + printf("Error %d in setup.\n", ethErr); + lcd.locate(0, 1); + lcd.printf("Network Failed "); + } else { + printf("\r\nNetwork Connection Setup OK\r\n"); + // backup the time in case ntp server fails + ctTime = time(NULL); + if (ntp.setTime(server) != 0) { + lcd.locate(0,1); + lcd.printf("NTP Sync Failed "); + set_time(ctTime); + } + } + wait(1); + resyncNtpServerTimer = 0; + } + // lcd.locate(0,1); + // lcd.printf(" "); + + mDayDisplayTimer++; + if (mDayDisplayTimer == 1200) { + display_day_year(tm_ptr); + display_weekOfDay_month(tm_ptr); + mDayDisplayTimer = 0; + } + + tmp_left_led_digit = (unsigned short) tmp_int >> 4; + tmp_right_led_digit = (unsigned short) tmp_int & 0x000F; + max7221_control(LED_DIGIT1 | tmp_right_led_digit); + max7221_control(LED_DIGIT2 | tmp_left_led_digit); + + + + // Display Minutes on the LED3 and LED4 + tmp_int = dec2bcd(tm_ptr->tm_min); + tmp_left_led_digit = (unsigned short) tmp_int >> 4; + tmp_right_led_digit = (unsigned short) tmp_int & 0x000F; + max7221_control(LED_DIGIT3 | tmp_right_led_digit | 0x0080); + + + /* + if ((blink_value % 4) == 0) + max7221_control(LED_DIGIT3 | tmp_right_led_digit | 0x0080); + else + max7221_control(LED_DIGIT3 | tmp_right_led_digit & 0xFF7F); + */ + max7221_control(LED_DIGIT4 | tmp_left_led_digit); + + // Display Hours on the LED5 and LED6 + tmp_int = dec2bcd(tm_ptr->tm_hour); + tmp_left_led_digit = (unsigned short) tmp_int >> 4; + tmp_right_led_digit = (unsigned short) tmp_int & 0x000F; + max7221_control(LED_DIGIT5 | tmp_right_led_digit | 0x0080); + + + + /* + if ((blink_value % 4) == 0) + max7221_control(LED_DIGIT5 | tmp_right_led_digit | 0x0080); + else + max7221_control(LED_DIGIT5 | tmp_right_led_digit & 0xFF7F); + */ + max7221_control(LED_DIGIT6 | tmp_left_led_digit); + + /* Ethernet read Twitter message */ + + + /* + tmp_left_led_digit = (unsigned short) tmp_int >> 4; + tmp_right_led_digit = (unsigned short) tmp_int & 0x000F; + + // printf("\r\n unsigned in %d, unsigned short int %d, char %d - ", sizeof(unsigned int), sizeof(unsigned short int), sizeof(char)); + + + printf("\r\n tmp_left_led_digit %X \r\n", tmp_left_led_digit | 0x0100); + max7221_cs = 0; + max7221_spi.write(tmp_left_led_digit | 0x0200); + max7221_cs = 1; + wait(0.01); + + max7221_cs = 0; + max7221_spi.write(tmp_right_led_digit | 0x0100); + max7221_cs = 1; + + tmp_int = dec2bcd(tm_ptr->tm_sec); + max7221_cs = 0; + max7221_spi.write(0x0100 || (tmp_int & 0x0F)); + max7221_cs = 1; + */ + + } + return 0; +}; + +/* + // strftime(buf, 16, "%X", localtime(&ctTime)); + // lcd.locate(0, 1); // 2nd line + // lcd.printf(buf); + //sprintf(buf, ctime(&ctTime)); + + // lcd.printf(buf); + // printf(" Current loop count number = %d \r\n", count); + // count++; + + + pc.baud(460800); + printf("BlueUSB\nNow get a bunch of usb or bluetooth things and plug them in\n"); + TestShell(); +*/ + +unsigned int dec2bcd(unsigned int dec) { + unsigned int bits, bcd = 0; + for ( bits = 0; dec; bits += 4, dec /= 10 ) { + bcd |= dec % 10 << bits; + } + return bcd; +} + + +void max7221_control(unsigned control) { + max7221_cs = 0; + max7221_spi.write(control); + max7221_cs = 1; + wait(0.001); +} + +void display_weekOfDay_month(struct tm *tm_ptr) { + + // no decode + max7221_control(0x0900); + + max7221_control(LED_DIGIT6 | LED__); + max7221_control(LED_DIGIT5 | LED__); + max7221_control(LED_DIGIT4 | LED__); + + switch(tm_ptr->tm_mon + 1) { + case 1 : + max7221_control(LED_DIGIT6 | LED_J); + max7221_control(LED_DIGIT5 | LED_A); + max7221_control(LED_DIGIT4 | LED_N); + max7221_control(LED_DIGIT3 | LED_U); + max7221_control(LED_DIGIT2 | LED_A); + max7221_control(LED_DIGIT1 | LED_r); + break; + case 2 : + max7221_control(LED_DIGIT6 | LED_F); + max7221_control(LED_DIGIT5 | LED_E); + max7221_control(LED_DIGIT4 | LED_b); + max7221_control(LED_DIGIT3 | LED_U); + max7221_control(LED_DIGIT2 | LED_A); + max7221_control(LED_DIGIT1 | LED_r); + break; + case 3 : + max7221_control(LED_DIGIT5 | LED_M); + max7221_control(LED_DIGIT4 | LED_A); + max7221_control(LED_DIGIT3 | LED_r); + max7221_control(LED_DIGIT2 | LED_C); + max7221_control(LED_DIGIT1 | LED_H); + break; + case 4 : + max7221_control(LED_DIGIT5 | LED_A); + max7221_control(LED_DIGIT4 | LED_P); + max7221_control(LED_DIGIT3 | LED_r); + max7221_control(LED_DIGIT2 | LED_i); + max7221_control(LED_DIGIT1 | LED_I); + break; + case 5 : + max7221_control(LED_DIGIT3 | LED_M); + max7221_control(LED_DIGIT2 | LED_A); + max7221_control(LED_DIGIT1 | LED_y); + break; + case 6 : + max7221_control(LED_DIGIT4 | LED_J); + max7221_control(LED_DIGIT3 | LED_U); + max7221_control(LED_DIGIT2 | LED_N); + max7221_control(LED_DIGIT1 | LED_E); + break; + case 7 : + max7221_control(LED_DIGIT4 | LED_J); + max7221_control(LED_DIGIT3 | LED_U); + max7221_control(LED_DIGIT2 | LED_L); + max7221_control(LED_DIGIT1 | LED_y); + break; + case 8 : + max7221_control(LED_DIGIT6 | LED_A); + max7221_control(LED_DIGIT5 | LED_U); + max7221_control(LED_DIGIT4 | LED_g); + max7221_control(LED_DIGIT3 | LED_U); + max7221_control(LED_DIGIT2 | LED_S); + max7221_control(LED_DIGIT1 | LED_r); + break; + case 9 : + max7221_control(LED_DIGIT6 | LED_S); + max7221_control(LED_DIGIT5 | LED_E); + max7221_control(LED_DIGIT4 | LED_P); + max7221_control(LED_DIGIT3 | LED_t); + max7221_control(LED_DIGIT2 | LED_E); + max7221_control(LED_DIGIT1 | LED_M); + break; + case 10 : + max7221_control(LED_DIGIT6 | LED_O); + max7221_control(LED_DIGIT5 | LED_C); + max7221_control(LED_DIGIT4 | LED_t); + max7221_control(LED_DIGIT3 | LED_O); + max7221_control(LED_DIGIT2 | LED_b); + max7221_control(LED_DIGIT1 | LED_E); + break; + case 11 : + max7221_control(LED_DIGIT6 | LED_N); + max7221_control(LED_DIGIT5 | LED_O); + max7221_control(LED_DIGIT4 | LED_V); + max7221_control(LED_DIGIT3 | LED_E); + max7221_control(LED_DIGIT2 | LED_M); + max7221_control(LED_DIGIT1 | LED_b); + break; + case 12 : + max7221_control(LED_DIGIT5 | LED_E); + max7221_control(LED_DIGIT5 | LED_E); + max7221_control(LED_DIGIT4 | LED_C); + max7221_control(LED_DIGIT3 | LED_E); + max7221_control(LED_DIGIT2 | LED_M); + max7221_control(LED_DIGIT1 | LED_b); + break; + default : + max7221_control(LED_DIGIT5 | LED_M); + max7221_control(LED_DIGIT5 | LED_E); + max7221_control(LED_DIGIT4 | LED_r); + max7221_control(LED_DIGIT3 | LED_r); + max7221_control(LED_DIGIT2 | LED_o); + max7221_control(LED_DIGIT1 | LED_r); + } + + wait(1.5); + + // printf("tm_ptr->tm_year %d \r\n", tm_ptr->tm_year); + max7221_control(LED_DIGIT6 | LED__); + max7221_control(LED_DIGIT5 | LED__); + + switch(tm_ptr->tm_year - 100) { + case 11 : + max7221_control(LED_DIGIT4 | LED_2); + max7221_control(LED_DIGIT3 | LED_0); + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_1); + break; + case 12 : + max7221_control(LED_DIGIT4 | LED_2); + max7221_control(LED_DIGIT3 | LED_0); + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_2); + break; + case 13 : + max7221_control(LED_DIGIT4 | LED_2); + max7221_control(LED_DIGIT3 | LED_0); + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_3); + break; + case 14 : + max7221_control(LED_DIGIT4 | LED_2); + max7221_control(LED_DIGIT3 | LED_0); + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_4); + break; + case 15 : + max7221_control(LED_DIGIT4 | LED_2); + max7221_control(LED_DIGIT3 | LED_0); + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_5); + break; + case 16 : + max7221_control(LED_DIGIT4 | LED_2); + max7221_control(LED_DIGIT3 | LED_0); + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_6); + break; + case 17 : + max7221_control(LED_DIGIT4 | LED_2); + max7221_control(LED_DIGIT3 | LED_0); + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_7); + break; + case 18 : + max7221_control(LED_DIGIT4 | LED_2); + max7221_control(LED_DIGIT3 | LED_0); + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_8); + break; + case 19 : + max7221_control(LED_DIGIT4 | LED_2); + max7221_control(LED_DIGIT3 | LED_0); + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_9); + break; + case 20 : + max7221_control(LED_DIGIT4 | LED_2); + max7221_control(LED_DIGIT3 | LED_0); + max7221_control(LED_DIGIT2 | LED_2); + max7221_control(LED_DIGIT1 | LED_0); + break; + default : + max7221_control(LED_DIGIT5 | LED_y); + max7221_control(LED_DIGIT5 | LED_E); + max7221_control(LED_DIGIT4 | LED_r); + max7221_control(LED_DIGIT3 | LED_r); + max7221_control(LED_DIGIT2 | LED_o); + max7221_control(LED_DIGIT1 | LED_r); + } + + wait(1.5); + // BCD mode + max7221_control(0x09FF); +} + +void display_day_year(struct tm *tm_ptr) { + // no decode + max7221_control(0x0900); + + printf("tm_ptr->tm_wday %d \r\n", tm_ptr->tm_wday); + switch(tm_ptr->tm_wday) { + case 0 : + max7221_control(LED_DIGIT6 | LED_S); + max7221_control(LED_DIGIT5 | LED_U); + max7221_control(LED_DIGIT4 | LED_N); + break; + case 1 : + max7221_control(LED_DIGIT6 | LED_M); + max7221_control(LED_DIGIT5 | LED_O); + max7221_control(LED_DIGIT4 | LED_N); + break; + case 2 : + max7221_control(LED_DIGIT6 | LED_t); + max7221_control(LED_DIGIT5 | LED_U); + max7221_control(LED_DIGIT4 | LED_E); + break; + case 3 : + max7221_control(LED_DIGIT6 | LED_W); + max7221_control(LED_DIGIT5 | LED_E); + max7221_control(LED_DIGIT4 | LED_d); + break; + case 4 : + max7221_control(LED_DIGIT6 | LED_t); + max7221_control(LED_DIGIT5 | LED_h); + max7221_control(LED_DIGIT4 | LED_u); + break; + case 5 : + max7221_control(LED_DIGIT6 | LED_F); + max7221_control(LED_DIGIT5 | LED_r); + max7221_control(LED_DIGIT4 | LED_i); + break; + case 6 : + max7221_control(LED_DIGIT6 | LED_S); + max7221_control(LED_DIGIT5 | LED_A); + max7221_control(LED_DIGIT4 | LED_t); + break; + default : + max7221_control(LED_DIGIT6 | LED_E); + max7221_control(LED_DIGIT5 | LED_r); + max7221_control(LED_DIGIT4 | LED_r); + } + + max7221_control(LED_DIGIT3 | LED__); + max7221_control(LED_DIGIT2 | LED__); + switch(tm_ptr->tm_mday) { + case 1 : + max7221_control(LED_DIGIT1 | LED_1); + break; + case 2 : + max7221_control(LED_DIGIT1 | LED_2); + break; + case 3 : + max7221_control(LED_DIGIT1 | LED_3); + break; + case 4 : + max7221_control(LED_DIGIT1 | LED_4); + break; + case 5 : + max7221_control(LED_DIGIT1 | LED_5); + break; + case 6 : + max7221_control(LED_DIGIT1 | LED_6); + break; + case 7 : + max7221_control(LED_DIGIT1 | LED_7); + break; + case 8 : + max7221_control(LED_DIGIT1 | LED_8); + break; + case 9 : + max7221_control(LED_DIGIT1 | LED_9); + break; + case 11 : + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_0); + break; + case 12 : + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_2); + break; + case 13 : + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_3); + break; + case 14 : + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_4); + break; + case 15 : + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_5); + break; + case 16 : + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_6); + break; + case 17 : + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_7); + break; + case 18 : + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_8); + break; + case 19 : + max7221_control(LED_DIGIT2 | LED_1); + max7221_control(LED_DIGIT1 | LED_9); + break; + case 20 : + max7221_control(LED_DIGIT2 | LED_2); + max7221_control(LED_DIGIT1 | LED_0); + break; + case 21 : + max7221_control(LED_DIGIT2 | LED_2); + max7221_control(LED_DIGIT1 | LED_1); + break; + case 22 : + max7221_control(LED_DIGIT2 | LED_2); + max7221_control(LED_DIGIT1 | LED_2); + break; + case 23 : + max7221_control(LED_DIGIT2 | LED_2); + max7221_control(LED_DIGIT1 | LED_3); + break; + case 24 : + max7221_control(LED_DIGIT2 | LED_2); + max7221_control(LED_DIGIT1 | LED_4); + break; + case 25 : + max7221_control(LED_DIGIT2 | LED_2); + max7221_control(LED_DIGIT1 | LED_5); + break; + case 26 : + max7221_control(LED_DIGIT2 | LED_2); + max7221_control(LED_DIGIT1 | LED_6); + break; + case 27 : + max7221_control(LED_DIGIT2 | LED_2); + max7221_control(LED_DIGIT1 | LED_7); + break; + case 28 : + max7221_control(LED_DIGIT2 | LED_2); + max7221_control(LED_DIGIT1 | LED_8); + break; + case 29 : + max7221_control(LED_DIGIT2 | LED_2); + max7221_control(LED_DIGIT1 | LED_9); + break; + case 30 : + max7221_control(LED_DIGIT2 | LED_3); + max7221_control(LED_DIGIT1 | LED_0); + break; + case 31 : + max7221_control(LED_DIGIT2 | LED_3); + max7221_control(LED_DIGIT1 | LED_1); + break; + } + wait(1.5); + // BCD mode + max7221_control(0x09FF); +} + +/* +DigitalOut myled(LED1); + +int main() { + while(1) { + myled = 1; + wait(0.2); + myled = 0; + wait(0.2); + } +} +*/