Stap 7: De code van mijn weerstation
#include <LTask.h> #include <LWifi.h> #include <LWiFiClient.h> #include <HttpClient.h> #include <LDateTime.h> #define WIFI_AP "12345" //my wifi ap #define WIFI_PASSWORD "2222222222" //my wifi ap password #define WIFI_AUTH LWIFI_WPA //the kind of authority of my wifi which is WPA2 #define per 50 #define per1 3 #define DEVICEID "DVViF3eK" //the device id given by cloud sandbox #define DEVICEKEY "yWHbtj3nxy0T4OFQ" //the device key given by cloud sandbox #define SITE_URL "api.mediatek.com" //the site of the API LWiFiClient c; //wifi client LWiFiClient c2; HttpClient http(c2); //http client unsigned int rtc; //real-time clock unsigned int lrtc; unsigned int rtc1; unsigned int lrtc1; char port[4]=" "; char connection_info[21]=" "; char ip[21]=" "; int portnum; int val = 0; String tcpdata = String(DEVICEID) + "," + String(DEVICEKEY) + ",0"; String TCPCMD_LED_ON = "LED_controller,1"; //tcp command to controll LED ON/OFF String TCPCMD_LED_OFF = "LED_controller,0"; #include <dht11.h> //include library of DHT11 sensor dht11 DHT11; #define DHT11PIN 2 #include <Wire.h> //include wire library to enable Grove #include <Barometer.h> //include library of Barometer sensor Barometer myBarometer; float humidity; float temperature; float pressure; float atm; float altitude; void setup() { //initialize Serial.begin(9600); LTask.begin(); LWiFi.begin(); myBarometer.init(); pinMode(13, OUTPUT); while(!Serial); Serial.println("Connecting to AP"); while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD))) delay(1000); Serial.println("WiFi succeed"); Serial.println("calling connection"); while (!c2.connect(SITE_URL, 80)) delay(1000); Serial.println("Connection to site succeed"); getconnectInfo(); Serial.println("getConnectionInfo succeed"); connectTCP(); Serial.println("connectTCP() succeed"); } void loop() { int chk = DHT11.read(DHT11PIN); //check DHT11 and read values humidity = DHT11.humidity; temperature = myBarometer.bmp085GetTemperature(myBarometer.bmp085ReadUT()); //read values from Barometer sensor pressure = myBarometer.bmp085GetPressure(myBarometer.bmp085ReadUP()); altitude = myBarometer.calcAltitude(pressure); //calculate the ideal altitude // atm = pressure / 101325; // Serial.print("Read sensor: "); // switch(chk) // { // case 0: Serial.println("OK"); break; // case -1: Serial.println("Checksum error"); break; // case -2: Serial.println("Time out error"); break; // default: Serial.println("Unknown error"); break;a // } //print some information on serial monitor Serial.println("==================================="); Serial.print("Humidity: "); Serial.println(humidity); Serial.print("Temperature: "); Serial.println(temperature); Serial.print("Altitude: "); Serial.println(altitude); Serial.print("Pressure: "); Serial.println(pressure); Serial.println("==================================="); delay(3000); String tcpcmd=""; //read tcp command from cloud to determine whether LED is ON or OFF while(c.available()) { int v = c.read(); if(v != -1); { Serial.print((char)v); tcpcmd += (char)v; if(tcpcmd.substring(40).equals(TCPCMD_LED_ON)) { digitalWrite(13, HIGH); tcpcmd = ""; } else if(tcpcmd.substring(40).equals(TCPCMD_LED_OFF)) { digitalWrite(13, LOW); tcpcmd = ""; } } } LDateTime.getRtc(&rtc); if ((rtc - lrtc) >= per) { heartBeat(); lrtc = rtc; } //Check for report datapoint status interval LDateTime.getRtc(&rtc1); if ((rtc1 - lrtc1) >= per1) { uploadstatus(); lrtc1 = rtc1; } } void getconnectInfo(){ //calling RESTful API to get TCP socket connection c2.print("GET /mcs/v2/devices/"); c2.print(DEVICEID); c2.println("/connections.csv HTTP/1.1"); c2.print("Host: "); c2.println(SITE_URL); c2.print("deviceKey: "); c2.println(DEVICEKEY); c2.println("Connection: close"); c2.println(); delay(500); int errorcount = 0; while (!c2.available()) { Serial.println("waiting HTTP response: "); Serial.println(errorcount); errorcount += 1; if (errorcount > 10) { c2.stop(); return; } delay(100); } int err = http.skipResponseHeaders(); int bodyLen = http.contentLength(); Serial.print("Content length is: "); Serial.println(bodyLen); Serial.println(); char c; int ipcount = 0; int count = 0; int separater = 0; while (c2) { int v = c2.read(); if (v != -1) { c = v; Serial.print(c); connection_info[ipcount]=c; if(c==',') separater=ipcount; ipcount++; } else { Serial.println("no more content, disconnect"); c2.stop(); } } Serial.print("The connection info: "); Serial.println(connection_info); int i; for(i=0;i<separater;i++) { ip[i]=connection_info[i]; } int j=0; separater++; for(i=separater;i<21 && j<5;i++) { port[j]=connection_info[i]; j++; } Serial.println("The TCP Socket connection instructions:"); Serial.print("IP: "); Serial.println(ip); Serial.print("Port: "); Serial.println(port); portnum = atoi (port); Serial.println(portnum); } //getconnectInfo void connectTCP(){ //establish TCP connection with TCP Server with designate IP and Port c.stop(); Serial.println("Connecting to TCP"); Serial.println(ip); Serial.println(portnum); while (0 == c.connect(ip, portnum)) { Serial.println("Re-Connecting to TCP"); delay(1000); } Serial.println("send TCP connect"); c.println(tcpdata); c.println(); Serial.println("waiting TCP response:"); } //connectTCP void heartBeat(){ Serial.println("send TCP heartBeat"); c.println(tcpdata); c.println(); } //heartBeat void uploadstatus(){ //calling RESTful API to upload datapoint to MCS(Meditek Cloud Sandbox) Serial.println("calling connection"); LWiFiClient c2; char bufferH[5]; char bufferT[5]; char bufferA[7]; char bufferP[7]; sprintf(bufferH, "%.2f", humidity); sprintf(bufferT, "%.2f", temperature); sprintf(bufferA, "%.2f", altitude); sprintf(bufferP, "%.0f", pressure); String uploadLED; String uploadHumidity = "humidity_display,," + String(bufferH); String uploadTemperature = "temperature_display,," + String(bufferT); String uploadAltitude = "altitude_display,," + String(bufferA); String uploadPressure = "pressure_display,," + String(bufferP); while (!c2.connect(SITE_URL, 80)) { Serial.println("Re-Connecting to WebSite"); delay(1000); } delay(100); if(digitalRead(13)==1) uploadLED = "LED_display,,1"; else uploadLED = "LED_display,,0"; String uploadData = uploadLED + "\n" + uploadHumidity + "\n" + uploadTemperature + "\n" + uploadAltitude + "\n" + uploadPressure; HttpClient http(c2); c2.print("POST /mcs/v2/devices/"); c2.print(DEVICEID); c2.println("/datapoints.csv HTTP/1.1"); c2.print("Host: "); c2.println(SITE_URL); c2.print("deviceKey: "); c2.println(DEVICEKEY); c2.print("Content-Length: "); c2.println(uploadData.length()); c2.println("Content-Type: text/csv"); c2.println("Connection: close"); c2.println(); c2.println(uploadData); //upload the data delay(500); int errorcount = 0; while (!c2.available()) { Serial.print("waiting HTTP response: "); Serial.println(errorcount); errorcount += 1; if (errorcount > 10) { c2.stop(); Serial.println("uploadStatus failed"); return; } delay(100); } int err = http.skipResponseHeaders(); int bodyLen = http.contentLength(); Serial.print("Content length is: "); Serial.println(bodyLen); Serial.println(); while (c2) { int v = c2.read(); if (v != -1) Serial.print(char(v)); else { Serial.println("no more content, disconnect"); c2.stop(); } } }