4180 Lab 4 Project

Dependencies:   4DGL-uLCD-SE DebounceIn EthernetInterface HTTPClient Motor NTPClient Servo mbed-rtos mbed

Fork of 4180_BLE_Eth by Ari Bleemer

Committer:
vceyssens3
Date:
Thu Mar 16 16:01:29 2017 +0000
Revision:
1:4ea41c8f9bfb
Parent:
0:9744f456fe92
Lab 4 ECE 4180 Project;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ableemer 0:9744f456fe92 1 #include "mbed.h"
ableemer 0:9744f456fe92 2 #include "NTPClient.h"
ableemer 0:9744f456fe92 3 #include "uLCD_4DGL.h"
ableemer 0:9744f456fe92 4 #include "EthernetInterface.h"
ableemer 0:9744f456fe92 5 #include "HTTPClient.h"
ableemer 0:9744f456fe92 6 #include "Servo.h"
ableemer 0:9744f456fe92 7 #include "Motor.h"
ableemer 0:9744f456fe92 8
vceyssens3 1:4ea41c8f9bfb 9
vceyssens3 1:4ea41c8f9bfb 10
ableemer 0:9744f456fe92 11 Serial blue(p13,p14);
ableemer 0:9744f456fe92 12 PwmOut ledRGB(p23);
ableemer 0:9744f456fe92 13 Servo myservo(p22);
ableemer 0:9744f456fe92 14 Motor m(p21, p17, p16); // pwm, fwd, rev
vceyssens3 1:4ea41c8f9bfb 15 //InterruptIn button(p28);
ableemer 0:9744f456fe92 16
ableemer 0:9744f456fe92 17 //SET UP ETHERNET & ULCD
ableemer 0:9744f456fe92 18 EthernetInterface eth;
ableemer 0:9744f456fe92 19 uLCD_4DGL uLCD(p9,p10,p11); // serial tx, serial rx, reset pin;
ableemer 0:9744f456fe92 20 NTPClient ntpClient;
ableemer 0:9744f456fe92 21 HTTPClient httpClient;
ableemer 0:9744f456fe92 22 void parse(char buffer[], int *j, char *string); //FUNCTION TO PARSE HTTP GET DATA
ableemer 0:9744f456fe92 23 char httpGetData[200]; //BUFFER TO HOLD DATA FROM HTTP GET REQUEST
ableemer 0:9744f456fe92 24
ableemer 0:9744f456fe92 25 BusOut myled(LED1,LED2,LED3,LED4);
vceyssens3 1:4ea41c8f9bfb 26
vceyssens3 1:4ea41c8f9bfb 27
vceyssens3 1:4ea41c8f9bfb 28 //
vceyssens3 1:4ea41c8f9bfb 29 //void flip(){
vceyssens3 1:4ea41c8f9bfb 30 // setTime = 1+setTime;
vceyssens3 1:4ea41c8f9bfb 31 // if (setTime > 24) {
vceyssens3 1:4ea41c8f9bfb 32 // setTime = 00;
vceyssens3 1:4ea41c8f9bfb 33 // }
vceyssens3 1:4ea41c8f9bfb 34 // }
vceyssens3 1:4ea41c8f9bfb 35
vceyssens3 1:4ea41c8f9bfb 36
ableemer 0:9744f456fe92 37 int main() {
vceyssens3 1:4ea41c8f9bfb 38 volatile int lowtime = 0;
vceyssens3 1:4ea41c8f9bfb 39 volatile int setTime = 0;
vceyssens3 1:4ea41c8f9bfb 40 // button.mode(PullUp);
ableemer 0:9744f456fe92 41 char bnum = 0;
ableemer 0:9744f456fe92 42 char bhit=0;
ableemer 0:9744f456fe92 43 float brightness = 0.5f;
ableemer 0:9744f456fe92 44 int hour, prevHour;
vceyssens3 1:4ea41c8f9bfb 45
vceyssens3 1:4ea41c8f9bfb 46 // button.rise(&flip);
ableemer 0:9744f456fe92 47 ledRGB = brightness;
ableemer 0:9744f456fe92 48 time_t ctTime; //system time structure
ableemer 0:9744f456fe92 49 uLCD.baudrate(2000000); //Crank up Baudrate
ableemer 0:9744f456fe92 50 uLCD.cls(); //Clear uLCD screen
vceyssens3 1:4ea41c8f9bfb 51 uLCD.color(BLACK);
ableemer 0:9744f456fe92 52 uLCD.background_color(WHITE); //SET BACKGROUND COLOR TO WHITE
ableemer 0:9744f456fe92 53 //SETS THE BACKGROUND COLOR OF TEXT TO WHITE ON THE ULCD
ableemer 0:9744f456fe92 54 uLCD.textbackground_color(WHITE);
ableemer 0:9744f456fe92 55 uLCD.locate(0,0); //Start printing on col0, row0
ableemer 0:9744f456fe92 56 uLCD.printf("Getting IP Address\n"); //Print to uLCD
ableemer 0:9744f456fe92 57 myled[1] = 1;
ableemer 0:9744f456fe92 58 eth.init(); //USE DHCP to get local IP address
ableemer 0:9744f456fe92 59 eth.connect(); //Connect to the network
ableemer 0:9744f456fe92 60 uLCD.printf("IP ADDRESS is %s\n",eth.getMACAddress()); //Get Ethernet Address and display It on ULCD
ableemer 0:9744f456fe92 61 wait(3.0);
ableemer 0:9744f456fe92 62 char success[10]={0}; //success first
ableemer 0:9744f456fe92 63 char countryFull[20]={0}; //Full Country Name
ableemer 0:9744f456fe92 64 char countryAbrv[5]={0}; //Abbreviated Country Name or country Code
ableemer 0:9744f456fe92 65 char stateAbrv[5]={0}; //Abbreviated State or region code
ableemer 0:9744f456fe92 66 char stateFull[15]={0}; //Full State Name
ableemer 0:9744f456fe92 67 char city[15]={0}; //City Name
ableemer 0:9744f456fe92 68 char zip[6]={0}; //ZIP CODE
ableemer 0:9744f456fe92 69 char latitude[10]={0}; //latitude
ableemer 0:9744f456fe92 70 char longitude[10]={0}; //longitude
ableemer 0:9744f456fe92 71 char timeZone[30]={0}; //timeZone
ableemer 0:9744f456fe92 72 int j=0;
ableemer 0:9744f456fe92 73 uLCD.printf("Getting Geolocation Data\n");
ableemer 0:9744f456fe92 74 //HANDLES THE HTTP GET REQUEST THE WAY THE FUNCTION IS CALLED HERE IS THE FOLLOWING
ableemer 0:9744f456fe92 75 // get(DOMAIN_NAME,BUFFER,TIMEOUT_VAL)
ableemer 0:9744f456fe92 76 //DOMAIN_NAME= domain name that get request is sent to
ableemer 0:9744f456fe92 77 //BUFFER= buffer to store data returned from the server
ableemer 0:9744f456fe92 78 //TIMEOUT_VAL= Time before the request times out
ableemer 0:9744f456fe92 79 HTTPResult r = httpClient.get("http://ip-api.com/csv",httpGetData,128); //GET GEOLOCATION DATA (CSV)
ableemer 0:9744f456fe92 80
ableemer 0:9744f456fe92 81 if (r==HTTP_OK) { //IF THE DATA WAS RECIEVED
ableemer 0:9744f456fe92 82 j=0;
ableemer 0:9744f456fe92 83 //parse and display each of the API's location information strings on the LCD
ableemer 0:9744f456fe92 84 parse(httpGetData, &j, success);
ableemer 0:9744f456fe92 85 parse(httpGetData,&j,countryFull);
ableemer 0:9744f456fe92 86 parse(httpGetData,&j,countryAbrv);
ableemer 0:9744f456fe92 87 parse(httpGetData,&j,stateAbrv);
ableemer 0:9744f456fe92 88 parse(httpGetData,&j,stateFull);
ableemer 0:9744f456fe92 89 parse(httpGetData,&j,city);
ableemer 0:9744f456fe92 90 parse(httpGetData,&j,zip);
ableemer 0:9744f456fe92 91 parse(httpGetData,&j,latitude);
ableemer 0:9744f456fe92 92 parse(httpGetData,&j,longitude);
ableemer 0:9744f456fe92 93 parse(httpGetData,&j,timeZone);
ableemer 0:9744f456fe92 94 uLCD.cls();
ableemer 0:9744f456fe92 95 uLCD.printf("GEOLOCATION DATA RECIEVED\n");
ableemer 0:9744f456fe92 96 }
ableemer 0:9744f456fe92 97 else { //HTTP GET REQUEST ERRORED
ableemer 0:9744f456fe92 98 uLCD.cls();
ableemer 0:9744f456fe92 99 uLCD.printf("HTTP Error %d", r);
ableemer 0:9744f456fe92 100 return -1;
ableemer 0:9744f456fe92 101 }
ableemer 0:9744f456fe92 102 uLCD.printf("Reading Time...\n");
ableemer 0:9744f456fe92 103 char* domainName="us.pool.ntp.org"; //SET TO DOMAIN NAME OF SERVER GETTING TIME FROM
ableemer 0:9744f456fe92 104 //GETS THE TIME FROM THE SERVER
ableemer 0:9744f456fe92 105 //setTime(DOMAIN_NAME,PORT_NUMBER,TIME_OUT)
ableemer 0:9744f456fe92 106 //DOMAIN_NAME= domain name
ableemer 0:9744f456fe92 107 //PORT NUMBER=port number (123 for NTP)
ableemer 0:9744f456fe92 108 //TIME_OUT= timeout value for request
ableemer 0:9744f456fe92 109 ntpClient.setTime(domainName,123,0x00005000);
ableemer 0:9744f456fe92 110 uLCD.printf("Time Set\n");
ableemer 0:9744f456fe92 111 //Delay for human time to read LCD display
ableemer 0:9744f456fe92 112 wait(3.0);
ableemer 0:9744f456fe92 113 uLCD.cls();
ableemer 0:9744f456fe92 114 //SETS THE BACKGROUND COLOR OF TEXT TO WHITE ON THE ULCD
ableemer 0:9744f456fe92 115 uLCD.textbackground_color(WHITE);
ableemer 0:9744f456fe92 116 char buffer[80]; //BUFFER TO HOLD FORMATTED TIME DATA
ableemer 0:9744f456fe92 117 uLCD.color(BLUE);//SET TEXT COLOR TO BLUE
ableemer 0:9744f456fe92 118 uLCD.locate(0,8);
vceyssens3 1:4ea41c8f9bfb 119 uLCD.printf("\n\n\n\n\n\n%s, %s %s\n",city,stateAbrv,zip); //PRINT CITY STATE AND ZIP INFORMATION
vceyssens3 1:4ea41c8f9bfb 120 // uLCD.printf("\nLAT:%s\nLONG:%s\n",latitude,longitude); //PRINT COUNTRY and LATITUDE AND LONGITUDE
vceyssens3 1:4ea41c8f9bfb 121 // uLCD.printf("Timezone:\n%s",timeZone); //PRINT TIMEZONE
ableemer 0:9744f456fe92 122 uLCD.color(RED);
ableemer 0:9744f456fe92 123 eth.disconnect(); //DISCONNECT FROM THE NETWORK
ableemer 0:9744f456fe92 124 uLCD.text_height(2); //2x Text Height
ableemer 0:9744f456fe92 125 while (1) {
ableemer 0:9744f456fe92 126 // loop and periodically update the LCD's time display
ableemer 0:9744f456fe92 127 uLCD.locate(0,0);
ableemer 0:9744f456fe92 128 ctTime = time(NULL)-(3600*4); //TIME with offset for eastern time US
ableemer 0:9744f456fe92 129 //FORMAT TIME FOR DISPLAY AND STORE FORMATTED RESULT IN BUFFER
ableemer 0:9744f456fe92 130 strftime(buffer,80,"%a %b %d\n%T %p %z\n %Z\n",localtime(&ctTime));
ableemer 0:9744f456fe92 131 hour = (*(localtime(&ctTime))).tm_hour;
vceyssens3 1:4ea41c8f9bfb 132 if(hour!=prevHour && hour == setTime){
ableemer 0:9744f456fe92 133 m.speed(-0.8f);
vceyssens3 1:4ea41c8f9bfb 134 wait(5);
ableemer 0:9744f456fe92 135 m.speed(0.0f);
vceyssens3 1:4ea41c8f9bfb 136 prevHour = hour;
ableemer 0:9744f456fe92 137 }
vceyssens3 1:4ea41c8f9bfb 138 else if(hour!=prevHour && hour == lowtime){
ableemer 0:9744f456fe92 139 m.speed(0.8f);
vceyssens3 1:4ea41c8f9bfb 140 wait(5);
ableemer 0:9744f456fe92 141 m.speed(0.0f);
vceyssens3 1:4ea41c8f9bfb 142 prevHour = hour;
ableemer 0:9744f456fe92 143 }
vceyssens3 1:4ea41c8f9bfb 144 if(hour == prevHour +1){
vceyssens3 1:4ea41c8f9bfb 145 prevHour = setTime + 1;
vceyssens3 1:4ea41c8f9bfb 146 }
vceyssens3 1:4ea41c8f9bfb 147
ableemer 0:9744f456fe92 148 uLCD.printf("Univ Time Clock\n%s", buffer);
vceyssens3 1:4ea41c8f9bfb 149 // uLCD.text_height(0.5);
vceyssens3 1:4ea41c8f9bfb 150 uLCD.printf("Night Time: %02i\n", setTime);
vceyssens3 1:4ea41c8f9bfb 151 uLCD.printf("Morning Time: %02i", lowtime);
ableemer 0:9744f456fe92 152 if(blue.readable()){
ableemer 0:9744f456fe92 153 if (blue.getc()=='!') {
ableemer 0:9744f456fe92 154 if (blue.getc()=='B') { //button data packet
ableemer 0:9744f456fe92 155 bnum = blue.getc(); //button number
ableemer 0:9744f456fe92 156 bhit = blue.getc(); //1=hit, 0=release
ableemer 0:9744f456fe92 157 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
ableemer 0:9744f456fe92 158 myled = bnum - '0'; //current button number will appear on LEDs
ableemer 0:9744f456fe92 159 switch (bnum) {
ableemer 0:9744f456fe92 160 case '1': //number button 1
ableemer 0:9744f456fe92 161 if (bhit=='1') {
vceyssens3 1:4ea41c8f9bfb 162 setTime = setTime + 1;
vceyssens3 1:4ea41c8f9bfb 163 if (setTime > 24) {
vceyssens3 1:4ea41c8f9bfb 164 setTime = 0;
vceyssens3 1:4ea41c8f9bfb 165 }
ableemer 0:9744f456fe92 166 } else {
ableemer 0:9744f456fe92 167 //add release code here
ableemer 0:9744f456fe92 168 }
ableemer 0:9744f456fe92 169 break;
ableemer 0:9744f456fe92 170 case '2': //number button 2
ableemer 0:9744f456fe92 171 if (bhit=='1') {
vceyssens3 1:4ea41c8f9bfb 172 setTime = setTime - 1;
vceyssens3 1:4ea41c8f9bfb 173 if (setTime < 0){
vceyssens3 1:4ea41c8f9bfb 174 setTime = 24;
vceyssens3 1:4ea41c8f9bfb 175 }
ableemer 0:9744f456fe92 176 } else {
ableemer 0:9744f456fe92 177 //add release code here
ableemer 0:9744f456fe92 178 }
ableemer 0:9744f456fe92 179 break;
ableemer 0:9744f456fe92 180 case '3': //number button 3
ableemer 0:9744f456fe92 181 if (bhit=='1') {
vceyssens3 1:4ea41c8f9bfb 182 lowtime = lowtime + 1;
vceyssens3 1:4ea41c8f9bfb 183 if (lowtime > 24){
vceyssens3 1:4ea41c8f9bfb 184 lowtime = 0;
vceyssens3 1:4ea41c8f9bfb 185 }
ableemer 0:9744f456fe92 186 } else {
ableemer 0:9744f456fe92 187 //add release code here
ableemer 0:9744f456fe92 188 }
ableemer 0:9744f456fe92 189 break;
ableemer 0:9744f456fe92 190 case '4': //number button 4
ableemer 0:9744f456fe92 191 if (bhit=='1') {
vceyssens3 1:4ea41c8f9bfb 192 lowtime = lowtime - 1;
vceyssens3 1:4ea41c8f9bfb 193 if (lowtime < 0){
vceyssens3 1:4ea41c8f9bfb 194 lowtime = 24;
vceyssens3 1:4ea41c8f9bfb 195 }
ableemer 0:9744f456fe92 196 } else {
ableemer 0:9744f456fe92 197 //add release code here
ableemer 0:9744f456fe92 198 }
ableemer 0:9744f456fe92 199 break;
ableemer 0:9744f456fe92 200 case '5': //button 5 up arrow
ableemer 0:9744f456fe92 201 if (bhit=='1') {
ableemer 0:9744f456fe92 202 m.speed(0.5f);
ableemer 0:9744f456fe92 203 } else {
ableemer 0:9744f456fe92 204 m.speed(0.0f);
ableemer 0:9744f456fe92 205 }
ableemer 0:9744f456fe92 206 break;
ableemer 0:9744f456fe92 207 case '6': //button 6 down arrow
ableemer 0:9744f456fe92 208 if (bhit=='1') {
ableemer 0:9744f456fe92 209 m.speed(-0.5f);
ableemer 0:9744f456fe92 210 } else {
ableemer 0:9744f456fe92 211 m.speed(0.0f);
ableemer 0:9744f456fe92 212 }
ableemer 0:9744f456fe92 213 break;
ableemer 0:9744f456fe92 214 case '7': //button 7 left arrow
ableemer 0:9744f456fe92 215 if (bhit=='1') {
ableemer 0:9744f456fe92 216 //add hit code here
ableemer 0:9744f456fe92 217 } else {
ableemer 0:9744f456fe92 218 brightness = brightness - 0.1f;
ableemer 0:9744f456fe92 219 ledRGB = brightness;
ableemer 0:9744f456fe92 220 }
ableemer 0:9744f456fe92 221 break;
ableemer 0:9744f456fe92 222 case '8': //button 8 right arrow
ableemer 0:9744f456fe92 223 if (bhit=='1') {
ableemer 0:9744f456fe92 224 //add hit code here
ableemer 0:9744f456fe92 225 } else {
ableemer 0:9744f456fe92 226 brightness = brightness + 0.1f;
ableemer 0:9744f456fe92 227 ledRGB = brightness;
ableemer 0:9744f456fe92 228 }
ableemer 0:9744f456fe92 229 break;
ableemer 0:9744f456fe92 230 default:
ableemer 0:9744f456fe92 231 break;
ableemer 0:9744f456fe92 232 }
ableemer 0:9744f456fe92 233 }
ableemer 0:9744f456fe92 234 }
ableemer 0:9744f456fe92 235 }
ableemer 0:9744f456fe92 236 }
ableemer 0:9744f456fe92 237 wait(.05);
ableemer 0:9744f456fe92 238 }
ableemer 0:9744f456fe92 239 }
ableemer 0:9744f456fe92 240
ableemer 0:9744f456fe92 241
ableemer 0:9744f456fe92 242
ableemer 0:9744f456fe92 243
ableemer 0:9744f456fe92 244
ableemer 0:9744f456fe92 245
ableemer 0:9744f456fe92 246 //SET FOR CSV FORMAT: NEEDS TO BE EDITED IF DIFFERENT FORMAT
ableemer 0:9744f456fe92 247 void parse(char buffer[], int *j, char *string) {
ableemer 0:9744f456fe92 248 //extracts next location string data item from buffer
ableemer 0:9744f456fe92 249 int i=0;
ableemer 0:9744f456fe92 250 for (i=0; i<=strlen(buffer); i++) { //TOTAL SIZE OF RETURNED DATA
ableemer 0:9744f456fe92 251 if ((buffer[*j+i] == ',')||(buffer[*j+i] == '\0' )) { //IF comma or end of string
ableemer 0:9744f456fe92 252 //comma is the string field delimiter
ableemer 0:9744f456fe92 253 string[i]=0; //SETS END OF SRTRING TO 0
ableemer 0:9744f456fe92 254 *j=*j+i+1; //UPDATES to 1 after comma seperated value
ableemer 0:9744f456fe92 255 break;
ableemer 0:9744f456fe92 256 } else string[i]=buffer[*j+i]; //Keep adding to the string
ableemer 0:9744f456fe92 257 }
ableemer 0:9744f456fe92 258 }