Kategori
IoT

Praktek MQTT

Praktik pengiriman data dari ESP32 ke Mosquitto, kemudian ESP32 tersebut mengambil data dari Mosquitto yang baru saja dikirim.

Wokwi

  • Buka Wokwi dengan masuk di https://wokwi.com
  • Buat projek baru dengan klik Add New Projects
  • Pilih ESP32

Kode Program Simulasi MQTT

  • Buatlah kode program seperti kode dibawah.
  • Kode program tersebut digunakan untuk mengirimkan data/messages ke broker Mosquitto sekaligus menerima data yang telah dikirimkan ke broker dengan topic /d3tt.
  • Data yang dikirim atau diterima ditampilkan di serial monitor.

include

include

const char* ssid = “Wokwi-GUEST”;
const char* password = “”;
const char* mqtt_server = “test.mosquitto.org”;
const char* mqtt_topic = “/d3tt”; //Disesuaikan dengan inisial nama

WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;

define MSG_BUFFER_SIZE (50)

char msg[MSG_BUFFER_SIZE];
int value = 0;

void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print(“Connecting to “);
Serial.println(ssid);

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(“.”);
}
Serial.println(“”);
Serial.println(“WiFi connected”);
Serial.print(“IP address: “);
Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
Serial.print(“Message arrived [“);
Serial.print(topic);
Serial.print(“] “);
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}

void reconnect() {
// Loop until we’re reconnected
while (!client.connected()) {
Serial.print(“Attempting MQTT connection…”);
// Create a random client ID
String clientId = “ESP32Client-“;
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println(“Connected”);
// Once connected, publish an announcement…
client.publish(mqtt_topic, “D3-TT”); //Nama Server
// … and resubscribe
client.subscribe(mqtt_topic);
} else {
Serial.print(“failed, rc=”);
Serial.print(client.state());
Serial.println(” try again in 5 seconds”);
// Wait 5 seconds before retrying
delay(5000);
}
}
}

void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}

void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();

unsigned long now = millis();
if (now – lastMsg > 2000) {
lastMsg = now;
++value;
snprintf (msg, MSG_BUFFER_SIZE, “Nomor Urut #%ld”, value);
Serial.print(“Publish message: “);
Serial.println(msg);
client.publish(mqtt_topic, msg);
}
}

Simulasi MQTT

  • Jalankan simulasi dengan klik Start Simulation.
  • Tunggu sebentar hingga wifi terkoneksi.
  • ESP32 akan mengirim data sesuai dengan program ke broker Mosquitto.
  • ESP32 juga menerima data dari Mosquitto sesuai dengan topic.

Praktek MQTT dengan Mosquitto

Pengiriman data dari ESP32 ke Mosquitto, kemudian ESP32 yang lain mengambil data dari Mosquitto.

Langkah-langkah

  • Buka Wokwi dengan masuk di https://wokwi.com
  • Buat projek baru dengan klik Add New Projects
  • Pilih ESP32 yang digunakan sebagai publisher.
  • Buka jendela baru dan buka Wokwi lagi lalu tambahkan ESP32 yang digunakan sebagai subscriber.
  • Sehingga total terdapat 2 tab Wokwi.

Kode Program ESP32 publisher

•Buatlah kode program seperti gambar disamping pada ESP32 yang berfungsi sebagai publisher. •Kode program tersebut digunakan untuk mengirimkan data/messages ke broker Mosquitto sekaligus menerima data yang telah dikirimkan ke broker dengan topic /d3tt.

Kode Program ESP32 subscriber

  • Buatlah kode program seperti gambar disamping untuk ESP32 yang berfungsi sebagai subscriber.
  • Kode program tersebut digunakan untuk menerima data yang telah dikirimkan oleh publisher ke broker dengan topic /d3tt.

//MQTT Publisher

include

include

const char* ssid = “Wokwi-GUEST”;
const char* password = “”;
const char* mqtt_server = “test.mosquitto.org”;
const char* mqtt_topic = “/d3tt”;

WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;

define MSG_BUFFER_SIZE (50)

char msg[MSG_BUFFER_SIZE];
int value = 0;

void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print(“Connecting to “);
Serial.println(ssid);

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(“.”);
}
//randomSeed(micros());
Serial.println(“”);
Serial.println(“WiFi connected”);
Serial.println(“IP address: “);
Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
// Serial.print(“Message arrived [“);
// Serial.print(topic);
// Serial.print(“] “);
// for (int i = 0; i < length; i++) {
// Serial.print((char)payload[i]);
// }
// Serial.println();
}

void reconnect() {
// Loop until we’re reconnected
while (!client.connected()) {
Serial.print(“Attempting MQTT connection…”);
// Create a random client ID
String clientId = “ESP32Client-“;
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println(“Connected”);
// Once connected, publish an announcement…
client.publish(mqtt_topic, “D3-TT”);
// … and resubscribe
client.subscribe(mqtt_topic);
} else {
Serial.print(“failed, rc=”);
Serial.print(client.state());
Serial.println(” try again in 5 seconds”);
// Wait 5 seconds before retrying
delay(5000);
}
}
}

void setup() {
pinMode(2, OUTPUT); // Initialize the BUILTIN_LED pin as an output
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}

void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();

unsigned long now = millis();
if (now – lastMsg > 2000) {
lastMsg = now;
++value;
snprintf (msg, MSG_BUFFER_SIZE, “Nomor Absen #%ld”, value);
Serial.print(“Publish message: “);
Serial.println(msg);
client.publish(mqtt_topic, msg);
}
}

Simulasi MQTT

  • Buka tab ESP32 publisher, lalu jalankan simulasi.
  • Buka tab ESP32 subscriber, lalu jalankan simulasi.
  • Buka tab ESP32 publisher.
  • Tunggu sebentar hingga Wifi terkoneksi dan mulai menirimkan data.
  • Saat ESP32 sudah mengirimkan data, buka tab ESP32 subscriber dan pastikan data sudah diterima sesuai dengan yang dikirimkan oleh ESP32 publisher.

Praktek MQTT dengan Smartphone

Rangkaian ESP32 dengan Sensor DHT22

Kode Program

#include <WiFi.h>
#include <PubSubClient.h>
#include "DHTesp.h"

const int DHT_PIN = 15;

DHTesp dhtSensor;

const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";

WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE	(50)
float temp = 0;
float hum = 0;
int value = 0;

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  randomSeed(micros());

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  // Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    digitalWrite(2, LOW);   // Turn the LED on (Note that LOW is the voltage level
    // but actually the LED is on; this is because
    // it is active low on the ESP-01)
  } else {
    digitalWrite(2, HIGH);  // Turn the LED off by making the voltage HIGH
  }

}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("Connected");
      // Once connected, publish an announcement...
      client.publish("/d3tt", "Connected");
      // ... and resubscribe
      client.subscribe("/d3tt");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
  pinMode(2, OUTPUT);     // Initialize the BUILTIN_LED pin as an output
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
}

void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  unsigned long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    TempAndHumidity  data = dhtSensor.getTempAndHumidity();

    String temp = String(data.temperature, 2);
    Serial.print("Temperature: ");
    Serial.println(temp);
    client.publish("/d3tt/temp", temp.c_str());
    
    String hum = String(data.humidity, 1);
    Serial.print("Humidity: ");
    Serial.println(hum);
    client.publish("/d3tt/hum", hum.c_str());
  }
}

Library

Simulasi Program

Konfigurasi Smartphone

Install aplikasi MQTT Dashboard

Open Aplikasi dan Setting Broker

Untuk percobaan ini Broker name = D3 Teknologi Telekomunikasi, Address = tcp://test.mosquitto.org, port = 1883, Client ID, QoS dan lain-lainnya dibiarkan default

Buat Tile/Widget untuk keterangan Suhu dan Kelembaban.

Pilih Text, seperti gambar dibawah

Tile Suhu

Tile Kelembaban

Hasil

Keterangan nilai Suhu dan Kelembaban didapatkan dari simulasi Wokwi yang sudah dijalankan. Pastikan nilai topic dan alamat broker sudah sesuai.

Ref : [1][2][3][4]