2024年12月28日 星期六

Exploring Node-Red, Dashboard 2.0, and MQTT

 Exploring Node-Red, Dashboard 2.0, and MQTT

參考來源https://www.donskytech.com/node-red-dashboard-2-0-mqtt/#google_vignette







#include <Arduino.h>
#include <ESP32Servo.h>
#include <WiFi.h>
#include <PubSubClient.h>

// Update these with your Wi-Fi and MQTT broker details
//const char *ssid = "<CHANGE_TO_YOUR_WIFI_SSID>";
//const char *password = "<CHANGE_TO_YOUR_WIFI_PASSWORD>";
const char *ssid= "Wokwi-GUEST";
const char *password= "";

//const char *mqtt_server = "<CHANGE_TO_YOUR_MQTT_SERVER_IP>";
//const char *mqtt_server = "test.mosquitto.org";
const char *mqtt_server = "broker.mqttgo.io";
const char *mqtt_username = "alex9ufo";
const char *mqtt_password = "public";
const int mqtt_port = 1883;


WiFiClient espClient;
PubSubClient client(espClient);

const char *mqttToggleLEDTopic = "alex9ufo/toggle-led";
const char *mqttRGBColorSetTopic = "alex9ufo/rgb-color-set";
const char *mqttServoPositionSetTopic = "alex9ufo/servo-position-set";

// LED PIN Setup
const int LED_PIN = 32;

// RGB LED PIN Setup
const int redPin = 33;
const int greenPin = 25;
const int bluePin = 26;

// Servo PinSetup
int const servoPin = 27;
Servo servoMotor;
int pos = 0;
String payloadStr="";
String payloadStr1="";
String payloadStr2="";
String payloadStr3="";
bool LedFlag=false;
bool RGBFlag=false;
bool ServoFlag=false;

//  Forward Declaration
void processMessage(const char *topic, const char *message);
void moveServo(int position);
void setupWifi();
void mqttCallback(char *topic, byte *payload, unsigned int length);
void reconnect();
void handleLedMessage(String payload);
void handleRgbMessage(String payload);
void handleServoMessage(String payload);

