The Smart Watch using SSD1306 and I2C. The Time obtain using SNTP protocol from NTP Server.

Dependencies:   WIZnetInterface SNTPClinet mbed-dev

Prerequisite

This example is to obtain a time from NTP server using SNTP protocol.

To implement this function, you need a Platform board and OLED.

Below are what we used.

  • WIZwiki-W7500 from WIZnet (Platform board)
  • OLED from WIZnet

Hardware Configuration

WIZwiki-W7500 Pin map

pin map

OLED (from WIZnet)

/media/uploads/stkim92/oled.png

Wiring Table

OLEDW7500
SCLPA_9
SDAPA_10
GNDGND
VCCVCC

Software

Define Pins

SSD1306.h

#if defined(TARGET_WIZwiki_W7500)
#define SDA                  PA_10
#define SCL                  PA_9
#endif

Connect to NTP server

main.cpp

SNTPClient sntp("time.nist.gov", 40);   // timezone: Korea, Republic of
sntp.connect();

Get Time

main.cpp

if(sntp.getTime(&ntptime) == true)
    {
        pc.printf("%d-%d-%d, %d:%d:%d\r\n", ntptime.yy, ntptime.mo, ntptime.dd, ntptime.hh, ntptime.mm, ntptime.ss);
        wait(1.0);
    }
    else
    {
        while(sntp.getTime(&ntptime) != true)
        {
            //break;
        }
    }

Caution

watchout pins setting

main.cpp

Committer:
stkim92
Date:
2017-04-13
Revision:
2:25b14c11c06c
Parent:
1:f0c1fe04502c

File content as of revision 2:25b14c11c06c:

#include "mbed.h"
#include "EthernetInterface.h"
#include "SNTPClient.h"
#include "SSD1306.h"

#if defined(TARGET_WIZwiki_W7500)
    EthernetInterface eth;
    DigitalIn  sw(PC_0);
#endif

#if defined(TARGET_WIZwiki_W7500ECO)
    EthernetInterface eth;
    DigitalIn  sw(PC_0);
#endif

TCPSocketConnection sock;

DigitalOut myled(PA_6);

Serial pc(USBTX, USBRX); // tx, rx

datetime ntptime;
struct tm timeinfo;


int main()
{
    uint8_t mac_addr[6] = {0x00, 0x08, 0xDC, 0x00, 0x01, 0x02}; 
    uint8_t count=0;
    uint8_t time_x_offset =0;
    uint8_t old_offset =0;
    char buffer[32];
    
    pc.baud(9600);
    init();
    cls();
    OLED_DrawBMP(0,0,128,8,(unsigned char *)wiznet);
    wait(1);
    cls();
    eth.init(mac_addr); //Use DHCP
    eth.connect();
  
    pc.printf("IP Address is %s\n\r", eth.getIPAddress());
    SNTPClient sntp("time.nist.gov", 40);   // timezone: Korea, Republic of
    sntp.connect();
    if(sntp.getTime(&ntptime) == true)
    {
        pc.printf("%d-%d-%d, %d:%d:%d\r\n", ntptime.yy, ntptime.mo, ntptime.dd, ntptime.hh, ntptime.mm, ntptime.ss);
        wait(1.0);
    }
    else
    {
        while(sntp.getTime(&ntptime) != true)
        {
            //break;
        }
    }

    timeinfo.tm_mon = ntptime.mo-1;
    timeinfo.tm_mday = ntptime.dd;
    timeinfo.tm_hour = ntptime.hh;
    timeinfo.tm_min = ntptime.mm;
    timeinfo.tm_sec = ntptime.ss;
    timeinfo.tm_year = ntptime.yy-1900;
    // printf("%d-%d, %d:%d:%d\r\n", timeinfo.tm_mon, timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
    time_t t =mktime(&timeinfo);
            
    set_time(t);
    t = time(NULL);
     
    while (1) {
        time_t seconds = time(NULL);
              
       // printf("Time as a basic string = %s\r\n", ctime(&seconds));
        if(count == 50)
        {
            cls();
            count++;
        }
        if(count > 50)
        {
           time_x_offset =0;              
           if(old_offset != time_x_offset){
               old_offset = time_x_offset;
            }
            //strftime (buffer,32,"%I:%M:%S ",localtime(&seconds));
            strftime (buffer,32,"%I:%M",localtime(&seconds));
            LED_P23x32Str(time_x_offset,3,buffer);

            //intBigTime(buffer);
            if(sw == 0)
            {
                count = 0;   
                cls();            
            }
        
        }
        else
        {   
            strftime(buffer, 32,"%a %d %b %Y", localtime(&seconds));
            OLED_ShowStr(10, 3, buffer,1 );
            strftime(buffer, 32, "%I:%M:%S %p", localtime(&seconds));
            OLED_ShowStr(10, 4, buffer,2 );
            count ++;
        }
    }
}