/* 2016 SensorUp (http://www.sensorup.com) This content is released under the (https://opensource.org/licenses/MIT) MIT License. Simple code to upload temperature observations to SensorThings Scratchpad (http://scratchpad.sensorup.com) from the grove DHT22 temperature and humidity sensor (https://www.seeedstudio.com/item_detail.html?p_id=746). It works with Linkit One board . (https://www.seeedstudio.com/item_detail.html?p_id=2017) */ #include <LWiFi.h> #include <LWiFiClient.h> #include <PubSubClient.h> /* Modify to your WIFI Access Credentials. */ #define WIFI_AP "steve" #define WIFI_PASSWORD "sensorup-rocks" #define WIFI_AUTH LWIFI_WPA // choose from LWIFI_OPEN, LWIFI_WPA, or LWIFI_WEP. LWiFiClient client; // DHT22 #include <DHT.h> // https://github.com/Seeed-Studio/Grove_Starter_Kit_For_LinkIt/tree/master/libraries/Humidity_Temperature_Sensor #define DHTPIN 2 // what pin the DHT sensor connected to #define DHTTYPE DHT22 // DHT 22 (AM2302) float temperature, humidity; DHT dht(DHTPIN, DHTTYPE); // MQTT #define MQTT_PROXY_IP "scratchpad.sensorup.com" void msgCallback(char* topic, byte* payload, unsigned int len) { // handle message arrived } PubSubClient mqttClient((char*)MQTT_PROXY_IP, 1883, msgCallback, client); /****************************************************************************************** change the <id> from the line below (e.g., #define DATASTREAM_ID_LIGHT <id>) to the <id> of your SensorThings Datastream. You can get the Datastream <id> from the SensorUp playground's Observation API Request: /st-playground/proxy/v1.0/Datastreams(<id>)/Observations *****************************************************************************************/ const int TEMPERATURE_DATASTREAM_ID = 1851; /****************************************************************************************** change the <token> from the line below (e.g., #define ACCESS_TOKEN <token>) to the <token> of your SensorThings Datastream. You can get the St-P-Access-Token <token> from the SensorUp playground's Observation API Request: St-P-Access-Token: d6ffe625-7e9f-42cb-8187-49d391107139 *****************************************************************************************/ #define SERVER_IP "scratchpad.sensorup.com" #define PORT 80 const int INTERVAL = 10; // Interval (in seconds) to post data void setup() { Serial.begin( 9600 ); Serial.println("Start connecting your Linkit One to SensorThings Scratchpad."); InitLWiFi(); } void loop() { mqttLoop(); dht.readHT(&temperature, &humidity); while (isnan(temperature) || isnan(humidity) || temperature <= -40 || temperature > 80 || humidity <= 5 || humidity > 99) { delay(100); dht.readHT(&temperature, &humidity); } //httpPostResult(temperature, TEMPERATURE_DATASTREAM_ID); mqttPublishResult(temperature, TEMPERATURE_DATASTREAM_ID); delay(INTERVAL*1000); } void InitLWiFi() { LWiFi.begin(); // Keep retrying until connected to AP Serial.println("Connecting"); while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD))) { delay(1000); } Serial.println("Connected"); } void httpPostResult(float value, int datastreamId) { Serial.println("HTTP POST an Observation result to SensorThings Scratchpad..."); String observationJson = createObservationJson(value); Serial.println(observationJson); if (client.connect(SERVER_IP, PORT)) { Serial.println("SensorThings Scratchpad connected "); // Build HTTP POST request client.println("POST /OGCSensorThings/v1.0/Datastreams(" + String(datastreamId) + ")/Observations HTTP/1.1"); Serial.println("POST /OGCSensorThings/v1.0/Datastreams(" + String(datastreamId) + ")/Observations HTTP/1.1"); String host = "Host: "; host.concat(SERVER_IP); client.println(host); Serial.println(host); client.println("Connection: close"); Serial.println("Connection: close"); client.println("Content-Type: application/json"); Serial.println("Content-Type: application/json"); client.println("Cache-Control: no-cache"); Serial.println("Cache-Control: no-cache"); client.print("Content-Length: "); Serial.print("Content-Length: "); client.print(observationJson.length()); Serial.print(observationJson.length()); client.print("\n\n"); Serial.print("\n\n"); client.print(observationJson); Serial.println("Observation: " + observationJson); while (true) { // if there are incoming bytes available // from the server, read them and print them: if (client.available()) { char c = client.read(); // Serial.print(c); } // if the server's disconnected, stop the client: if (!client.connected()) { Serial.println(); Serial.println("server disconnected. stopping the client.\n"); client.stop(); break; } } } else { // if you didn't get a connection to the server: Serial.println("connection failed"); } } void mqttPublishResult(float value,int datastreamId) { char sensorData[100]; createObservationJson(value).toCharArray( sensorData, 100 ); char topic[50]; sprintf(topic, "v1.0/Datastreams(%d)/Observations", datastreamId); Serial.print("Publish Topic:"); Serial.println(topic); mqttClient.publish(topic, sensorData ); Serial.println( sensorData ); } String createObservationJson(float value){ String jsonString = "{"; jsonString += "\"result\":"; jsonString += value; jsonString += "}"; return jsonString; } void mqttLoop() { if( !mqttClient.connected() ) { mqttReconnect(); } mqttClient.loop(); } void mqttReconnect() { boolean isConnected; if (!mqttClient.connected()) { Serial.print("Connecting to MQTT broker ..."); // Attempt to connect isConnected = mqttClient.connect("SensorUp2016");// Better use some random name if (isConnected) { Serial.println( "[DONE]" ); } else { Serial.print( "[FAILED] [ rc = " ); Serial.print( mqttClient.state() ); Serial.println( " : retrying in 5 seconds]" ); delay( 5000 ); } } }