Hello! Please help me with the code. I have a problem with controlling light bulbs while connecting or reconnecting wifi or mqtt. That is, if I am reconnecting wifi or mqtt, I cannot use the buttons to control the light bulbs. Thank you very much in advance)
#include <ezButton.h>
#include <WiFi.h>
#include <PubSubClient.h>
// WiFi
const char *ssid = "KSI";
const char *password = "!#ksi33#!";
// MQTT Broker
const char *mqtt_broker = "192.168.82.43";
const char *topic_1 = "esp32/led1";
const char *topic_2 = "esp32/led2";
const char *mqtt_username = "smart";
const char *mqtt_password = "Trimble2228";
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
/// constants won't change
const int BUTTON_PIN_1 = 26;
const int BUTTON_PIN_2 = 25;
const int LED_PIN_1 = 4;
const int LED_PIN_2 = 2;
ezButton button_1(BUTTON_PIN_1);
ezButton button_2(BUTTON_PIN_2);
// variables will change:
int ledState_1 = LOW; // the current state of LED
int ledState_2 = LOW;
void setup() {
Serial.begin(115200);
WiFi.disconnect(true);
delay(1000);
WiFi.onEvent(WiFiStationDisconnected, SYSTEM_EVENT_STA_DISCONNECTED);
pinMode(LED_PIN_1, OUTPUT);
pinMode(LED_PIN_2, OUTPUT);
button_1.setDebounceTime(50);
button_2.setDebounceTime(50);
setup_wifi();
client.setServer(mqtt_broker, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
button_1.loop();
button_2.loop();
if(button_1.isPressed()) {
ledState_1 = !ledState_1;
digitalWrite(LED_PIN_1, ledState_1);
char val[5];
itoa(ledState_1, val, 10);
client.publish("esp32/led1_st", val);
}
if(button_2.isPressed()) {
ledState_2 = !ledState_2;
digitalWrite(LED_PIN_2, ledState_2);
char val[5];
itoa(ledState_2, val, 10);
client.publish("esp32/led2_st", val);
}
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
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* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
if (String(topic) == "esp32/led1") {
Serial.print("Changing led1_st to ");
if(messageTemp == "1"){
Serial.println("on");
digitalWrite(LED_PIN_1, HIGH);
ledState_1 = HIGH;
}
else if(messageTemp == "0"){
Serial.println("off");
digitalWrite(LED_PIN_1, LOW);
ledState_1 = LOW;
}
}
if (String(topic) == "esp32/led2") {
Serial.print("Changing led2_st to ");
if(messageTemp == "1"){
Serial.println("on");
digitalWrite(LED_PIN_2, HIGH);
ledState_2 = HIGH;
}
else if(messageTemp == "0"){
Serial.println("off");
digitalWrite(LED_PIN_2, LOW);
ledState_2 = LOW;
}
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()){
String client_id = "esp32-client-";
//client_id += String(WiFi.macAddress());
if (client.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
client.subscribe(topic_1);
client.subscribe(topic_2);
} else {
delay(2000);
}
}
}
void WiFiStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info){
Serial.println("Disconnected from WiFi access point");
Serial.print("WiFi lost connection. Reason: ");
Serial.println(info.disconnected.reason);
Serial.println("Trying to Reconnect");
setup_wifi();
}