//=================================================================
void setup()
{
  Serial.begin(115200);
  // Setup WiFi connection details
  setupWifi();
  // Setup MQTT Connection
  client.setServer(mqtt_server, 1883);
  client.setCallback(mqttCallback);
  while (!client.connected()) {
    String client_id = "esp32-client-";
    client_id += String(WiFi.macAddress());
    Serial.printf("The client %s connects to the public MQTT broker\n", client_id.c_str());
    if (client.connect(client_id.c_str())) {
      Serial.println("Public broker.mqttgo.io connected");
    } else {
      Serial.print("Failed with state ");
      Serial.print(client.state());
      delay(200);
    }
  }

  // Publish and subscribe
  client.subscribe(mqttToggleLEDTopic);
  client.subscribe(mqttRGBColorSetTopic);
  client.subscribe(mqttServoPositionSetTopic);

  // Initialize other setup tasks if needed
  pinMode(LED_PIN, OUTPUT);
  // RGB LED
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);

  // Allow allocation of all timers
  ESP32PWM::allocateTimer(0);
  ESP32PWM::allocateTimer(1);
  ESP32PWM::allocateTimer(2);
  ESP32PWM::allocateTimer(3);
  servoMotor.setPeriodHertz(50);           // standard 50 hz servo
  servoMotor.attach(servoPin, 500, 2450); // attaches the servo on pin 18 to the servo object
  moveServo(0);

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

  //LedFlag=false;
  //RGBFlag=false;
  //ServoFlag=false;
  if (LedFlag==true){
    handleLedMessage(payloadStr1);
  }
  if (RGBFlag==true){
    handleRgbMessage(payloadStr2);
  }

  if (ServoFlag==true){
    handleServoMessage(payloadStr3);
  }

}
//=================================================================
void setupWifi()
{
  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 mqttCallback(char *topic, byte *payload, unsigned int length)
{

  payloadStr = "";
  for (int i = 0; i < length; i++)
  {
    payloadStr += (char)payload[i];
  }

  Serial.print("Received message on topic '");
  Serial.print(topic);
  Serial.print("': ");
  Serial.println(payloadStr);

  if (strcmp(topic, mqttToggleLEDTopic) == 0)
  {
    //handleLedMessage(payloadStr);
    LedFlag=true;
    //RGBFlag=false;
    //ServoFlag=false;
    payloadStr1=payloadStr;
    Serial.println("LEDTopic");
  }
  else if (strcmp(topic, mqttRGBColorSetTopic) == 0)
  {
    //handleRgbMessage(payloadStr);
    //LedFlag=false;
    RGBFlag=true;
    //ServoFlag=false;
    payloadStr2=payloadStr;
    Serial.println("RGBColorSetTopic");
  }
  else if (strcmp(topic, mqttServoPositionSetTopic) == 0)
  {
    //handleServoMessage(payloadStr);
    //LedFlag=false;
    //RGBFlag=false;
    ServoFlag=true;
    payloadStr3=payloadStr;
    Serial.println("ServoPositionSetTopic");
  }
}
//=================================================================
void reconnect()
{
  while (!client.connected())
  {
    Serial.print("Attempting MQTT connection...");
    if (client.connect("ESP32Client"))
    {
      Serial.println("connected");
      client.subscribe(mqttToggleLEDTopic);
      client.subscribe(mqttRGBColorSetTopic);
      client.subscribe(mqttServoPositionSetTopic);
    }
    else
    {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}
//=================================================================
void handleLedMessage(String payload)
{
  if (payload.equals("true"))
  {
    digitalWrite(LED_PIN, HIGH);
  }
  else if (payload.equals("false"))
  {
    digitalWrite(LED_PIN, LOW);
  }
  LedFlag=false;
}
//=================================================================
void handleRgbMessage(String payload)
{
  if (payload.equals("red"))
  {
    analogWrite(redPin, 255);
    analogWrite(greenPin, 0);
    analogWrite(bluePin, 0);
  }
  else if (payload.equals("green"))
  {
    analogWrite(redPin, 0);
    analogWrite(greenPin, 255);
    analogWrite(bluePin, 0);
  }
  else if (payload.equals("blue"))
  {
    analogWrite(redPin, 0);
    analogWrite(greenPin, 0);
    analogWrite(bluePin, 255);
  }
  RGBFlag=false;
}
//=================================================================
void handleServoMessage(String payload)
{
  int angle = payload.toInt();
  moveServo(angle);
  Serial.println("Servo angle");
  Serial.print(payload);
  ServoFlag=false;
}
void moveServo(int position)
{
  // Set the servo position
  servoMotor.write(position);

  // Wait for some time
  delay(20);
}
//=================================================================

















[{"id":"b2bb172812ed38f1","type":"change","z":"a987cef8cc2a4969","name":"LED Change Node","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload","tot":"msg"},{"t":"set","p":"topic","pt":"msg","to":"alex9ufo/toggle-led","tot":"str"},{"t":"set","p":"qos","pt":"msg","to":"1","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":180,"wires":[["85863a8138b0e5e2","54477ffaad79ce3b"]]},{"id":"d9df1738aa969f87","type":"ui-switch","z":"a987cef8cc2a4969","name":"LED Switch","label":"Toggle LED","group":"d5182ebc903db295","order":0,"width":0,"height":0,"passthru":false,"topic":"topic","topicType":"msg","style":"","className":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":150,"y":180,"wires":[["1329aba795b1bfe6","b2bb172812ed38f1"]]},{"id":"328761331ad9c03e","type":"ui-radio-group","z":"a987cef8cc2a4969","group":"e03d82c24d1a7eae","name":"RGB Select","label":"Choose Color","order":0,"width":0,"height":0,"columns":1,"passthru":false,"options":[{"label":"RED","value":"red","type":"str"},{"label":"GREEN","value":"green","type":"str"},{"label":"BLUE","value":"blue","type":"str"}],"payload":"","topic":"topic","topicType":"msg","className":"","x":150,"y":280,"wires":[["1329aba795b1bfe6","9560459d89e7533a"]]},{"id":"e25eddd1db26d7cd","type":"ui-slider","z":"a987cef8cc2a4969","group":"8f4d7928695ce3bd","name":"Servo movement","label":"Set Servo position","tooltip":"","order":0,"width":0,"height":0,"passthru":true,"outs":"all","topic":"topic","topicType":"msg","thumbLabel":true,"min":0,"max":"180","step":"5","className":"","x":170,"y":360,"wires":[["1329aba795b1bfe6","8e4a60f83bc455ce"]]},{"id":"1329aba795b1bfe6","type":"ui-notification","z":"a987cef8cc2a4969","ui":"5f69714a569ee0a1","position":"top right","colorDefault":true,"color":"#000000","displayTime":"3","showCountdown":true,"outputs":0,"allowDismiss":true,"dismissText":"Close","raw":false,"className":"","name":"Notification","x":510,"y":440,"wires":[]},{"id":"85863a8138b0e5e2","type":"mqtt out","z":"a987cef8cc2a4969","name":"MQTT","topic":"","qos":"1","retain":"true","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"70940176.2b2d3","x":750,"y":280,"wires":[]},{"id":"9560459d89e7533a","type":"change","z":"a987cef8cc2a4969","name":"RGB Change Node","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload","tot":"msg"},{"t":"set","p":"topic","pt":"msg","to":"alex9ufo/rgb-color-set","tot":"str"},{"t":"set","p":"qos","pt":"msg","to":"1","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":470,"y":280,"wires":[["85863a8138b0e5e2","54477ffaad79ce3b"]]},{"id":"54477ffaad79ce3b","type":"debug","z":"a987cef8cc2a4969","name":"debug 236","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":730,"y":360,"wires":[]},{"id":"8e4a60f83bc455ce","type":"change","z":"a987cef8cc2a4969","name":"Servo  Change Node","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload","tot":"msg"},{"t":"set","p":"topic","pt":"msg","to":"alex9ufo/servo-position-set","tot":"str"},{"t":"set","p":"qos","pt":"msg","to":"1","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":480,"y":360,"wires":[["85863a8138b0e5e2","54477ffaad79ce3b"]]},{"id":"d5182ebc903db295","type":"ui-group","name":"LED Group","page":"d8895f64e5488e59","width":"6","height":"1","order":-1,"disp":true,"className":""},{"id":"e03d82c24d1a7eae","type":"ui-group","name":"RGB Group ","page":"d8895f64e5488e59","width":"6","height":"1","order":-1,"disp":true,"className":""},{"id":"8f4d7928695ce3bd","type":"ui-group","name":"Servo Group ","page":"d8895f64e5488e59","width":"6","height":"1","order":-1,"disp":true,"className":""},{"id":"5f69714a569ee0a1","type":"ui-base","name":"Node-Red MQTT","path":"/dashboard"},{"id":"70940176.2b2d3","type":"mqtt-broker","name":"","broker":"broker.mqttgo.io","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"15","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"sessionExpiry":""},{"id":"d8895f64e5488e59","type":"ui-page","name":"Home","ui":"5f69714a569ee0a1","path":"/home","layout":"notebook","theme":"2816b624b977ab0a","order":-1,"className":""},{"id":"2816b624b977ab0a","type":"ui-theme","name":"Node-Red MQTTTheme ","colors":{"surface":"#ffffff","primary":"#0094ce","bgPage":"#eeeeee","groupBg":"#ffffff","groupOutline":"#cccccc"}}]



沒有留言:

張貼留言

作業2 MQTT (Relay + DHT22) 控制 ------- 利用Node-Red

作業2 MQTT (Relay + DHT22) 控制 ------- 利用Node-Red 1) 安裝Node-Red  https://ithelp.ithome.com.tw/articles/10201795 https://www.youtube.com/watch?v...