salve a tutti
dal seriale vedo che spesso si riconnette al server MQTT
Connecting to MQTT... MQTT Connected!
e questo genera una nuova sottoscrizione attivando il rele. Non riesco a trovare l'errore, qualche aiuto?
grazie. Questo il codice:
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <IRsend.h>
#include <ArduinoOTA.h>
#include <IRremoteESP8266.h>
#include <WiFiUdp.h>
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
IPAddress staticIP(xxx, xxx, x, xxx); //ESP static ip
IPAddress gateway(xxx, xxx, x, x); //IP Address of your WiFi Router (Gateway)
IPAddress subnet(255, 255, 255, 0); //Subnet mask
IPAddress dns(8, 8, 8, 8); //DNS
//const char *wifi_ssid = "xxxxxxx";
//const char *wifi_password = "xxxxxxx";
#define wifi_ssid "xxxxxx"
#define wifi_password "xxxxxx"
/************************* MQTT Broker Setup *********************************/
#define mqtt_server "xxx.xxx.x.x"
#define mqtt_serverport 1883 // use 8883 for SSL
#define mqtt_username "xxxx"
#define mqtt_password "xxxx"
/************************* Constants, Variables, Integers, etc *********************************/
const int BLINK = 0; //D3
const int relayPin = 5;// D1
int value = 0;
int relayState = LOW;
const long togDelay = 100; // pause for 100 milliseconds before toggling to Open
const long postDelay = 200;
IRsend irsend(4);
WiFiClient client;
// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, mqtt_server, mqtt_serverport, mqtt_username, mqtt_password);
// Setup subscription 'Robo500' for monitoring topic for changes.
Adafruit_MQTT_Subscribe Robo500 = Adafruit_MQTT_Subscribe(&mqtt, "openhab/out/Robo500/command");
void MQTT_connect();
//==============================================================
// SETUP
//==============================================================
void setup() {
ArduinoOTA.onStart([]() {
Serial.end();
});
Serial.begin(115200);
Serial.print("Connecting to ");
Serial.println(wifi_ssid);
WiFi.begin(wifi_ssid, wifi_password);
WiFi.config(staticIP, subnet, gateway, dns);
// WiFi.mode(WIFI_STA); //WiFi mode station (connect to wifi router only
ArduinoOTA.setHostname("Domotica_Ufficio_2.0");
ArduinoOTA.begin();
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("WiFi connected at IP address: ");
Serial.println(WiFi.localIP());
irsend.begin();
pinMode(BLINK, OUTPUT);
pinMode(relayPin, OUTPUT);
mqtt.subscribe(&Robo500);
}
//==============================================================
// LOOP
//==============================================================
void loop(){
ArduinoOTA.handle();
//WiFiClient client;
if (WiFi.status() == WL_CONNECTED) {
digitalWrite(BLINK, HIGH);
delay(20);
digitalWrite(BLINK, LOW);
delay(20);
}
MQTT_connect();
Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt.readSubscription(5000))) {
if (subscription == &Robo500) {
Serial.print(F("Got: ")); Serial.println((char *)Robo500.lastread);
// close the relay for 100 ms
Serial.println("Close Relay for 100 ms & then Open");
digitalWrite(relayPin, HIGH);
delay(togDelay);
digitalWrite(relayPin, LOW);
delay(postDelay);
}
}
}
// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
int8_t ret;
// Stop if already connected.
if (mqtt.connected()) {
return;
}
Serial.print("Connecting to MQTT... ");
uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying MQTT connection in 5 seconds...");
mqtt.disconnect();
delay(5000); // wait 5 seconds
retries--;
if (retries == 0) {
// basically die and wait for WDT to reset me
while (1);
}
}
Serial.println("MQTT Connected!");
}