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"}}]
沒有留言:
張貼留言