ESP32 - Upload Data Suhu dan Kelembaban DHT11 ke Blockchain IOTA


Ditulis oleh : Fandi Adinata

pada 4 Juni 2023 00:37 WIB

Tutorial di bawah menginstruksikan bagaimana cara untuk mengirimkan data suhu dan kelembaban sensor DHT11 ke blockchain IOTA (lebih dikenal sebagai IOTA Tangle) menggunakan mikrokontroler ESP32 melalui protokol MQTT.



Pengenalan Sensor Suhu dan Kelembaban DHT11

Secara singkat, sensor DHT11 merupakan sensor yang dapat membaca suhu dan kelembaban udara di sekitar sensor. Detail spesifikasi sensor DHT11 diperlihatkan melalui tabel di bawah.

Spesifikasi DHT11
Rentang Kelembaban 20% hingga 80%
Akurasi Kelembaban 5%
Rentang Pembacaan Suhu 0C hingga 50C
Akurasi Suhu +- 2C
Sampling Rate 1 Hz

Pemasangan kabel antara sensor DHT11 dengan ESP32 seperti pada gambar di bawah.

Pinout DHT11. Sumber : circuits-diy.


ESP32 DHT11
3V3 VCC
D15 DATA
GND GND


Pengenalan IOTA Tangle

IOTA Tangle adalah jaringan distributed ledger milik IOTA. Jaringan ini tidak menggunakan konsep linear block seperti blockchain ethereum maupun blockchain lainnya, melainkan menggunakan konsep directed acyclic graph(DAG). Konsep ini memungkinkan proses upload data ke distributed ledger menjadi lebih cepat.

Dalam tutorial ini, pengunggahan data ke jaringan IOTA tidak dilakukan langsung ke jaringan IOTA Tangle, melainkan melalui gateway raspberry pi yang mendukung protokol MQTT. Jika Anda tertarik untuk membuat gateway sendiri, silakan baca tutorialnya di sini.


Kode Program

Penjelasan Kode Program
Copy
//=============================================================================
// Library
//=============================================================================
// REQUIRES the following Arduino libraries:
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <WiFi.h>
#include <PubSubClient.h>
view raw src/main/main.ino delivered with ❤ by emgithub

Bagian di atas digunakan untuk memanggil library yang diperlukan, antara lain library DHT11 dari Adafruit dan library PubSubClient.

Copy
//=============================================================================
// WiFi Credential
//=============================================================================
const char* SSID = "your_wifi_ssid";
const char* PASS = "your_wifi_pass";
view raw src/main/main.ino delivered with ❤ by emgithub

Ubah bagian di atas sesuai dengan konfigurasi WiFi Anda. SSID untuk nama WiFi dan PASS untuk password WiFi.

Copy
//=============================================================================
// DHT11
//=============================================================================
#define DHTPIN 15
#define DHTTYPE DHT11
DHT_Unified dht(DHTPIN, DHTTYPE);
float temperature;
float humidity;
view raw src/main/main.ino delivered with ❤ by emgithub

Bagian di atas digunakan untuk konfigurasi pin DHT11.

Copy
//=============================================================================
// MQTT Configuration
//=============================================================================
const char *mqtt_broker = "test.mosquitto.org";
const char *topic = "surya_gateway/submit";
const char *returnTopic = "esp32dht11";
const char *subscribeTopic = "surya_gateway/esp32dht11";
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
view raw src/main/main.ino delivered with ❤ by emgithub

Jika Anda membuat gateway sendiri, Anda dapat mengubah broker MQTT sesuai dengan yang Anda gunakan. topic adalah topic MQTT untuk submit data dari ESP32 ke gateway. subscribeTopic digunakan untuk menerima message ID data yang sudah masuk ke dalam IOTA Tangle. returnTopic mengikuti akhiran dari subscribeTopic.

Copy
// initialize DHT
dht.begin();
sensor_t sensor;
dht.temperature().getSensor(&sensor);
// start WiFi Connection
WiFi.mode(WIFI_STA);
WiFi.begin(SSID, PASS);
view raw src/main/main.ino delivered with ❤ by emgithub

