Raspberry Pi MQTT Server (Part 1. Setup MQTT client)

84 / 100

Setup MQTT client menggunakan arduino based microcontroller

Pengukuran sangatlah penting untuk mengetahui dan memahami apa yang terjadi dengan lingkungan di sekitar, salah satunya  temperature. Sebetulnya di negara tropis seperti Indonesia, perubahan temperature tidaklah signifikan sepanjang tahun. Namun, lain halnya jika kita ingin meningkatkan effisiensi penggunaan listrik agar dapat lebih berhemat, terutama dalam penggunaan pendingin ruangan.

Oleh karena itu, pada tutorial kali ini kita akan membuat pengukuran temperature&humidity menggunakan open source hardware dan software yang terhubung melalui MQQT server, lalu di simpan dalam time series database dan ditampilkan ke dalam dashboard yang menawan.

Ada sekian banyak IoT dashboard yang dapat digunakan di luar sana, ada yang berbayar dan ada yang tidak. Kali ini kita akan mencoba mengembangkan IoT dashboard menggunakan MQTT-InfluxDB-Grafana dan Raspberry pi 4 sebagai MQTT server serta Robotdyn Wifi D1R2 sebagai client yang mengirimkan data. Semua installasi software akan memanfaatkan Docker karena kemudahannya yang dapat menjalankan aplikasi dengan menggunakan container.

Diagram sederhana dari keseluruhan sistem dapat ditunjukkan pada gambar di bawah ini:

setup MQTT client
Diagram sederhana

Perangkat yang digunakan pada tutorial kali ini adalah:

Setup MQTT Client

Pada bagian pertama ini, akan di bahas mengenai wiring diagram dan Arduino sketch untuk system yang akan dikembangkan. Dalam pembuatan skema diagram elektronik, kita akan menggunakan software Fritzing.

Pada awal nya software Fritzing dapat di download dengan free, akan tetapi saat ini sudah tidak lagi karena para developer membutuhkan waktu dan tenaga untuk memelihari software ini terkait dengan fitur baru ataupun bugs. Namun, anda jangan sedih hati, karena terdapat versi Linux yang masih bisa didapatkan dengan free.

Jika anda menginginkan pembahasan lebih dalam mengenai Fritzing yang meliputi cara pemakaian dan tutorial, silahkan tinggalkan pesan pada kolom komentar postingan ini.

Kembali kepada topik project bagian pertama ini, koneksi rangkaian elektronik sistem yang akan kita bangun adalah sebagai berikut:

  • Vcc DHT11/22 dihubungkan pada 3.3V
  • GND pada GND
  • Pin data pada port digital 5 (D5)

Skema rangkaian elektronik tersebut dapat di lihat pada gambar di bawah ini: (menggunakan wemos D1R2, karena ketiadaan library Robotdyn D1R2 pada software Fritzing)

Langkah selanjutnya adalah coding sketch pada Arduino IDE.
Sebelum memulai coding, harus dipastikan bahwa library yang dibutuhkan sudah tersedia seperti: DHT, ESP8266Wifi dan PubSubClient. Untuk library Wemos D1R2 sudah terwakili jika anda telah menginstall ESP8266 Board.

setup MQTT client
Daftar library

Arduino code

Import library yang dibutuhkan pada IDE yang anda gunakan. Yaitu DHT, Pubsubclient dan ESP8266.

#include <DHT.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

Pendefinisian variable:

Pin yang digunakan untuk transmitting data sensor pada microcontroller adalah D5 dan tipe sensor temperature yang digunakan adalah DHT11. Topic MQTT yang akan kita subscribe kepada broker ada 3, yaitu humidity, temperature dan status (optional). Untuk menghemat penggunaan kapasitas memory pada SD Card yang digunakan, client dapat diperintahkan untuk mengirim topic message setiap 60 detik (60000 ms). Sedangkan untuk MQTT Client ID akan dijelaskan lebih lanjut pada tutorial lanjutan yaitu dengan membuat Python script yang digunakan untuk menghubungkan antara client dan server.

Untuk koneksi internet, anda dapat memasukkan SSID dan password sesuai dengan perangkat anda. MQTT_SERVER adalah IP address Raspberry Pi anda, dapat di cek ketika telah terhubung dengan router wifi.

Untuk alasan keamanan tambahan, anda dapat memasukkan password dan user name pada MQTT server raspberry sesuai dengan keingininan anda. Secara default, password dan username yang digunakan adalah “admin”. Cara untuk mengubah password tersebut akan dijelaskan pada bagian selanjutnya.

#define DHTPIN D5
#define DHTTYPE DHT11
#define MQTT_TOPIC_HUMIDITY "home/dht11/humidity"
#define MQTT_TOPIC_TEMPERATURE "home/dht11/temperature"
#define MQTT_TOPIC_STATE "home/dht11/status"
#define MQTT_PUBLISH_DELAY 60000
#define MQTT_CLIENT_ID "wemosdht11"
const char* WIFI_SSID = "ssid anda";
const char* WIFI_PASSWORD = "password anda";
const char *MQTT_SERVER = "192.168.2.144"; // MQTT IP address anda
const char *MQTT_USER = "admin" ; // NULL untuk tidak ada autentifikasi
const char *MQTT_PASSWORD = "admin" ; // NULL untuk tidak ada autentifikasi
float humidity;
float temperature;
long lastMsgTime = 0;
DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient mqttClient(espClient);

Setelah seluruh variable terdefinisikan, kita menuju pada programming utama.
Pada bagian fungsi setup, kita akan mengeksekusi empat kategori, yaitu pengecekan MAC Address (anda dapat mengabaikannya jika tidak diperlukan), konektifitas pada router, men-setting MQTT server dan inisialisasi pengambilan sensor data.

void setup() {
  Serial.begin(115200);
  while (! Serial);
  delay(500);
   Serial.println();
   Serial.print("MAC: ");
   Serial.println(WiFi.macAddress());
  setupWifi();
  mqttClient.setServer(MQTT_SERVER, 1883);
  dht.begin();
}

Pada bagian fungsi loop, terdapat tiga perintah utama, yaitu memastikan MQTT terkoneksi dengan baik, membaca sensor data dan mempublikasikannya kepada MQTT broker.

void loop() {
  if (!mqttClient.connected()) {
    mqttReconnect();
  }
  mqttClient.loop();
  long now = millis();
  if (now - lastMsgTime > MQTT_PUBLISH_DELAY) {
    lastMsgTime = now;

    // Membaca sensor data DHT11
    humidity = dht.readHumidity();
    temperature = dht.readTemperature();
    Serial.print("temperature:");
    Serial.println(temperature);
    if (isnan(humidity) || isnan(temperature)) {
      Serial.println("DHT11 sensor belum siap");
      return;
    }
    // Mempublikasikan sensor data
    mqttPublish(MQTT_TOPIC_TEMPERATURE, temperature);
    mqttPublish(MQTT_TOPIC_HUMIDITY, humidity);
  }
}

User defined function wifi dan IP address client yang digunakan pada fungsi setup.

void setupWifi() {
  Serial.print("Menyambungkan ke ");
  Serial.println(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi tersambung");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

User defined function yang digunakan pada fungsi loop untuk menyambungkan ulang pada MQTT Server. Hal ini diperlukan untuk memastikan konektivitas dengan MQTT broker masih tersambung, sebelum mengirimkan data pada broker.

void mqttReconnect() {
  while (!mqttClient.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Mencoba koneksi.
    if (mqttClient.connect(MQTT_CLIENT_ID, MQTT_USER, MQTT_PASSWORD, MQTT_TOPIC_STATE, 1, true, "disconnected", false)) {
      Serial.println("connected");
      // Seleah terkoneksi, publikasi hasil…
      mqttClient.publish(MQTT_TOPIC_STATE, "connected", true);
    } else {
      Serial.print("gagal, rc=");
      Serial.print(mqttClient.state());
      Serial.println(" coba lagi dalam 5 detik");
      delay(5000);
    }
  }
}

Arduino sketch lengkap dapat di download pada link di bawah ini:

[download_after_email id=429]

Setelah coding selesai, anda dapat meng-compile sketch tersebut lalu menguploadnya kepada microcontroller. Pastikan pemilihan port dan baud rate sudah benar serta gunakanlah kabel USB data berkualitas.

setup MQTT client
serial monitor

Untuk memastikan microcontroller menerima sketch dengan tepat. Anda dapat melihatnya pada serial monitor. Anda dapat melihat komunikasi dengan router berhasil. Namun, anda belum dapat berhasil komunikasi melalui protokol MQTT karena tutorial bagian 2 belum selesai.

Oleh karena itu, jangan lupa untuk tetap mengikuti rangkaian tutorial ini dan tetap menyimak dengan seksama.

Source Code:

Anda dapat mendowload source code lengkap pada link di bawah ini:

[wpsl_locker id="1619"]
Download file Anda
[/wpsl_locker]

Kesimpulan:

Kesimpulan pada tutorial bagian pertama ini, kita telah dapat membuat rangkaian elektronik sederhana dengan menggunakan software Fritzing. Lalu, membuat Arduino sketch pada IDE yang selanjutnya di upload kepada microcontroller. Pada bagian kedua kita akan fokus setup Raspberry Pi untuk dijadikan sebagai MQTT broker.

Terima kasih telah mengikuti bagian pertama ini, semoga membawa manfaat bagi siapa saja yang membacanya.

Jika ada masukan ataupun kritik anda dapat menulishkannya pada kolom komentar.
Sampai bertemu kembali pada bagian kedua.
Bagian kedua : klik disini

Assalamu alaikum wrwb

Anda dapat melihat video tutorial bagian pertama ini pada link berikut:

Muhammad Zacky Asy'ari
Saya seorang Engineer dan Tech Entrepreneur. Memiliki ketertarikan dalam bidang Internet of Things, data acquisition, data analytics dan visualization, machine learning, software testing, serta web design dan development.
Silahkan telusuri blog ini dengan senang hati :).

Terbaru

Copyright since @ 2020
linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram