Geolocation and NTP Example for WizFi250 on WIZwiki-W7500

Dependencies:   Adafruit_GFX HTTPClient NTPClient WizFi250Interface mbed

System Diagram

I want to make a watch, that can check my location and time. So I decide to make this watch using Wi-Fi module(WizFi250) and Cortex-M0 MCU(WIZwiki-W7500). For getting geolocation of this watch, I used ip-api.com which geolocation server and I used NTP server for getting current time. This picture is system diagram of my project.

https://c1.staticflickr.com/1/535/18550462294_5055005f04_c.jpg

Materials

WIZwiki-W7500 ( MCU )

https://c4.staticflickr.com/4/3925/19135560186_bd20acc860_z.jpg

WizFi250-EVB ( Wi-Fi Module )

https://c1.staticflickr.com/1/331/18975741359_366b5494b7_n.jpg

Sensor Shield

https://c4.staticflickr.com/4/3692/18974815038_9fda4569f1_n.jpg

SSD1306 OLED

Refer to this URL.

https://developer.mbed.org/components/Adafruit-OLED-128x32/

Hardware Configuration

UART0 RX/TX/CTS/RTS pins of WIZwiki-W7500 board are used to control WizFi250 which Wi-Fi module and It use I2C SDA/SCL pins for using SSD1306 OLED.

https://c4.staticflickr.com/4/3913/19010999888_3b30c685dd_c.jpg

/media/uploads/kaizen/20150731_084716.png

Demo Video

For more detailed information, refer to this URL.

http://www.life4iot.com/2015/07/08/wizfi250-geolocation-and-ntp-example-on-wizwiki-w7500-of-mbed-platform/?lang=en

Committer:
kaizen
Date:
Thu Jun 25 05:20:13 2015 +0000
Revision:
0:bc0fe324d7e2
Child:
1:741b858c0b92
Geolocation_NTP Example for WizFi250 on WIZwiki-W7500

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kaizen 0:bc0fe324d7e2 1 #include "mbed.h"
kaizen 0:bc0fe324d7e2 2 #include "Adafruit_SSD1306.h"
kaizen 0:bc0fe324d7e2 3 #include "WizFi250Interface.h"
kaizen 0:bc0fe324d7e2 4 #include "NTPClient.h"
kaizen 0:bc0fe324d7e2 5 #include "HTTPClient.h"
kaizen 0:bc0fe324d7e2 6
kaizen 0:bc0fe324d7e2 7
kaizen 0:bc0fe324d7e2 8 #define SECURE WizFi250::SEC_AUTO
kaizen 0:bc0fe324d7e2 9 #define SSID "wizohp"
kaizen 0:bc0fe324d7e2 10 #define PASS "wiznet218"
kaizen 0:bc0fe324d7e2 11
kaizen 0:bc0fe324d7e2 12
kaizen 0:bc0fe324d7e2 13 #if defined(TARGET_WIZwiki_W7500)
kaizen 0:bc0fe324d7e2 14 #define SDA PA_10
kaizen 0:bc0fe324d7e2 15 #define SCL PA_9
kaizen 0:bc0fe324d7e2 16 WizFi250Interface wizfi250(D1,D0,D7,D8,PA_12,NC,115200);
kaizen 0:bc0fe324d7e2 17
kaizen 0:bc0fe324d7e2 18 #endif
kaizen 0:bc0fe324d7e2 19
kaizen 0:bc0fe324d7e2 20
kaizen 0:bc0fe324d7e2 21 // an SPI sub-class that provides a constructed default
kaizen 0:bc0fe324d7e2 22 class I2CPreInit : public I2C
kaizen 0:bc0fe324d7e2 23 {
kaizen 0:bc0fe324d7e2 24 public:
kaizen 0:bc0fe324d7e2 25 I2CPreInit(PinName sda, PinName scl) : I2C(sda, scl)
kaizen 0:bc0fe324d7e2 26 {
kaizen 0:bc0fe324d7e2 27 frequency(100000);
kaizen 0:bc0fe324d7e2 28 start();
kaizen 0:bc0fe324d7e2 29 };
kaizen 0:bc0fe324d7e2 30 };
kaizen 0:bc0fe324d7e2 31
kaizen 0:bc0fe324d7e2 32 I2CPreInit gI2C(SDA,SCL);
kaizen 0:bc0fe324d7e2 33 Adafruit_SSD1306_I2c gOled(gI2C,NC,0x78,64,128);
kaizen 0:bc0fe324d7e2 34 NTPClient ntpClient;
kaizen 0:bc0fe324d7e2 35 HTTPClient httpClient;
kaizen 0:bc0fe324d7e2 36 void parse(char buffer[], int *j, char *string); //FUNCTION TO PARSE HTTP GET DATA
kaizen 0:bc0fe324d7e2 37 char httpGetData[200]; //BUFFER TO HOLD DATA FROM HTTP GET REQUEST
kaizen 0:bc0fe324d7e2 38
kaizen 0:bc0fe324d7e2 39
kaizen 0:bc0fe324d7e2 40 int main()
kaizen 0:bc0fe324d7e2 41 {
kaizen 0:bc0fe324d7e2 42 S_UART_Init(115200);
kaizen 0:bc0fe324d7e2 43
kaizen 0:bc0fe324d7e2 44
kaizen 0:bc0fe324d7e2 45 time_t ctTime; //system time structure
kaizen 0:bc0fe324d7e2 46 char success[10]={0}; //success first
kaizen 0:bc0fe324d7e2 47 char countryFull[20]={0}; //Full Country Name
kaizen 0:bc0fe324d7e2 48 char countryAbrv[5]={0}; //Abbreviated Country Name or country Code
kaizen 0:bc0fe324d7e2 49 char stateAbrv[5]={0}; //Abbreviated State or region code
kaizen 0:bc0fe324d7e2 50 char stateFull[15]={0}; //Full State Name
kaizen 0:bc0fe324d7e2 51 char city[15]={0}; //City Name
kaizen 0:bc0fe324d7e2 52 char zip[6]={0}; //ZIP CODE
kaizen 0:bc0fe324d7e2 53 char latitude[10]={0}; //latitude
kaizen 0:bc0fe324d7e2 54 char longitude[10]={0}; //longitude
kaizen 0:bc0fe324d7e2 55 char timeZone[30]={0}; //timeZone
kaizen 0:bc0fe324d7e2 56 int j=0, returnCode;
kaizen 0:bc0fe324d7e2 57
kaizen 0:bc0fe324d7e2 58 wizfi250.init();
kaizen 0:bc0fe324d7e2 59 returnCode = wizfi250.connect(SECURE, SSID, PASS);
kaizen 0:bc0fe324d7e2 60
kaizen 0:bc0fe324d7e2 61 if ( returnCode == 0 )
kaizen 0:bc0fe324d7e2 62 {
kaizen 0:bc0fe324d7e2 63 printf(" - WiFi Ready\r\n");
kaizen 0:bc0fe324d7e2 64 printf("IP Address is %s\r\n", wizfi250.getIPAddress());
kaizen 0:bc0fe324d7e2 65 }
kaizen 0:bc0fe324d7e2 66 else
kaizen 0:bc0fe324d7e2 67 {
kaizen 0:bc0fe324d7e2 68 printf(" - Could not initialize WiFi - ending\r\n");
kaizen 0:bc0fe324d7e2 69 return 0;
kaizen 0:bc0fe324d7e2 70 }
kaizen 0:bc0fe324d7e2 71
kaizen 0:bc0fe324d7e2 72 //HANDLES THE HTTP GET REQUEST THE WAY THE FUNCTION IS CALLED HERE IS THE FOLLOWING
kaizen 0:bc0fe324d7e2 73 // get(DOMAIN_NAME,BUFFER,TIMEOUT_VAL)
kaizen 0:bc0fe324d7e2 74 //DOMAIN_NAME= domain name that get request is sent to
kaizen 0:bc0fe324d7e2 75 //BUFFER= buffer to store data returned from the server
kaizen 0:bc0fe324d7e2 76 //TIMEOUT_VAL= Time before the request times out
kaizen 0:bc0fe324d7e2 77 HTTPResult r = httpClient.get("http://ip-api.com/csv",httpGetData,128); //GET GEOLOCATION DATA (CSV)
kaizen 0:bc0fe324d7e2 78
kaizen 0:bc0fe324d7e2 79 if (r==HTTP_OK) { //IF THE DATA WAS RECIEVED
kaizen 0:bc0fe324d7e2 80 j=0;
kaizen 0:bc0fe324d7e2 81 //parse and display each of the API's location information strings on the LCD
kaizen 0:bc0fe324d7e2 82 parse(httpGetData, &j, success);
kaizen 0:bc0fe324d7e2 83 parse(httpGetData,&j,countryFull);
kaizen 0:bc0fe324d7e2 84 parse(httpGetData,&j,countryAbrv);
kaizen 0:bc0fe324d7e2 85 parse(httpGetData,&j,stateAbrv);
kaizen 0:bc0fe324d7e2 86 parse(httpGetData,&j,stateFull);
kaizen 0:bc0fe324d7e2 87 parse(httpGetData,&j,city);
kaizen 0:bc0fe324d7e2 88 parse(httpGetData,&j,zip);
kaizen 0:bc0fe324d7e2 89 parse(httpGetData,&j,latitude);
kaizen 0:bc0fe324d7e2 90 parse(httpGetData,&j,longitude);
kaizen 0:bc0fe324d7e2 91 parse(httpGetData,&j,timeZone);
kaizen 0:bc0fe324d7e2 92 printf("GEOLOCATION DATA RECIEVED\r\n");
kaizen 0:bc0fe324d7e2 93 printf("success : %s, countryFull : %s, countryAbrv : %s, stateAbrv : %s\r\n",success, countryFull, countryAbrv, stateAbrv);
kaizen 0:bc0fe324d7e2 94 printf("stateFull : %s, city : %s, zip : %s, latitude : %s\r\n",stateFull, city, zip, latitude);
kaizen 0:bc0fe324d7e2 95 printf("longitude : %s, timeZone : %s\r\n",longitude, timeZone);
kaizen 0:bc0fe324d7e2 96 }
kaizen 0:bc0fe324d7e2 97 else { //HTTP GET REQUEST ERRORED
kaizen 0:bc0fe324d7e2 98 printf("HTTP Error %d\r\n", r);
kaizen 0:bc0fe324d7e2 99 return -1;
kaizen 0:bc0fe324d7e2 100 }
kaizen 0:bc0fe324d7e2 101 printf("Reading Time...\r\n");
kaizen 0:bc0fe324d7e2 102 char* domainName="kr.pool.ntp.org"; //SET TO DOMAIN NAME OF SERVER GETTING TIME FROM
kaizen 0:bc0fe324d7e2 103 //GETS THE TIME FROM THE SERVER
kaizen 0:bc0fe324d7e2 104 //setTime(DOMAIN_NAME,PORT_NUMBER,TIME_OUT)
kaizen 0:bc0fe324d7e2 105 //DOMAIN_NAME= domain name
kaizen 0:bc0fe324d7e2 106 //PORT NUMBER=port number (123 for NTP)
kaizen 0:bc0fe324d7e2 107 //TIME_OUT= timeout value for request
kaizen 0:bc0fe324d7e2 108 ntpClient.setTime(domainName,123,0x00005000);
kaizen 0:bc0fe324d7e2 109 printf("Time Set\r\n");
kaizen 0:bc0fe324d7e2 110 //Delay for human time to read LCD display
kaizen 0:bc0fe324d7e2 111 wait(3.0);
kaizen 0:bc0fe324d7e2 112
kaizen 0:bc0fe324d7e2 113 char buffer[80]; //BUFFER TO HOLD FORMATTED TIME DATA
kaizen 0:bc0fe324d7e2 114 printf("%s, %s %s\r\n",city,stateAbrv,zip); //PRINT CITY STATE AND ZIP INFORMATION
kaizen 0:bc0fe324d7e2 115 printf("%s\r\nLAT:%s\r\nLONG:%s\r\n",countryAbrv,latitude,longitude); //PRINT COUNTRY and LATITUDE AND LONGITUDE
kaizen 0:bc0fe324d7e2 116 printf("Timezone:\r\n%s\r\n",timeZone); //PRINT TIMEZONE
kaizen 0:bc0fe324d7e2 117
kaizen 0:bc0fe324d7e2 118 wizfi250.disconnect(); //DISCONNECT FROM THE NETWORK
kaizen 0:bc0fe324d7e2 119 while (1) {
kaizen 0:bc0fe324d7e2 120 //ctTime = time(NULL)-(3600*4); //TIME with offset for eastern time US
kaizen 0:bc0fe324d7e2 121 ctTime = time(NULL)+(3600*9); //TIME with offset for eastern time KR
kaizen 0:bc0fe324d7e2 122 //FORMAT TIME FOR DISPLAY AND STORE FORMATTED RESULT IN BUFFER
kaizen 0:bc0fe324d7e2 123 strftime(buffer,80,"%a %b %d\r\n%T %p %z\r\n %Z\r\n",localtime(&ctTime));
kaizen 0:bc0fe324d7e2 124 printf("Univ Time Clock\r\n%s\r\n", buffer);
kaizen 0:bc0fe324d7e2 125 wait(1);
kaizen 0:bc0fe324d7e2 126 }
kaizen 0:bc0fe324d7e2 127 }
kaizen 0:bc0fe324d7e2 128
kaizen 0:bc0fe324d7e2 129 //SET FOR CSV FORMAT: NEEDS TO BE EDITED IF DIFFERENT FORMAT
kaizen 0:bc0fe324d7e2 130 void parse(char buffer[], int *j, char *string) {
kaizen 0:bc0fe324d7e2 131 //extracts next location string data item from buffer
kaizen 0:bc0fe324d7e2 132 int i=0;
kaizen 0:bc0fe324d7e2 133 for (i=0; i<=strlen(buffer); i++) { //TOTAL SIZE OF RETURNED DATA
kaizen 0:bc0fe324d7e2 134 if ((buffer[*j+i] == ',')||(buffer[*j+i] == '\0' )) { //IF comma or end of string
kaizen 0:bc0fe324d7e2 135 //comma is the string field delimiter
kaizen 0:bc0fe324d7e2 136 string[i]=0; //SETS END OF SRTRING TO 0
kaizen 0:bc0fe324d7e2 137 *j=*j+i+1; //UPDATES to 1 after comma seperated value
kaizen 0:bc0fe324d7e2 138 break;
kaizen 0:bc0fe324d7e2 139 } else string[i]=buffer[*j+i]; //Keep adding to the string
kaizen 0:bc0fe324d7e2 140 }
kaizen 0:bc0fe324d7e2 141 }