Loading...
OUR BLOG

Publish Suhu dan Kelembapan dari DHT11 ke Digital Ocean, Node-RED dan Telegram Bot

Hi BDx-ian!

 

Dalam tutorial kali ini kita akan belajar macam mana nak publish suhu dan kelembapan dari DHT11 ke Node-RED dan Telegram Bot menggunakan ESP32S . 

 

Apa Itu Node-Red?

 

Node-RED adalah satu Open Source Software yang dibangunkan untuk membina aplikasi IoT dan ianya menggunakan editor yang membolehkan coding dilakukan secara visual. Coding secara visual ini merupakan satu initiatif No-Code Progamming di mana pengguna boleh membangunkan aplikasi IoT tanpa perlu bersusah payah memikirkan coding yang harus dibuat lagi.

Mari kita belajar cara untuk menghubungkan Node-RED dan ESP32S dengan Telegram Bot supaya data dari sensor DHT11 dapat dihantar ke Telegram.

 

Peralatan yang diperlukan:

 

Litar:

 

 

DHT11 Sensor

 

LED light

 

DC Motor

 

Code

Setelah selesai memasang komponen seperti gambar rajah di atas, anda boleh upload code yang disediakan seperti berikut ke dalam Arduino IDE anda.

 

#include <WiFi.h>

#include <PubSubClient.h>

#include <DHT.h>


#define DHTPIN 23

#define DHTTYPE DHT11   // DHT 11

#define MOTOR_RELAY_PIN 21


const char* ssid = "Nama WiFi Anda";

const char* password = "Password WiFi Anda";

const char* mqtt_server = "xxx.xx.xxx.xx"; // Isikan dengan IP address server anda


WiFiClient espClient;

PubSubClient client(espClient);

long lastMsg = 0;

char msg[50];

int value = 0;


DHT dht(DHTPIN, DHTTYPE);

float temperature = 0;

float humidity = 0;


const int ledPin = 13;

  

void setup() {

  Serial.begin(115200);


  dht.begin();  // initialize DHT


  setup_wifi();

  client.setServer(mqtt_server, 1883);

  client.setCallback(callback);


  pinMode(ledPin, OUTPUT);

  pinMode(MOTOR_RELAY_PIN, OUTPUT); 

  digitalWrite(MOTOR_RELAY_PIN, LOW);

}


void callback(char* topic, byte* message, unsigned int length) {

  Serial.print("Message arrived on topic: ");

  Serial.print(topic);

  Serial.print(". Message: ");

  String messageTemp;

  

  for (int i = 0; i < length; i++) {

    Serial.print((char)message[i]);

    messageTemp += (char)message[i];

  }

  Serial.println();


  if (String(topic) == "esp32/output") {

    Serial.print("Changing output to ");

    if(messageTemp == "on") {

      Serial.println("on");

      digitalWrite(ledPin, HIGH);

    }

    else if(messageTemp == "off") {

      Serial.println("off");

      digitalWrite(ledPin, LOW);

    }

  }

}


void setup_wifi() {

  delay(10);

  Serial.println();

  Serial.print("Connecting to ");

  Serial.println(ssid);


  WiFi.begin(ssid, password);


  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }


  Serial.println("");

  Serial.println("WiFi connected");

  Serial.println("IP address: ");

  Serial.println(WiFi.localIP());

}


void reconnect() {

  while (!client.connected()) {

    Serial.print("Attempting MQTT connection...");

    if (client.connect("ESP32Client")) {

      Serial.println("connected");

      client.subscribe("esp32/output");

    } else {

      Serial.print("failed, rc=");

      Serial.print(client.state());

      Serial.println(" try again in 5 seconds");

      delay(5000);

    }

  }

}


void loop() {

  if (!client.connected()) {

    reconnect();

  }

  client.loop();


  long now = millis();

  if (now - lastMsg > 5000) {

    lastMsg = now;

    

    int check = dht.read(DHTPIN);

    temperature = dht.readTemperature();

    humidity = dht.readHumidity();

    

    char tempString[8];

    dtostrf(temperature, 1, 2, tempString);

    Serial.print("Temperature: ");

    Serial.println(tempString);

    client.publish("esp32/temperature", tempString);


    char humString[8];

    dtostrf(humidity, 1, 2, humString);

    Serial.print("Humidity: ");

    Serial.println(humString);

    client.publish("esp32/humidity", humString);


    // Check humidity and control the motor accordingly

    if (humidity < 90) {

      Serial.println("Humidity is below 90%. Activating the motor.");

      digitalWrite(MOTOR_RELAY_PIN, HIGH); // Activate the motor

    } else {

      Serial.println("Humidity is 90% or above. Deactivating the motor.");

      digitalWrite(MOTOR_RELAY_PIN, LOW); // Deactivate the motor

    }

  }

}

Url coding di GitHub : https://github.com/bdxtronix-tutorial/esp32-nodeRed-digitalOcean-telegram

 

1. NODE-RED

 

Bagi tutorial in, kita akan menggunakan Node-RED sebagai medium untuk membolehkan data diperolehi dan dihantar dari ESP32S ke Telegram Bot. Bagi anda yang telepas untuk tutorial sebelum ini boleh rujuk di Tutorial Install Node-RED untuk membolehkan anda mengimplementasi Node-RED dalam project anda yang akan datang. Untuk tutorial ini, kita menghubungkan Node-RED dengan Digital Ocean. Bagi anda yang telepas untuk tutorial sebelum ini boleh rujuk di Tutorial Setup Digital Ocean. Mari kita sambung setup console dari Digital Ocean ini kepada Node-RED.

 

1. Setelah mengikuti langkah - langkah setup Digital Ocean, anda harus menaip beberapa command prompt pada console untuk menginstall Node-RED pada console droplet anda. Langkah ini untuk mengupdate dan upgrade server anda.

sudo apt update && sudo apt upgrade -y

 

2. Kemudian, untuk menginstall Node-RED, anda perlukan npm.

sudo apt install npm -y

 

3. Command ini pula untuk Node-RED sebagai global module bersama-sama dengan semua dependencies.

sudo npm install -g --unsafe-perm node-red

 

4. Kemudian gunakan command ini untuk memulakan port 1880 pada server anda. Ini kerana Node-RED menggunakan port 1880 sebagai default port.

sudo ufw allow 1880

 

5. Setelah semua proses telah dijalankan. Anda boleh menaip command seperti di bawah untuk memulakan Node-RED.

node-red start

 

6. Ini adalah paparan setelah Node-RED telah berjaya memula.

 

 

7. Untuk mengakses ke Node-RED, taipkan Digital Ocean Droplet IP address anda diikuti dengan port number iaitu 1880.

http://IP-Address-Digital-Ocean-Anda:1880

 

8. Paparan kosong untuk anda memulakan projek anda adalah seperti ini. 

 

 

9. Ini adalah flow untuk projek kali ni.

 

 

2. TELEGRAM BOT

Telegram Bot adalah satu medium untuk mencipta bot - bot yang beroperasi menghantar dan menerima data dari Node-RED. Jika anda terlepas cara untuk mencipta telegram bot ini, anda boleh merujuk ke Kawal LED menggunakan Telegram Bot dan NodeMCU ESP8266 dan kita akan teruskan ke langkah seterusnya. 

 

1. Setelah bot telegram anda sudah tercipta dan anda sudah mendapat token API dan ID anda, kembali ke Node-RED untuk membuat sedikit modifikasi iaitu anda harus menambah pallete. Tekan Manage Palette.

 

 

2. Pada bahagian Manage Palette, tekan Install dan search untuk node-red-contrib-telegram dan tekan Install.

 

 

3. Setelah Telegram Sender hadir pada Palette sebelah kiri anda, drag masuk ke dalam projek anda dan tambah 1 function lalu double-click pada function tersebut dan masukkan coding seperti berikut.

 

 

4. Setelah selesai tekan Deploy dan hasilnya bot telegram anda akan menerima notifikasi dari Node-RED yang telah disambungkan dengan ESP32. Ini adalah contoh yang diterima dari telegram bot untuk tutorial ini.

 

 

Output

 

 

Ini adalah paparan dari Dashboard Node-RED, untuk mengakses dashboard ini tambahkan ui selepas number port anda. Di sini anda akan dapat melihat ke semua data yang telah anda siapkan. 

 

 

Setelah di sambungkan dengan ESP32S melalui WiFi, pengguna dapat membuka serial monitor untuk melihat result di serial monitor ini. Ini memastikan data dapat terhasil dari ESP32S ini. 

 

 

Setelah result telah berjaya diperolehi, dc motor akan mula berpusing sekiranya Humidity kurang daripada 90%. Manakala LED pula akan menyala sekiranya anda menekan toggle di Dashboard Node-RED iaitu di bahagian output. 

 

 

 

 

Unsure Whether You Need Our Help?

Have you got an awesome new idea or project that you want to talk about? We're here to talk you through it. Flick us an email or give us a call to get started.