4180 Lab 4 Project
Dependencies: 4DGL-uLCD-SE DebounceIn EthernetInterface HTTPClient Motor NTPClient Servo mbed-rtos mbed
Fork of 4180_BLE_Eth by
main.cpp@1:4ea41c8f9bfb, 2017-03-16 (annotated)
- 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?
User | Revision | Line number | New 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 | } |