Di dalam void setup, lakukan aktivasi pembacaan DHT11 dan WiFi.

Copy
// connect MQTT
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
connectMQTT();
view raw src/main/main.ino delivered with ❤ by emgithub

Setting server MQTT menggunakan alamat broker dan port seperti pada kode di atas. Dalam program ini, ESP32 akan menerima message ID dari gateway melalui subscribeTopic. Proses penerimaan message ID di atur di fungsi callback(). Langkah selanjutnya, aktifkan MQTT dengan memanggil fungsi connectMQTT. Fungsi connectMQTT() dan callback() seperti pada di bawah.

Copy
void connectMQTT(){
if (!client.connected()) {
String client_id = "esp32-client-";
client_id += String(WiFi.macAddress());
Serial.printf("The client %s connects to the public mqtt broker\n", client_id.c_str());
Serial.println("");
if (client.connect(client_id.c_str())) {
Serial.println("Connected to test.mosquitto.org");
}
else {
Serial.print("Connect failed with state ");
Serial.print(client.state());
Serial.println(". Try again in 5 second");
delay(5000);
}
}
// subscribe for return IOTA address
client.subscribe(subscribeTopic);
}
void callback(char *topic, byte *payload, unsigned int length) {
String newmqtt;
for (uint8_t i = 0; i < length; i++) {
newmqtt += (char) payload[i];
}
Serial.print("New IOTA Msg ID : ");
Serial.println(newmqtt);
}
view raw src/main/main.ino delivered with ❤ by emgithub

Letakkan fungsi connectMQTT() dan callback() di paling bawah dari file program.

Copy
// Read sensor every interval and upload
if(millis() - lastCheck >= interval){
  lastCheck = millis();

  sensors_event_t event;
  dht.temperature().getEvent(&event);
  temperature = (float)event.temperature;
  dht.humidity().getEvent(&event);
  humidity = (float)event.relative_humidity;

  Serial.print(temperature);
  Serial.print("--");
  Serial.println(humidity);

  // get timestamp
  time_t now = time(nullptr);
  while (now < 24 * 3600)
  {
    Serial.print(".");
    delay(100);
    now = time(nullptr);
  }

  String client_id = "esp32-client-";
  client_id += String(WiFi.macAddress());

  // manually construct JSON format
  String mqtt_data = "{'node':'";
  mqtt_data += client_id;
  mqtt_data += "',";
  mqtt_data += "'nodeTimestamp':";
  mqtt_data += String(now);
  mqtt_data += ",";
  mqtt_data += "'temperature':";
  mqtt_data += String(temperature,2);
  mqtt_data += ",";
  mqtt_data += "'humidity':";
  mqtt_data += String(humidity,2);
  mqtt_data += "}/";
  mqtt_data += returnTopic;
  Serial.println(mqtt_data);
  client.publish(topic, mqtt_data.c_str(), false);
}
view raw src/main/main.ino delivered with ❤ by emgithub

Pembacaan sensor dilakukan setiap 5 menit. Setelah pembacaan sensor selesai, data akan dikirimkan dalam format JSON yang disimpan di variabel mqtt_data. JSON kemudian dipublish ke topic surya_gateway/submit melalui client.publish().


Hasil Pengujian pada ESP32

Berdasarkan pengujian, lama waktu yang diperlukan untuk mengirim data ke gateway hingga menerima message ID adalah sekitar 1,5 menit. Lama proses upload dapat bervariasi sesuai dengan kecepatan internet di tempat Anda.

Metode ini tidak dapat digunakan untuk pengiriman data dengan interval pengiriman kurang dari 1,5 menit. Namun, cara ini cocok digunakan untuk pengiriman data dengan interval di atas 5 menit. Seperti 10 menit sekali atau 30 menit sekali.


Serial monitor ESP32.


Data di IOTA Tangle

Data yang telah diunggah ke IOTA Tangle dapat dilihat melalui IOTA Explorer.



Data DHT11 di IOTA Explorer.