Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

Selasa, 20 April 2021

[ Node-RED ] Komunikasi ke sensor menggunakan MQTT


Blog ini sudah banyak membahas MQTT terutama sejak 2 tahun lalu saat saya mulai melirik barang yang bernama IOT. Bagi kalian yang baru beralih dari microcontroller 8 bit ke dunia IOT atau kebalikannya  seorang IT programmer yang ingin berkecimpung di dunia 8 bit, mungkin ini suatu keputusan yg akan membingungkan. Jangan salah langkah deh pokoknya, lalu mulai dari mana sih ? Jadi saran saya adalah :


  • Jika anda pecinta elektronika, skema belajar yg tepat adalah Serial Com=>MQTT => Python => Node-RED
  • Jika anda seorang praktisi IT maka kebalikannya  Node-RED => MQTT => Arduino => Serial com

Jadi seperti saya ini yg pecinta dunia 8 bit, maka sudah tepat sekali menghindari Node-RED di awal belajar, karena akan mengalami kesulitan mengikuti logika Flow diagramnya. Sehingga saat saya sudah menguasai betul- betul MQTT sampai ke level advance ( bisa dibaca disini ), saat menghadapi Node-RED yang tinggal Drag-Drop maka akan sangat dimudahkan.



Untuk melanjutkan project MQTT pada Node-RED sebaiknya baca terlebih dahulu praktek MQTT sebelumnya pada pembahasan saya 2 tahun yang lalu : https://www.aisi555.com/2019/10/iot-lebih-lanjut-dengan-mqtt.html .

Dengan rangkaian yg masih sama dengan praktek sebelumnya, kita akan mebutuhkan modul esp8266 sebagai jembatan ke TCP/IP  menggunakan wi-fi. Sehingga akan lebih mudah jika menggunakan WeMos D1 dan sejenis. Jika tidak maka tinggal disesuaikan saja sesuai perangkat yg ada. Script yg dulu kita bahas 2 tahun yg lalu kita modifikasikan seperti ini, menggunakan DHT 22 dan 7 segmen komon katoda.



#include <DHT.h>
#include <ESP8266WiFi.h> //library esp 8266
#include <PubSubClient.h> //library MQTT pubsub client


const char *ssid =  "wifiku";   // nama AP wifi dirumah
const char *pass =  "passwordku";   
//server atau broker MQTT gratis
const char *mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char *mqtt_user = "";
const char *mqtt_pass = "";
const char *mqtt_client_name = "ahocool123"; 
//topik yang akan dituju
#define SUHUTOPIC "/test/suhu" 
#define HUMITOPIC "/test/kelembaban"
#define SEGTOPIC "/test/seg"

//Constants
#define DHTPIN 13     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino

//7seg

#define SEGA 16
#define SEGB 5
#define SEGC 4
#define SEGD 14
#define SEGE 12
#define SEGF 0
#define SEGG 2

//timer dht22
unsigned long previousMillis = 0;
const long interval = 5000;  

//Variables
float hum;  //Stores humidity value
float temp; //Stores temperature value

int incomingByte = 0; // for incoming serial data

//inisialisasi klien wifi vs Mqtt
WiFiClient wclient;
PubSubClient client(wclient);

void setup()
{

    pinMode(SEGA, OUTPUT);
    pinMode(SEGB, OUTPUT);
    pinMode(SEGC, OUTPUT);
    pinMode(SEGD, OUTPUT);
    pinMode(SEGE, OUTPUT);
    pinMode(SEGF, OUTPUT);
    pinMode(SEGG, OUTPUT);

    client.setServer(mqtt_server, mqtt_port);
    client.setCallback(mqtt_callback);
    
    Serial.begin(9600);
    setupwifi();
    dht.begin();

}

void setupwifi()  
{
   if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Connecting to Wifi:  ");
    Serial.print(ssid);
    Serial.println("...");
    WiFi.begin(ssid, pass);

    if (WiFi.waitForConnectResult() != WL_CONNECTED)
      return;
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }
}

void reconnectmqtt()  //ngecek broker KQTT 
{
   
    
      Serial.println("Connecting to MQTT server..");
     
      if (client.connect(mqtt_client_name,mqtt_user, mqtt_pass)) {
        Serial.println("Connected to MQTT server");
      } else {
        Serial.println("Could not connect to MQTT server");   
      }
   

    if (client.connected()){
      Serial.println("subscribe to topic: ");
      Serial.println(SEGTOPIC);
      client.subscribe(SEGTOPIC); //subscribe ke topic 7 segmen
    }  
  
}


