Node-red MQTT và ESP8266phối hợp với nhau thì sẽ như thế nào ? Trong bài viết này mình sẽ hướng dẫn về cách để tạo broker MQTT để sử dụng ở local, dùng Node-red tạo giao diện điều khiển ON/OFF cho LED trên NodeMCU(ESP8266) qua MQTT

Bắt đầu

Để bắt đầu thì mình nghĩ chúng ta nên xem lại bài viết về MQTT với ESP8266 để có thể nắm qua được 1 số khái niệm cơ bản cũng như cách thực hiện điều khiển LED thông qua Cloud MQTT có sẵn.

Thứ 2 là bạn xem qua bài Node-RED cơ bản để mình nắm được cách cài Node-RED và tạo giao diện với Node-RED dashboard luôn.

Vậy bài này sẽ có gì khác so với bài trước ?

  • Không sử dụng GUISocket trên CloudMQTT để gõ lệnh điều khiển nữa mà thay vào đó là tạo một giao diện với Node-RED để điều khiển
  • Không sử dụng CloudMQTT nữa mà cài đặt MQTT trên Ubuntu, ở đây mình dùng Mosquitto.

Tạm thời là như thế, mình bắt đầu vào các bước thực hiện thôi

Cài đặt Mosquitto

Trước tiên mình sẽ cài đặt Mosquitto Broker.

Các bạn cài đặt theo các lệnh sau

$ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
$ sudo apt-get update
$ sudo apt-get install mosquitto
$ sudo apt-get install libmosquitto-dev
$ sudo apt-get install mosquitto-clients
$ sudo service mosquitto status

Vậy là xong các bước cài đặt, giờ mình thử test MQTT hoạt động chút xem

Bước 1: Tạo subscriber với topic là “Sensor_MQTT”, subscriber ngày chỉ ngồi hóng hớt xem có anh nào publish lên không

$ mosquitto_sub -h localhost -t "Sensor_MQTT" -v

Bước 2: Tạo publisher, publish này sẽ gửi tin “Error Sensor” lên topic “Sensor_MQTT”

$ mosquitto_pub -h localhost -t "Sensor_MQTT" -m "Error_Sensor"

Bước 3: Thay đổi một chút về tin gửi lên là “Temp_Sensor” và “Soil_Sensor” và kiểm tra kết quả trên subscriber

$ mosquitto_pub -h localhost -t "Sensor_MQTT" -m "Temp_Sensor"
$ mosquitto_pub -h localhost -t "Sensor_MQTT" -m "Soil_Sensor"

Bước 4: Thay đổi topic dưới publisher là “ABC_MQTT” và kiểm tra trên sub, khác topic là không nhận được gì cả

$ mosquitto_pub -h localhost -t "ABC_MQTT" -m "Error_Sensor"

Các bạn có thể xem kết quả hình dưới

Lập trình ESP8266

Mình sẽ thực hiện lập trình với ESP8266 có 2 nhiệm vụ, 1 là pub dữ liệu lên với dòng Helloword # x, 2 là sub dữ liệu điều khiển ON/OFF. Chương trình vẫn dùng thư viện sẵn có là Pubsubclient, LED tận dụng LED có sẵn trên NodeMCU ở chân D0.

Có một số lưu ý:

  • Thay đổi thông tin wifi và server cho phù hợp của bạn
  • LED có sẵn trên NodeMCU kích ON ở mức LOW và OFF ở HIGH.
  • Nhận lệnh 1 thì bật LED, 0 thì tắt LED.
  • Topic điều khiển LED ở đây là event.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// bạn thay đổi thông tin bên dưới cho phù hợp
const char* ssid =         "ten_wifi";
const char* password =    "mat_khau";
const char* mqtt_server = "ip_may_cai_node_red";   /// lấy ip bằng lệnh ifconfig, ví dụ 192.168.1.105
const uint16_t mqtt_port = 1883;
const byte ledPin = D0;
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup() {
  pinMode(ledPin, OUTPUT);     // Khởi tạo LED
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
}

void setup_wifi() {

  delay(10);
  // Kết nối wifi
  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 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();

  // Bật LED nếu nhận được lệnh là 1
  if ((char)payload[0] == '1') {
     Serial.println("ON");
    digitalWrite(ledPin, LOW);   // LED có sẵn trên NodeMCU bật ở mức 0(LOW)
  } 
  // Tắt LED nếu nhận được lệnh là 0
 if ((char)payload[0] == '0') {
    Serial.println("OFF");
    digitalWrite(ledPin, HIGH);  // LED tắt ở mức 1(HIGH)
  }

}

void reconnect() {
  // Đợi tới khi kết nối
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");

    if (client.connect("ESP8266Client")) {
      Serial.println("connected");
      // Khi kết nối thành công sẽ gửi chuỗi helloworld lên topic event
      client.publish("event", "hello world");
      // ... sau đó sub lại thông tin
      client.subscribe("event");
    } 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();
 // Thực hiện 2s gửi dữ liệu helloworld lên broker 1 lần
  long now = millis();
  if (now - lastMsg > 2000) {
    lastMsg = now;
    ++value;
    snprintf (msg, 75, "hello world #%ld", value);
    Serial.print("Publish message: ");
    Serial.println(msg);
    client.publish("event", msg);
  }
}

Tạo giao diện với Node-RED

Bước 1: Mở node-red

$ cd node-red
$ node red

Bước 2: Kiểm tra kết nối

Kết quả

Bước 3: Tạo giao diện nút nhấn ON OFF

Tạo nút

Cấu hình

Kết quả debug sau khi bấm thử trên giao diện

Kết quả thực tế

Nếu phát triển 1 một chút nữa ta sẽ có hệ thống dùng với MQTT Node-red ESP8266 như sau, phần này xin hẹn các bàn ở bài viết khác trong series nodered

Tạm kết

Coi như mình đã thực hiện được cài đặt MQTT Broker để sử dụng trên máy tính sử dụng Ubuntu, kết nối và điều khiển bật tắt LED trên hardware là ESP8266. Đây mới chỉ là mức độ làm quen và tìm hiểu, các bạn muốn tìm hiểu thêm về node-red có thể tham khảo thêm tại nodered.org.