Earlier, we described how to create graph on IBM Watson IoT dashboard by using the default widgets. In previous guide, we described how to use ESP32 Arduino with DHT11 sensor. Here is the Code and Diagram to Connect ESP32 Arduino with DHT11 with IBM Watson IoT and Get Odometer Like Gauges on Dashboard. For this guide, you will need :
- Reading the above linked guides for setup and materials
- Our provided code in this guide
We have kept the required code on GitHub with Fritzing diagram. You need nothing more than our provided code and joining the DHT11 sensor with ESP32. Probably you already have the items of below list :
- An IBM Watson IoT Lite plan
- ESP32 board
- Setup of Arduino IDE with ESP32
- DHT11 module
- One 220 resistor
- Some jumpers
- One breadboard
Upload this code (available on above linked Github repository) after modifying the details of Wi-Fi and IBM Watson IoT platform :
---
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | #include <Adafruit_Sensor.h> #include <DHT.h> #include <DHT_U.h> #define DHTPIN 15 // Pin which is connected to the DHT sensor. // type the model of sensor in use, we are using DHT 11, if you are using DHT 21 or DHT 22 change it #define DHTTYPE DHT11 DHT_Unified dht(DHTPIN, DHTTYPE); uint32_t delayMS; #include <WiFi.h> #include <WiFiClient.h> #include <PubSubClient.h> // <------- CHANGE PARAMETERS BELOW THIS LINE ------------> const char ledPin = 2; const char* ssid = "your-hot-spot"; const char* password = "password"; #define ORG "YOUR-ORG-NAME-ON-IBM-DASHBOARD" #define DEVICE_TYPE "YOUR-SET-DEVICE-TYPE" #define DEVICE_ID "YOUR-SET-DEVICE-ID" #define TOKEN "YOUR-SET-TOKEN-OR-AUTOGENERATED-TOKEN" // <------- CHANGE PARAMETERS ABOVE THIS LINE ------------> char server[] = ORG ".messaging.internetofthings.ibmcloud.com"; char pubTopic[] = "iot-2/evt/status/fmt/json"; char subTopic[] = "iot-2/cmd/test/fmt/String"; char authMethod[] = "use-token-auth"; char token[] = TOKEN; char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID; WiFiClient wifiClient; PubSubClient client(server, 1883, NULL, wifiClient); void receivedCallback(char* pubTopic, byte* payload, unsigned int length) { Serial.print("Message received: "); Serial.println(pubTopic); Serial.print("payload: "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); /* we got '1' -> on */ } void setup() { Serial.begin(115200); Serial.println(); pinMode(ledPin, OUTPUT); Serial.println("IBM Watson IoT ESP32 Temperature, Humidity With DHT11"); sensor_t sensor; dht.temperature().getSensor(&sensor); dht.humidity().getSensor(&sensor); delayMS = sensor.min_delay / 1000; Serial.print("Connecting to "); Serial.print(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("WiFi connected, IP address: "); Serial.println(WiFi.localIP()); if (!client.connected()) { Serial.print("Reconnecting client to "); Serial.println(server); while (!client.connect(clientId, authMethod, token)) { Serial.print("."); delay(500); } client.setCallback(receivedCallback); if (client.subscribe(subTopic)) { Serial.println("subscribe to cmd OK"); } else { Serial.println("subscribe to cmd FAILED"); } Serial.println("IBM Watson IoT connected"); } } long lastMsg = 0; long temperature = 0; long humidity = 0; void loop() { delay(delayMS); sensors_event_t event; client.loop(); long now = millis(); if (now - lastMsg > 3000) { lastMsg = now; dht.temperature().getEvent(&event); temperature = (event.temperature); dht.humidity().getEvent(&event); humidity = (event.relative_humidity); String payload = "{\"d\":{\"Name\":\"" DEVICE_ID "\""; payload += ",\"temperature\":"; payload += temperature; payload += ",\"humidity\":"; payload += humidity; payload += "}}"; Serial.print("Sending payload: "); Serial.println(payload); if (client.publish(pubTopic, (char*) payload.c_str())) { Serial.println("Publish ok"); digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); } else { Serial.println("Publish failed"); } } } |
The on-board LED will blink each time it will get sucess in sending data. Please change the Security -> Connection Security -> TLS Optional on IBM Watson IoT platform or else the device will continuously be denied to connect.
To explain the code, the first part is for DHT11 sensor :
1 2 3 4 5 6 7 8 9 | #include <Adafruit_Sensor.h> #include <DHT.h> #include <DHT_U.h> #define DHTPIN 15 // Pin which is connected to the DHT sensor. // type the model of sensor in use, we are using DHT 11, if you are using DHT 21 or DHT 22 change it #define DHTTYPE DHT11 DHT_Unified dht(DHTPIN, DHTTYPE); uint32_t delayMS; .... |
Next part is for Wi-Fi and IBM Watson IoT account :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | ... #include <WiFi.h> #include <WiFiClient.h> #include <PubSubClient.h> // <------- CHANGE PARAMETERS BELOW THIS LINE ------------> const char ledPin = 2; const char* ssid = "your-hot-spot"; const char* password = "password"; #define ORG "YOUR-ORG-NAME-ON-IBM-DASHBOARD" #define DEVICE_TYPE "YOUR-SET-DEVICE-TYPE" #define DEVICE_ID "YOUR-SET-DEVICE-ID" #define TOKEN "YOUR-SET-TOKEN-OR-AUTOGENERATED-TOKEN" // <------- CHANGE PARAMETERS ABOVE THIS LINE ------------> char server[] = ORG ".messaging.internetofthings.ibmcloud.com"; char pubTopic[] = "iot-2/evt/status/fmt/json"; char subTopic[] = "iot-2/cmd/test/fmt/String"; char authMethod[] = "use-token-auth"; char token[] = TOKEN; char clientId[] = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID; WiFiClient wifiClient; PubSubClient client(server, 1883, NULL, wifiClient); ... |
Next part is for defining the server ports and serial print for debug :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ... WiFiClient wifiClient; PubSubClient client(server, 1883, NULL, wifiClient); void receivedCallback(char* pubTopic, byte* payload, unsigned int length) { Serial.print("Message received: "); Serial.println(pubTopic); Serial.print("payload: "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); /* we got '1' -> on */ } ... |
Next part is the setup, there is DHT11’s setup and Wi-Fi setup :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | ... void setup() { Serial.begin(115200); Serial.println(); pinMode(ledPin, OUTPUT); Serial.println("IBM Watson IoT ESP32 Temperature, Humidity With DHT11"); sensor_t sensor; dht.temperature().getSensor(&sensor); dht.humidity().getSensor(&sensor); delayMS = sensor.min_delay / 1000; Serial.print("Connecting to "); Serial.print(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("WiFi connected, IP address: "); Serial.println(WiFi.localIP()); if (!client.connected()) { Serial.print("Reconnecting client to "); Serial.println(server); while (!client.connect(clientId, authMethod, token)) { Serial.print("."); delay(500); } client.setCallback(receivedCallback); if (client.subscribe(subTopic)) { Serial.println("subscribe to cmd OK"); } else { Serial.println("subscribe to cmd FAILED"); } Serial.println("IBM Watson IoT connected"); } } long lastMsg = 0; long temperature = 0; long humidity = 0; ... |
In the loop part notice how we handled the two variables – humidity
and temperature
:
1 2 3 4 5 6 7 8 9 10 11 12 13 | ... void loop() { delay(delayMS); sensors_event_t event; client.loop(); long now = millis(); if (now - lastMsg > 3000) { lastMsg = now; dht.temperature().getEvent(&event); temperature = (event.temperature); dht.humidity().getEvent(&event); humidity = (event.relative_humidity); ... |
Note the part creating the JSON string :
1 2 3 4 5 6 7 8 9 | ... String payload = "{\"d\":{\"Name\":\"" DEVICE_ID "\""; payload += ",\"temperature\":"; payload += temperature; payload += ",\"humidity\":"; payload += humidity; payload += "}}"; .... |
The above will give this JSON :
1 2 3 4 5 6 7 | { "d":{ "Name":"ESP32", "temperature":30, "humidity":62 } } |
Rest of the part is easy and common to this kind of setup. Now, instead of the two variables – humidity
and temperature
, you can use some other kind of data collecting sensor like speed, fuel to create own project.
After uploading the code, visit Bluemix Console, go to Internet of Things platform, go to Boards > Create cards and add one by one two cards to get a result like that of us :
![Connecting ESP32 Arduino with DHT11 with IBM Watson IoT](https://thecustomizewindows.cachefly.net/wp-content/uploads/2019/03/Connecting-ESP32-Arduino-with-DHT11-with-IBM-Watson-IoT.png)