void segmen(int angka)
{
 
   switch(angka) {
                  case 0 : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, HIGH);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, LOW);
                             break;
                  }
                  case 1 : { digitalWrite(SEGA, LOW);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, LOW);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, LOW);
                             digitalWrite(SEGG, LOW);
                             break;
                  }
                  case 2 : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, LOW);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, HIGH);
                             digitalWrite(SEGF, LOW);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }
                  case 3 : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, LOW);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }
                  case 4 : { digitalWrite(SEGA, LOW);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, LOW);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }

                  case 5 : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, LOW);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }                                                          
                  case 6 : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, LOW);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, HIGH);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }
                  case 7 : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, LOW);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, LOW);
                             digitalWrite(SEGG, LOW);
                             break;
                  }
                  case 8 : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, HIGH);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }
                  case 9 : { digitalWrite(SEGA, HIGH);
                             digitalWrite(SEGB, HIGH);
                             digitalWrite(SEGC, HIGH);
                             digitalWrite(SEGD, HIGH);                             
                             digitalWrite(SEGE, LOW);
                             digitalWrite(SEGF, HIGH);
                             digitalWrite(SEGG, HIGH);
                             break;
                  }
   }
}
void loop()
{
   if (!client.connected())  //ngecek koneksi ke broker
   {
    reconnectmqtt();
   }
   else client.loop(); //cek terus kalau ada data masuk
  
    
    
    
    unsigned long currentMillis = millis();
 
   if(currentMillis - previousMillis >= interval) {
    // save the last time you read the sensor 
    previousMillis = currentMillis;   
    
    //Read data and store it to variables hum and temp
    hum = dht.readHumidity();
    temp= dht.readTemperature();
    //Print temp and humidity values to serial monitor
    Serial.print("Humidity: ");
    Serial.print(hum);
    Serial.print(" %, Temp: ");
    Serial.print(temp);
    Serial.println(" Celsius");
   
    String pubStringt = String(temp);
    String pubStringh = String(hum);
    

    Serial.println("publish to topic: " );
    Serial.print(SUHUTOPIC);
    Serial.print(" : ");
    Serial.println(pubStringt);
    char message_bufft[pubStringt.length() + 1];
    pubStringt.toCharArray(message_bufft, pubStringt.length() + 1);
    client.publish(SUHUTOPIC,message_bufft );

    Serial.println("publish to topic: " );
    Serial.print(HUMITOPIC);
    Serial.print(" : ");
    Serial.println(pubStringh);
    char message_buffh[pubStringh.length() + 1];
    pubStringh.toCharArray(message_buffh, pubStringh.length() + 1);
    client.publish(HUMITOPIC,message_buffh );
   
   
   }


}
   // call back untuk SUBSCRIBE topik 7 segmen
void mqtt_callback(char* topic, byte* payload, unsigned int length) {
 
  Serial.print("Message arrived in topic: ");
  Serial.println(topic);
 
  Serial.print("Message:");
  //ada SUB masuk
  String message;
  for (int i = 0; i < length; i++) {
    message = message + (char)payload[i];  //Conver *byte to String
  }
   Serial.print(message);
  //ubah tampilan 7 segmen
  if(message == "SEG1") {segmen(1); }
  if(message == "SEG2") {segmen(2); }
  if(message == "SEG3") {segmen(3); }
  if(message == "SEG4") {segmen(4); }
  if(message == "SEG5") {segmen(5); }
  if(message == "SEG6") {segmen(6); }
  if(message == "SEG7") {segmen(7); }
  if(message == "SEG8") {segmen(8); }
  if(message == "SEG9") {segmen(9); }
  if(message == "SEG0") {segmen(0);}
}


   


Saya memilih broker MQTT di internet yg opensource dan gratis yaitu htp://broker.hivemq.com dengan port 1883. Jika tidak ada internet di rumah anda dapat menginstall Mosquitto pada PC berbasis linux atau raspberry pi. Penjelasannya dapat dibaca disini : https://www.aisi555.com/2020/05/iot-geopy-sebagai-pengolah-data-gis.html . Jadi jika hardware sudah terhubung dan kita ingin mengetest koneksi PUBLISH dan SUBSCRIBE nya , dapat menggunakan software MQTT FX di pc windows anda.


Setting parameter Broker :



PUBLISH message ke TOPIC di Broker


SUBSCRIBE Topic ke broker dan melihat outputnya berupa suhu dan kelembaban.


Setelah hardware arduino / wemos terhubung dengan sukses ke Broker dan bisa dilakukan kontrol terhadapnya, maka di sisi Node-RED kita perlu menambahan Node MQTT dengan perintah pada command prompt seperti berikut :

npm install node-red-contrib-mqtt-broker

Dan kita bisa langsung melakukan drag-drop node MQTT in seperti gambar dibawah ini :




Karena HiveMq sangat sederhana dan tanpa security, maka dengan setup seperti diatas kita bisa melakukan subscribe pada topic yang diinginkan , seperti  contoh yg kita pakai di topik : /test/suhu :


 
Dan kita bisa menghubungkan MQTT input ke debug sehingga dapat melihat pesan yang masuk.



Tambahkan juga untuk topik :  /test/kelembaban 



Untuk proses PUBLISH yang bertujuan ingin merubah 7 segmen maka Node-RED melakukan PUB ke topik  /test/seg , kita gunakan 10 injector saja untuk memudahkan mengirim string " SEG0 - SEG9 " ke MQTT broker.



Dan hasilnya bisa dilihat pada monitor serial di Arduino lanjut bisa dilihat pula pada display 7 segmen.





Nahh..mudah bukan ? Untuk menghadirkan tampilan yang lebih interaktif pada WEB UI seperti pada pembahasan sebelumnya ( disini ) , maka kita cukup mengganti input port serial menjadi MQTT, kemudian 7 segmennya saya tambahkan drop down menu seperti gambar dibawah :






Tampilannya pun cukup menarik sebagai interface otomasi perangkat IOT di rumah anda.




Wew ...kerennn....Lanjut ke Node-RED vs MODBUS ya pada pembahasan selanjutnya.
Share:

0 komentar:

Posting Komentar

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (8) arduino (26) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (25) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (58) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (7) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (7) radio (26) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) transistor (2) troubleshoot (3) tulisan (93) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika