Arduino ed mqtt, migliorare il codice

Ciao a tutti.

Sto implementando un piccolo progettino per far si che Arduino collegato in wifi allar ete domestica scambi messaggi MQTT con altri dispositivi e faccia altre operazioni.

Sono riuscito a scambiare messaggi tra arduino ed il broker, nessun problema. Il punto critico di questo sketch, consiste nel fatto che se per caso dovesse cadere la connessione mqtt con il broker, il mio codice resta piantanto nell loop nel metodo reconnectMqtt.

Ci sarebbe la possibiltà di ovviamere a questa cosa ? Ricordo che inizialmente facevo la stessa cosa per collegarmi al wifi, poi grazie al forum ho scoperto che mettendo il .begin(), in caso di perdita di connessione arduino si sarebbe collegato da solo non appena fosse tornato disponibile il wifi non restando piantanto in qualche metodo. Spero di essermi spiegato.

Vi posto un pò di codice.

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <EEPROM.h>
#include <ESP8266HTTPClient.h>
#include <WiFiUdp.h>

#include <DS3231.h>
#include <Wire.h>
DS3231 Clock;

//mqtt
WiFiClient mqttClient;
PubSubClient clientMqtt(mqttClient);
long lastMsg = 0;
char msg[50];
char msgMqtt[50];
int value = 0;
char* mqtt_server = "";
const char* subscriberChannelLightStatus = "lightBulbStatus";
const char* publishChannel = "lightBulb";
IPAddress ipStatic;
bool activeMqtt;
int nPortMqtt = 1883;
byte ipMqtt[] = {0};
//

char eeprom_ssd = 30;
char eeprom_pwd = 50;
char eeprom_ip = 0;
char eeprom_subnet = 4;
char eeprom_gateway = 8;
char eeprom_mqttEnabled = 13;
char eeprom_mqttIP = 14;
char eeprom_timer = 100; //va da 100 a 120

WiFiServer server(80);
String header;
//configurazione centraline


char daysOfTheWeek[7][12] = {"Domenica", "Lunedi", "Martedi", "Mercoledi", "Giovedi", "Venerdi", "Sabato"};

unsigned long DELAY_TIMER_DISPLAY = 60000; // 1 minuti
unsigned long delayStartTimerDisplay = 0; // the time the delay started
//SINCRONIZZAZIONE OROLOGIO CON ORA INTERNET
long DELAY_TIMER = 43200000; // 12 ORE
long delayStartTimer = 0; // the time the delay started
//TIMER SINCRONIZZAZIONE TEMPERATURA
long DELAY_TIMER_TEMPERATURE = 1800000;// 30 minuti
long delayStartTimerTemperature = 0; // the time the delay started
//TIMER PER LA SINCRONIZZAZIONE DELLO STATO DELLE LUCI
long DELAY_TIMER_BULB_STATUS = 600000;//10 minuti
long delayStartTimerBulbStatus = 0; // the time the delay started
bool startBulbStatus = true;

//variabile utilizata per verificare se devo aggiornare la data oppure no
int lastDaySync = -1;

HTTPClient http;


void setup() {
  Serial.begin(9600);
  EEPROM.begin(512);
  Wire.begin();

  
  ConnectWiFi();
  
  
  if(activeMqtt){
    Serial.print("ipmqttserver ");Serial.println(mqtt_server);
    clientMqtt.setServer(mqtt_server, nPortMqtt);
    clientMqtt.setCallback(callback);
    Serial.println("ho finito di settare lmqtt");
  }
  timeClient.begin();
  server.begin();
  setupTime();
}

void loop() {
  if(activeMqtt){
    if (!clientMqtt.connected()) {
      reconnectMqtt();
    }
    clientMqtt.loop();
  }
  
  //TIMER PER SINCRONIZZARE la temperatura
    if((millis() - delayStartTimerTemperature) >= DELAY_TIMER_TEMPERATURE){
      Serial.println("timer per la sincronizzazione della temperatura");
      delayStartTimerTemperature += millis(); // this prevents drift in the delays
      eseguiAzione1();
    }
  
  //OTHER METHOD
  //TODO
}

bool ConnectWiFi() {
    
    int cont = 0;
    while (WiFi.waitForConnectResult() != WL_CONNECTED) {
     
      delay(200);
      Serial.println(WiFi.status());
      Serial.println(WL_CONNECTED);
      WiFi.disconnect();
      delay(5000);
     // WiFi.config(ip, gateway, subnet);
      cont = cont + 1;
      if(cont == 5){
        //non riesce a collegarsi alla rete wifi.
        startAPMode();
        break;
      }
    }
    if(cont < 5){
      ipMqtt[0] = getAddressIpMqtt(eeprom_mqttIP);
      activeMqtt = checkActivateMqtt(eeprom_mqttEnabled);
      String nuovoMqtt = (String(ip[0])+"."+String(ip[1])+"."+String(ip[2])+"."+String(ipMqtt[0]));
      nuovoMqtt.toCharArray(mqtt_server, 15);
    }
    Serial.flush();
  
 return true;
}

void startAPMode(){
  WiFi.mode(WIFI_AP);
  WiFi.softAP("Mic", "pas");
  activeMqtt=false;
}


void syncTemperatura(){
  http.begin("http://" + IP_ARDUINO + "TEMP");
  int httpCode = http.GET();                                                                  //Send the request
  if (httpCode > 0) { //Check the returning code
    String payload = http.getString();   //Get the request response payload
    //parserizzo la temperatura 
    String temperatura = getValueFromStringHTTP(payload, '

, 1);
    Serial.println(temperatura);                    //Print the response payload
    char copyData[temperatura.length() + 1];
    temperatura.toCharArray(copyData, temperatura.length() + 1);     
    textTemperatura.setText(copyData);
    textTemperatura.setText(copyData);
  }
  http.end();  //Close connection
}

//7
IPAddress getAddressIp(char add){
  int id1 = EEPROM.read(add);
  if(id1 == 146){
    id1 = 192;
  }
  int id2 = EEPROM.read(add+1);
  int id3 = EEPROM.read(add+2);
  int id4 = EEPROM.read(add+3);
  IPAddress ip (id1,id2,id3,id4);
  return ip;
}
void callback(char* topic, byte* payload, unsigned int length) {
  //TODO
}

void reconnectMqtt() {
  // Loop until we're reconnected
  ipStatic = getAddressIp(eeprom_ip);
  while (!clientMqtt.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "TouchScreen-"+String(ipStatic[0])+"."+String(ipStatic[1])+"."+String(ipStatic[2])+"."+String(ipStatic[3]);
    // Attempt to connect
    if (clientMqtt.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      char* messageToPublish ="Monitor TOuch connesso.";
      clientMqtt.publish(publishChannel, messageToPublish);
      // ... and resubscribe
      clientMqtt.subscribe(subscriberChannelLightStatus);
    } else {
      Serial.print("failed, rc=");
      Serial.print(clientMqtt.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}