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

Committer:
stkim92
Date:
Thu Apr 13 01:50:52 2017 +0000
Revision:
2:25b14c11c06c
Parent:
0:6e799e373101
added WIZwiki-W7500ECHO

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eunkyoungkim 0:6e799e373101 1 #include "data.h"
eunkyoungkim 0:6e799e373101 2 #define addr (0x78)
eunkyoungkim 0:6e799e373101 3
eunkyoungkim 0:6e799e373101 4 #if defined(TARGET_WIZwiki_W7500)
eunkyoungkim 0:6e799e373101 5 #define SDA PA_10
eunkyoungkim 0:6e799e373101 6 #define SCL PA_9
eunkyoungkim 0:6e799e373101 7 #endif
eunkyoungkim 0:6e799e373101 8
stkim92 2:25b14c11c06c 9 #if defined(TARGET_WIZwiki_W7500ECO)
stkim92 2:25b14c11c06c 10 #define SDA PA_10
stkim92 2:25b14c11c06c 11 #define SCL PA_9
stkim92 2:25b14c11c06c 12 #endif
stkim92 2:25b14c11c06c 13
eunkyoungkim 0:6e799e373101 14 I2C i2c(SDA, SCL);
eunkyoungkim 0:6e799e373101 15
eunkyoungkim 0:6e799e373101 16 void send_cmd(uint8_t cmd){
eunkyoungkim 0:6e799e373101 17 char c[2] ={0x00,cmd};
eunkyoungkim 0:6e799e373101 18
eunkyoungkim 0:6e799e373101 19 i2c.write(addr,c,2,1);
eunkyoungkim 0:6e799e373101 20
eunkyoungkim 0:6e799e373101 21 }
eunkyoungkim 0:6e799e373101 22
eunkyoungkim 0:6e799e373101 23 void send_data(uint8_t data){
eunkyoungkim 0:6e799e373101 24 char c[2] = {0x40,data};
eunkyoungkim 0:6e799e373101 25 i2c.write(addr,c,2,1);
eunkyoungkim 0:6e799e373101 26
eunkyoungkim 0:6e799e373101 27 }
eunkyoungkim 0:6e799e373101 28
eunkyoungkim 0:6e799e373101 29 void init(void)
eunkyoungkim 0:6e799e373101 30 {
eunkyoungkim 0:6e799e373101 31 wait_ms(5); // TBD
eunkyoungkim 0:6e799e373101 32
eunkyoungkim 0:6e799e373101 33 send_cmd(0xae); // display off
eunkyoungkim 0:6e799e373101 34 send_cmd(0xd5); // display divide ratio/osc. freq. ratio
eunkyoungkim 0:6e799e373101 35 send_cmd(0x80);
eunkyoungkim 0:6e799e373101 36 send_cmd(0xa8); // multiplex ation mode: 63
eunkyoungkim 0:6e799e373101 37 send_cmd(0x3f);
eunkyoungkim 0:6e799e373101 38 send_cmd(0xd3); // set display offset
eunkyoungkim 0:6e799e373101 39 send_cmd(0x00);
eunkyoungkim 0:6e799e373101 40 send_cmd(0x40); // set display start line
eunkyoungkim 0:6e799e373101 41 send_cmd(0x8d); // set display offset
eunkyoungkim 0:6e799e373101 42 send_cmd(0x14);
eunkyoungkim 0:6e799e373101 43 send_cmd(0xa1); // segment remap
eunkyoungkim 0:6e799e373101 44 send_cmd(0xc8); // set COM output scan direction
eunkyoungkim 0:6e799e373101 45 send_cmd(0xda); // common pads hardware: alternative
eunkyoungkim 0:6e799e373101 46 send_cmd(0x12);
eunkyoungkim 0:6e799e373101 47 send_cmd(0x81); // contrast control
eunkyoungkim 0:6e799e373101 48 send_cmd(0xcf);
eunkyoungkim 0:6e799e373101 49 send_cmd(0xd9); // set pre-charge period
eunkyoungkim 0:6e799e373101 50 send_cmd(0xf1);
eunkyoungkim 0:6e799e373101 51 send_cmd(0xdb); // VCOM deselect level mode
eunkyoungkim 0:6e799e373101 52 send_cmd(0x40); // set vcomh = 0.83 * VCC
eunkyoungkim 0:6e799e373101 53 send_cmd(0xa4); // set entire display on/off
eunkyoungkim 0:6e799e373101 54 send_cmd(0xa6); // set normal display
eunkyoungkim 0:6e799e373101 55 send_cmd(0xaf); // set display on
eunkyoungkim 0:6e799e373101 56 }
eunkyoungkim 0:6e799e373101 57
eunkyoungkim 0:6e799e373101 58 // set position (x, 8*y)
eunkyoungkim 0:6e799e373101 59 void locate(int x, int y){
eunkyoungkim 0:6e799e373101 60 send_cmd(0xb0+y);
eunkyoungkim 0:6e799e373101 61 send_cmd(((x&0xf0)>>4)|0x10);
eunkyoungkim 0:6e799e373101 62 send_cmd((x&0x0f)|0x01);
eunkyoungkim 0:6e799e373101 63 }
eunkyoungkim 0:6e799e373101 64
eunkyoungkim 0:6e799e373101 65 void cls(void){
eunkyoungkim 0:6e799e373101 66 int x, y;
eunkyoungkim 0:6e799e373101 67 for(y = 0; y < 8; y++){
eunkyoungkim 0:6e799e373101 68 locate(0, y);
eunkyoungkim 0:6e799e373101 69 for(x = 0; x < 128; x++) send_data(0x00);
eunkyoungkim 0:6e799e373101 70 }
eunkyoungkim 0:6e799e373101 71 }
eunkyoungkim 0:6e799e373101 72
eunkyoungkim 0:6e799e373101 73
eunkyoungkim 0:6e799e373101 74
eunkyoungkim 0:6e799e373101 75 void OLED_ShowStr(unsigned char x, unsigned char y, char ch[], unsigned char TextSize)
eunkyoungkim 0:6e799e373101 76 {
eunkyoungkim 0:6e799e373101 77 unsigned char c = 0,i = 0,j = 0;
eunkyoungkim 0:6e799e373101 78 switch(TextSize)
eunkyoungkim 0:6e799e373101 79 {
eunkyoungkim 0:6e799e373101 80 case 1:
eunkyoungkim 0:6e799e373101 81 {
eunkyoungkim 0:6e799e373101 82 while(ch[j] != '\0')
eunkyoungkim 0:6e799e373101 83 {
eunkyoungkim 0:6e799e373101 84 c = ch[j] - 32;
eunkyoungkim 0:6e799e373101 85 if(x > 126)
eunkyoungkim 0:6e799e373101 86 {
eunkyoungkim 0:6e799e373101 87 x = 0;
eunkyoungkim 0:6e799e373101 88 y++;
eunkyoungkim 0:6e799e373101 89 }
eunkyoungkim 0:6e799e373101 90 locate(x,y);
eunkyoungkim 0:6e799e373101 91 for(i=0;i<6;i++)
eunkyoungkim 0:6e799e373101 92 send_data(F6x8[c][i]);
eunkyoungkim 0:6e799e373101 93 x += 6;
eunkyoungkim 0:6e799e373101 94 j++;
eunkyoungkim 0:6e799e373101 95 }
eunkyoungkim 0:6e799e373101 96 }break;
eunkyoungkim 0:6e799e373101 97 case 2:
eunkyoungkim 0:6e799e373101 98 {
eunkyoungkim 0:6e799e373101 99 while(ch[j] != '\0')
eunkyoungkim 0:6e799e373101 100 {
eunkyoungkim 0:6e799e373101 101 c = ch[j] - 32;
eunkyoungkim 0:6e799e373101 102 if(x > 120)
eunkyoungkim 0:6e799e373101 103 {
eunkyoungkim 0:6e799e373101 104 x = 0;
eunkyoungkim 0:6e799e373101 105 y++;
eunkyoungkim 0:6e799e373101 106 }
eunkyoungkim 0:6e799e373101 107 locate(x,y);
eunkyoungkim 0:6e799e373101 108 for(i=0;i<8;i++)
eunkyoungkim 0:6e799e373101 109 send_data(F8X16[c*16+i]);
eunkyoungkim 0:6e799e373101 110 locate(x,y+1);
eunkyoungkim 0:6e799e373101 111 for(i=0;i<8;i++)
eunkyoungkim 0:6e799e373101 112 send_data(F8X16[c*16+i+8]);
eunkyoungkim 0:6e799e373101 113 x += 8;
eunkyoungkim 0:6e799e373101 114 j++;
eunkyoungkim 0:6e799e373101 115 }
eunkyoungkim 0:6e799e373101 116 }break;
eunkyoungkim 0:6e799e373101 117 }
eunkyoungkim 0:6e799e373101 118 }
eunkyoungkim 0:6e799e373101 119 void OLED_DrawBMP(unsigned char x0,
eunkyoungkim 0:6e799e373101 120 unsigned char y0,unsigned char x1,
eunkyoungkim 0:6e799e373101 121 unsigned char y1,unsigned char BMP[])
eunkyoungkim 0:6e799e373101 122 {
eunkyoungkim 0:6e799e373101 123 unsigned int j=0;
eunkyoungkim 0:6e799e373101 124 unsigned char x,y;
eunkyoungkim 0:6e799e373101 125
eunkyoungkim 0:6e799e373101 126 if(y1%8==0)
eunkyoungkim 0:6e799e373101 127 y = y1/8;
eunkyoungkim 0:6e799e373101 128 else
eunkyoungkim 0:6e799e373101 129 y = y1/8 + 1;
eunkyoungkim 0:6e799e373101 130 for(y=y0;y<y1;y++)
eunkyoungkim 0:6e799e373101 131 {
eunkyoungkim 0:6e799e373101 132 locate(x0,y);
eunkyoungkim 0:6e799e373101 133 for(x=x0;x<x1;x++)
eunkyoungkim 0:6e799e373101 134 {
eunkyoungkim 0:6e799e373101 135 send_data(BMP[j++]);
eunkyoungkim 0:6e799e373101 136 }
eunkyoungkim 0:6e799e373101 137 }
eunkyoungkim 0:6e799e373101 138 }
eunkyoungkim 0:6e799e373101 139 //==========================================================//
eunkyoungkim 0:6e799e373101 140 // Prints a display big number (96 bytes) in coordinates X Y,
eunkyoungkim 0:6e799e373101 141 // being multiples of 8. This means we have 16 COLS (0-15)
eunkyoungkim 0:6e799e373101 142 // and 8 ROWS (0-7).
eunkyoungkim 0:6e799e373101 143 void printBigNumber(unsigned char s, int x, int y)
eunkyoungkim 0:6e799e373101 144 {
eunkyoungkim 0:6e799e373101 145 locate(x,y);
eunkyoungkim 0:6e799e373101 146 int salto=0;
eunkyoungkim 0:6e799e373101 147 for(int i=0; i<96; i++) {
eunkyoungkim 0:6e799e373101 148 if(s == ' ') {
eunkyoungkim 0:6e799e373101 149 send_data(0);
eunkyoungkim 0:6e799e373101 150 } else
eunkyoungkim 0:6e799e373101 151 send_data(bigNumbers[s-0x30][i]);
eunkyoungkim 0:6e799e373101 152
eunkyoungkim 0:6e799e373101 153 if(salto == 23) {
eunkyoungkim 0:6e799e373101 154 salto = 0;
eunkyoungkim 0:6e799e373101 155 x++;
eunkyoungkim 0:6e799e373101 156 locate(x,y);
eunkyoungkim 0:6e799e373101 157 } else {
eunkyoungkim 0:6e799e373101 158 salto++;
eunkyoungkim 0:6e799e373101 159 }
eunkyoungkim 0:6e799e373101 160 }
eunkyoungkim 0:6e799e373101 161 }
eunkyoungkim 0:6e799e373101 162 void printBigTime(char *s)
eunkyoungkim 0:6e799e373101 163 {
eunkyoungkim 0:6e799e373101 164
eunkyoungkim 0:6e799e373101 165 int y=0;
eunkyoungkim 0:6e799e373101 166 int lon = strlen(s);
eunkyoungkim 0:6e799e373101 167 if(lon == 6) {
eunkyoungkim 0:6e799e373101 168 y = 0;
eunkyoungkim 0:6e799e373101 169 } else if (lon == 5) {
eunkyoungkim 0:6e799e373101 170 y = 3;
eunkyoungkim 0:6e799e373101 171 } else if (lon == 4) {
eunkyoungkim 0:6e799e373101 172 y = 6;
eunkyoungkim 0:6e799e373101 173 }
eunkyoungkim 0:6e799e373101 174 else if(lon == 3) {
eunkyoungkim 0:6e799e373101 175 y = 9;
eunkyoungkim 0:6e799e373101 176 } else if (lon == 2) {
eunkyoungkim 0:6e799e373101 177 y = 12;
eunkyoungkim 0:6e799e373101 178 } else if (lon == 1) {
eunkyoungkim 0:6e799e373101 179 y = 15;
eunkyoungkim 0:6e799e373101 180 }
eunkyoungkim 0:6e799e373101 181
eunkyoungkim 0:6e799e373101 182 int x = 2;
eunkyoungkim 0:6e799e373101 183 while(*s) {
eunkyoungkim 0:6e799e373101 184 printBigNumber(*s, x, y);
eunkyoungkim 0:6e799e373101 185
eunkyoungkim 0:6e799e373101 186 y+=3;
eunkyoungkim 0:6e799e373101 187 x=2;
eunkyoungkim 0:6e799e373101 188 locate(x,y);
eunkyoungkim 0:6e799e373101 189 *s++;
eunkyoungkim 0:6e799e373101 190 }
eunkyoungkim 0:6e799e373101 191 }
eunkyoungkim 0:6e799e373101 192 void LED_P23x32Str(unsigned char x, unsigned char y, char ch[])
eunkyoungkim 0:6e799e373101 193 {
eunkyoungkim 0:6e799e373101 194 unsigned char c = 0, i = 0, j = 0, k = 0;
eunkyoungkim 0:6e799e373101 195 while (ch[j] != '\0')
eunkyoungkim 0:6e799e373101 196 {
eunkyoungkim 0:6e799e373101 197 c = ch[j] - '0';
eunkyoungkim 0:6e799e373101 198 if (x > 120) {
eunkyoungkim 0:6e799e373101 199 x = 0;
eunkyoungkim 0:6e799e373101 200 y++;
eunkyoungkim 0:6e799e373101 201 }
eunkyoungkim 0:6e799e373101 202
eunkyoungkim 0:6e799e373101 203 for (k = 0; k < 4; k++) {
eunkyoungkim 0:6e799e373101 204 locate(x, y + k);
eunkyoungkim 0:6e799e373101 205 for (i = 0; i < 23; i++) {
eunkyoungkim 0:6e799e373101 206 send_data(F23x32[c * 23 * 4 + k * 23 + i]);
eunkyoungkim 0:6e799e373101 207 }
eunkyoungkim 0:6e799e373101 208 }
eunkyoungkim 0:6e799e373101 209 x += 25;
eunkyoungkim 0:6e799e373101 210 j++;
eunkyoungkim 0:6e799e373101 211 }
eunkyoungkim 0:6e799e373101 212 }
eunkyoungkim 0:6e799e373101 213
eunkyoungkim 0:6e799e373101 214