simple weather app that uses sensor and forecast data from opeanweather.org . The results are shown on TFT and published on Thingspeak. (there may be some of my charts at https://thingspeak.com/channels/26357) This was built to show using k64F ethernet capabilities for K64F roadtest at http://www.element14.com/community/groups/roadtest (there will be a write there shortly)
Dependencies: DHT EthernetInterface HTTPClient NTPClient SDFileSystem SPI_TFT_ILI9341 TFT_fonts mbed-rtos mbed picojson
Diff: main.cpp
- Revision:
- 0:9ab281898a9b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Mar 20 14:24:06 2015 +0000 @@ -0,0 +1,196 @@ +#include "mbed.h" +#include "SPI_TFT_ILI9341.h" +#include "sansSerif19x20.h" +#include "DHT.h" +#include "EthernetInterface.h" +#include "NTPClient.h" +#include "HTTPClient.h" +#include "picojson.h" +#include "SDFileSystem.h" +//IMPORTANT YOU NEED TO SET THE API KEY for thingspeak look for "your key here" +//TAKE CARE URL doesn't excced buffer size +//sd card + SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCLK, SSEL +//Ethernet Interface +EthernetInterface eth; +//NTP service for date and Time used to set boards RTC +NTPClient ntp; +//HTTP Client for interfacing to web services +HTTPClient http; +char resp[1024]; //buffer for the responce +//On board LED +DigitalOut myled(LED_GREEN); +//serial over USB for debug and Info +Serial pc(USBTX, USBRX); +//temperature sensor +DHT sensor(PTB18,DHT22); // there are several libraries available, this reports CRC error sometimes +//320x240 Display ILI9341 controller (look on ebay) +SPI_TFT_ILI9341 TFT(PTD2, PTD3, PTD1,PTC3 ,PTC4 ,PTD0 ,"TFT"); // mosi, miso, sclk, cs, reset, dc + +int main() +{ + int cnt = 0; + int err; + int ret=0; + char val[4][16]; + //used to parse the json data + picojson::value v; + char * json; + HTTPMap map; + HTTPText inText(resp, 1024); + char sdfile[32]; + FILE *fp; + pc.printf("Weather Reporter\n"); + + + //eithernet init + eth.init(); //Use DHCP + ret= eth.connect(); + if (!ret) { + pc.printf("Connected, IP: %s, MASK: %s, GW: %s\n", + eth.getIPAddress(), eth.getNetworkMask(), eth.getGateway()); + } else { + pc.printf("Error eth.connect() - ret = %d\n", ret); + } + + + //setup the TFT DISPLAY + TFT.claim(stdout); // send stdout to the TFT display + //ensure the output is write and not buffered + setvbuf ( stdout , NULL , _IONBF , NULL ); + //TFT.claim(stderr); // send stderr to the TFT display + TFT.set_orientation(1); + TFT.background(Black); // set background to black + //centerx = TFT.width() >> 1; + //centery = TFT.height() >> 1; + + + TFT.cls(); + TFT.locate(0,0); + TFT.set_font((unsigned char*) sansserif); + //printf will now for to TFT because of the TFT.claim(stdout) + printf("Weather Test\n"); + //setup the RTC with date and time + printf("Trying to update time...\r\n"); + time_t ctTime; + NTPResult result; + result = ntp.setTime("pool.ntp.org"); + if (result == NTP_OK) { + time(&ctTime); + printf("Time is set to (UTC):\n%s\n", ctime(&ctTime)); + strcpy(sdfile,"/sd/results/default_results"); //could use time in name + }else{ + printf("Error setting Time\n"); + strcpy(sdfile,"/sd/results/default_results"); + } + + //write to sdcard, we could use the time and date in the filename defained above to give a new file for every session + mkdir("/sd/results", 0777); + fp = fopen(sdfile, "w"); + if (fp == NULL) { + pc.printf("Unable to write the file \n"); + } else { + pc.printf("Writing data to SDCARD \n"); + //time,temp,humidity,forcast,pressure + fprintf(fp, "time,temperature,humidity,forcastTemp,forcastPressure\n"); + fclose(fp); + } + + float humidity=0; + float temperature=-100; + float forcastTemp=0; + float forcastPressure; + wait(10); + pc.printf("\r\nDHT Test program"); + pc.printf("\r\n******************\r\n"); + wait(1); // wait 1 second for device stable status + while(1){ + + //GET forcast data + pc.printf("\nTrying to fetch page...\n"); + //try getting the weather, 5 second timeout + ret = http.get("http://api.openweathermap.org/data/2.5/weather?q=Strathaven,uk", resp, 5000); + if(!ret){ + pc.printf("responce=%s",resp); + json=&resp[0]; + pc.printf("parsing"); + string err = picojson::parse(v, json, json + strlen(json)); + if(err.empty()){ + forcastTemp=v.get("main").get("temp").get<double>(); + forcastTemp=forcastTemp-273.15; + forcastPressure=v.get("main").get("pressure").get<double>(); + // printf("Forcast temp: %f\n", forcastTemp); + } + else{ + pc.printf("error parsing"); + } + } + else{ + pc.printf("ERROR=%d", ret); + } + + err = sensor.readData(); + if (err == 0) { + TFT.cls(); + TFT.locate(0,0); + time(&ctTime); + printf("%s\n", ctime(&ctTime)); + temperature=sensor.ReadTemperature(CELCIUS); + humidity=sensor.ReadHumidity(); + printf("Temperature: %4.2f C \r\n",temperature); + printf("Forcast Temp: %4.2f C \r\n",forcastTemp); + printf("Temperature is %4.2f F \r\n",sensor.ReadTemperature(FARENHEIT)); + printf("Humidity is %4.2f \r\n",humidity); + printf("Dew point is %4.2f \r\n",sensor.CalcdewPoint(sensor.ReadTemperature(CELCIUS), sensor.ReadHumidity())); + printf("Forcast Pressure: %4.2f C \r\n",forcastPressure); + myled = 1; + } else{ + pc.printf("\r\nErr %i \n",err); + myled = 0; + } + + + //sent to thingsspeak + if(cnt==10){ //don't update as often + cnt=0; + memset(resp, '\0', sizeof(resp)); + //POST data + if(temperature!=-100){ //just check we have a valid temp + map.put("api_key","YOUR KEY HERE"); + sprintf(val[0],"%4.1f",temperature); + map.put("field1", val[0]); + sprintf(val[1],"%4.1f",humidity); + map.put("field2", val[1]); + sprintf(val[2],"%4.1f",forcastTemp); + map.put("field3", val[2]); + sprintf(val[3],"%4.1f",forcastPressure); + map.put("field4", val[3]); + pc.printf("\nTrying to post data...\n"); + ret = http.post("https://api.thingspeak.com/update", map, &inText); + if (!ret) + { + pc.printf("Executed POST successfully - read %d characters\n", strlen(resp)); + pc.printf("Result: %s\n", resp); + } + else + { + pc.printf("Error - ret = %d - HTTP return code = %d\n", ret, http.getHTTPResponseCode()); + } + //Write Data to SDCARD + fp = fopen(sdfile, "a"); + if (fp == NULL) { + pc.printf("Unable to write the file \n"); + } else { + pc.printf("Writing data to SDCARD \n"); + //time,temp,humidity,forcast,pressure + fprintf(fp, "%s,%4.1f,%4.1f,%4.1f,%4.1f\n", ctime(&ctTime),temperature,humidity,forcastTemp,forcastPressure); + fclose(fp); + } + } + + } + + cnt++; + wait_ms(6000); + } +}