corbanmailloux / esp-mqtt-rgb-led

MQTT RGB LEDs Using JSON for Home Assistant
MIT License
270 stars 74 forks source link

To Run Simple LED from MQTT JSON in ESP32 #61

Closed ashish-iottive closed 3 years ago

ashish-iottive commented 3 years ago

I am trying to blink simple LED in ESP32 from JSON via MQTT but the code I run is compiled and flashed properly but It couldnt run properly. Could you please provide a simple firmware for blinking an LED from JSON via MQTT : In Below code I have published a JSON String {"Switch_Status":"FOR"}/ {"Switch_Status":"REV"}/ {"Switch_Status":"STOP"} but LED doesn't blink on this or it doesnt put the status in previous_state array:

#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
long last_time = 0;
char apName[] = "SmartDEVICE.";
char data[100];
// MQTT client
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient); 
char *mqttServer = "broker.hivemq.com";
int mqttPort = 1883;
const char *SSID = "Wifi_ID";
const char *PWD = "Password";
char previous_state[5];
int LED1=19;
int LED2=21;
void connectToWiFi() {
  Serial.print("Connectiog to ");

  WiFi.begin(SSID, PWD);
  Serial.println(SSID);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.print("Connected.");  
} 
void setupMQTT() {
  mqttClient.setServer(mqttServer, mqttPort);
  // set the callback function
  mqttClient.setCallback(callback);
}
void setup() {
  Serial.begin(115200);
     ##pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
connectToWiFi();
setupMQTT();
  }
void reconnect() {
  Serial.println("Connecting to MQTT Broker...");
  while (!mqttClient.connected()) {
      Serial.println("Reconnecting to MQTT Broker..");
      String clientId = "ESP32Client-";
      clientId += String(random(0xffff), HEX);
       if (mqttClient.connect(clientId.c_str())) {
        Serial.println("Connected.");
        // subscribe to topic
        mqttClient.subscribe("swa/commands");
      }
      }
}
void loop() {
if (!mqttClient.connected())
    reconnect();
   mqttClient.loop();
   StaticJsonBuffer<200> JSONbuffer;
  JsonObject& JSONencoder = JSONbuffer.createObject();
  JSONencoder["Device_Name"] = apName;
  JSONencoder["Wifi_Status"]= "Wifi_OK";
  JSONencoder["LED_Status"]= previous_state;
 char JSONmessageBuffer[200];
  JSONencoder.printTo(JSONmessageBuffer, sizeof(JSONmessageBuffer));
  Serial.println("Sending message to MQTT topic..");
  Serial.println(JSONmessageBuffer);
 mqttClient.publish("esp/test", JSONmessageBuffer) ;
  if (mqttClient.publish("esp/test", JSONmessageBuffer) == true) {
    Serial.println("Success sending message");
  } else {
    Serial.println("Error sending message");
  }
  Serial.println("-------------");
  delay(5000);
  }
void callback(char* topic, byte* payload, unsigned int length) {
  StaticJsonBuffer<200> JSONBuffer;
  char JSONinData[150];
  Serial.print("Callback From- ");
  Serial.println(topic);
    Serial.print("data:");  
   Serial.print("payload: ");
  for(int i =0; i<length; i++){
  Serial.print((char)payload[i]);
   JSONinData[i] = (char)payload[i];
 }
 Serial.println();
 JsonObject& parsed = JSONBuffer.parseObject(JSONinData);  
if (!parsed.success()) {   //Check for errors in parsing
 Serial.println("Parsing failed");
    delay(2000);
    return;
 }
const char * val= parsed["Switch_Status"];
// DO SOMETHING WITH THE DATA THAT CAME IN!
 Serial.println("Parsed Data:");
 Serial.println(val); 
if( val=="FOR"){
  digitalWrite(LED1,HIGH);
  Serial.println("LED1 is ON");
  strcpy(previous_state , (const char*)parsed["LED_Status"]);
}
else if(val=="REV"){
  digitalWrite(LED2,HIGH);
  Serial.println("LED2 is ON");
  strcpy(previous_state , (const char*)parsed["LED_Status"]);
}
// change the return type of the function
else if(val =="STOP")
{
    digitalWrite(LED1,LOW);
      digitalWrite(LED2,LOW);
      strcpy(previous_state , (const char*)parsed["LED_Status"]);
}
}