Far convivere MQTT ed Arduino HTTP Server, come posso fare?

Ho scritto nel lontano 2013 un codice con cui ho realizzato una piccola domotica con una Mega ed un'app scritta da me appositamente per Android.

Dopo i primi tre anni di deprimenti reset della board dovuti ai ben noti problemi dei blocchi della Shield ETH v.1, nel 2016 ho deciso di sostituirla con la v.2 e da allora sono rinato e non ho mai più avuto alcun blocco.

Il sistema funziona in questo modo:
ho 5 DHT22 per rilevare le temperature interne, 2 DHT21 per rilevare le temperature esterne, 1 Dallas per rielvare la temperatura del congelatore, una shield relè per comandare l'apertura e la chiusura della tenda da sole ed un potenziometro che ne rileva la percentuale di aperura, ed infine un contatore monofase per rilevare la potenza impegnata collegata al quadro elettrico principale.

Il sistema interroga i sensori ed attende una chiamata Json per inviare i dati alla mia App Android.

Fin'ora tutto ok tranne i primi anni di sbattimento a causa della ETH.

Ora mi è venuta la sana pazzia di integrare Home Assistant (HASSIO) e modificare il mio sketch con MQTT per pubblicare i dati dei sensori ad HASSIO.

Il tutto funziona piuttosto bene tranne due gravi problemi:
Il primo è che se per qualche motivo riavvio o spengo il Broker MQTT su HASSIO, il mio sketch va in blocco perchè tenta continuamente di ricollegarsi al Broker e non posso più interrogarlo con JSON.
Ho fatto una prova a pingare la ETH di arduino e mi risponde ma se chiedo di inviarmi i dati JSON resta impallato.
Consigli?

Il secondo problema non so se è software o hardware ma credo di dover fare un post a parte. In pratica ricevo errori di lettura NAN su uno dei sensori DHT22 che è collegato con circa 15/20 metri di cavo ethernet ma, devo verificare se condivide l'alimentazione con il Dallas (sono passati troppi anni da quando lo montai).
Allego una foto delllo schema dei miei collegamenti.

>ziopippo: per evitare un fastidioso "bug" del forum ti prego di leggere e di tenere conto, per il futuro, di quanto scritto QUI. Grazie

Guglielmo

P.S.: L'ho fatto io nei post qui sopra

Grazie Guglielmo non ero a conoscenza di queso "bug". Non allegavo immagini a questo forum da diversi anni.
:wink:

Da qualche parte tipo qui: Simultaneous MQTT and HTTP POST - Networking, Protocols, and Devices - Arduino Forum ho letto che bisognerebbe avviare due ethernet client.
Come fare nel mio caso?
Posto degli spezzoni del mio codice diviso in più post dovuti ai limiti del forum:

#include <SPI.h>
#include <Ethernet2.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include <DHT.h>

// MQTT related objects
#include <PubSubClient.h>
#define mqtt_username "mqtt_user" // inserire qui l'username messo in Mosquito Broker
#define mqtt_password "mqtt_password" // inserire qui la password messa in Mosquito Broker
IPAddress servermqtt(192, 168, 1, 200); // Inserire qui l'Ip del Rasberry su cui c'è Mosquito Broker
EthernetClient ethClient;
PubSubClient mqttClient(ethClient);


//Inizializzo l'Ethernet Shield di Arduino
byte macAddress [] = { 0x90, 0xA2, 0xDA, 0x10, 0xF5, 0xF7 }; //Indirizzo MAC Ethernet Shield Arduino MEGA
IPAddress ipAddress (192 , 168 , 1 , 222); // Indirizzo IP nella LAN
IPAddress gateway (192 , 168 , 1 , 254); // Gateway
IPAddress subnet (255 , 255 , 255 , 0); // Subnet Mask
IPAddress DnsServer (192, 168, 1, 254 ); // DNS Server
EthernetServer ArduinoServer(800); // Assegnazione della porta del server
//char SetHostName[] = "ArduMotica"; //Assegno un Hostname alla ETH
String readString = String(100);//string for fetching data from address
//Definisco la stringa che conterrà le riposte HTTP


// Function prototypes
void subscribeReceive(char* topic, byte* payload, unsigned int length)
{
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}


void setup(void)
{
  // ************************************* INIZIO setup(void) *************************************
  // Avvio il serial port
  Serial.begin(115200);

  //Ethernet.hostName(SetHostName); // Set DHCP Host Name - New Feature (Updated)
  Ethernet.begin(macAddress, ipAddress, gateway, DnsServer, subnet); // Inizializzo il chip della scheda ethernet
  ArduinoServer.begin();  //Inizializzo il server in ascolto sulla porta 800
  delay(1000);


  // ---------------------------------------  Avvio il server mqtt --------------------------------------
  Serial.println("In attesa di connessione al server mqtt....");
  // Set the MQTT server to the server stated above ^
  mqttClient.setServer(servermqtt, 1883);
  // Attempt to connect to the server with the ID "myClientID"
  if (mqttClient.connect("Arduino", mqtt_username, mqtt_password))
  {
    Serial.println("Connessione server mqtt stabilita");
    // Establish the subscribe event
    mqttClient.setCallback(subscribeReceive);
  }
  else
  {
    mqttClient.state (); // fornirà ulteriori informazioni sul motivo per cui ha fallito.
    Serial.println("Connessione server mqtt fallita");
  }

}
// ************************************* FINE setup(void) *************************************
void loop(void)
{

  // ************************************* INIZIO loop(void) *************************************
  //RICHIAMO IL VOID JSon  PER IL COLLEGAMENTO CON RICHIESTE JSON A DISPOSITIVO ANDROID
  JSon();


  // INVIO I DATI AL BROKER MQTT HOME ASSISTANT
  if (!mqttClient.connected()) {
    MQTT_reconnect();
  }
  mqttClient.loop();
  SendMQTT();
}




// FUNZIONI

void MQTT_reconnect()
{
  // Loop until we're reconnected
  while (!mqttClient.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (mqttClient.connect(clientId.c_str())) {
      Serial.println("Connected!");

    } else {
      //if (millis() - t_mqtt_reconnect >   5000) // Attendo 5 secondi
      if (millis() - t_mqtt_reconnect > 10000) // Attendo 10 secondi per provare a non far bloccare il codice in caso di riavvio di Home Assistant
      {
        t_mqtt_reconnect = millis();
        Serial.print("failed, rc=");
        Serial.print(mqttClient.state());
        Serial.println(" try again in 5 seconds");
        // Wait 5 seconds before retrying
        //delay(5000); // sostituito con millis
      }
    }
  }
}


void SendMQTT()
{
  // INVIO I DATI AL BROKER MQTT HOME ASSISTANT
  // se si ha un modulo RTC si può creare una stringa con l'orario di pubblicazione dei dati che viene trasmessa al server mqtt

  if (millis() - t_mqtt > 5000) // Attendo 5 secondi
  {
    t_mqtt = millis();
    mqttClient.subscribe("Arduino Temperatura");
    Read_Temp();
    // DHT
    mqttClient.publish("ArduMotica/teperature/Sala", String(t1).c_str());
    delay(100);
    mqttClient.publish("ArduMotica/humidity/Sala", String(h1).c_str());
    delay(100);
    mqttClient.publish("ArduMotica/teperature/Esterna Sala", String(t2).c_str());
    delay(100);
    mqttClient.publish("ArduMotica/humidity/Esterna Sala", String(h2).c_str());
    delay(100);
    mqttClient.publish("ArduMotica/teperature/Esterna Cucina", String(t3).c_str());
    delay(100);
    mqttClient.publish("ArduMotica/humidity/Esterna Cucina", String(h3).c_str());
    delay(100);
    mqttClient.publish("ArduMotica/teperature/Federico", String(t4).c_str());
    delay(100);
    mqttClient.publish("ArduMotica/humidity/Federico", String(h4).c_str());
    delay(100);
    mqttClient.publish("ArduMotica/teperature/Camera Matrimoniale", String(t5).c_str());
    delay(100);
    mqttClient.publish("ArduMotica/humidity/Camera Matrimoniale", String(h5).c_str());
    delay(100);
    mqttClient.publish("ArduMotica/teperature/Francesca", String(t6).c_str());
    delay(100);
    mqttClient.publish("ArduMotica/humidity/Francesca", String(h6).c_str());
    delay(100);
    /*
         SOSPENDO MOMENTANEAMENTE LA PUBBLICAZIONE DELLA SOFFITTA
      mqttClient.publish("ArduMotica/teperature/Soffitta", String(t7).c_str());
      delay(100);
      mqttClient.publish("ArduMotica/humidity/Soffitta", String(h7).c_str());
      delay(100);
    */
  }


  // Dallas DS18B20
  printTemperature(insideThermometer);
  if (isnan(tempDALLAS)) {
    Serial.println(F("Errore di lettura DS18B20 CONGELATORE sul pin D33"));
  }
  else {
    /*
      Serial.println("**** START SENSOR CONGELATORE DS18B20 sul PIN D33 ******");
      Serial.print(F("Temperatura Congelatore: "));
      Serial.print(tempDALLAS);
      Serial.println(F(" C"));
    */
    mqttClient.publish("ArduMotica/teperature/Congelatore", String(tempDALLAS).c_str());
    delay(100);
  }
void JSon(void) //CODICE PER IL COLLEGAMENTO CON RICHIESTE JSON A DISPOSITIVO ANDROID
{
  if (millis() - t_json > 5000) // Attendo 5 secondi *** BUON COMPROMESSO PER EVITARE ERRORI DI LETTURA IN CASO DI DOPPIA RICHIESTA RICEVUTA DA APP ANDOID
  {
    t_json = millis();

    // ============================ INIZIO CODICE PER IL COLLEGAMENTO CON RICHIESTE JSON A DISPOSITIVO ANDROID =============================================
    // pulisco il buffer di readString
    readString = "";
    // Creo la connessione al client
    EthernetClient client = ArduinoServer.available();
    if (client)
    {
      // Serial.println(F("Nuovo client"));
      while (client.connected())
      {
        if (client.available())
        {
          char c = client.read();
          //leggo char dal char della richiesta HTTP
          if (readString.length() < 100) // portato da 30 a 100 secondo indicazioni di Niky per leggere TUTTO il buffer
          {
            //memorizzo i caratteri in una stringa
            readString = readString + c;
          }
          //output chars to serial port
          //Serial.print(F("Stampo il valore di c: "));
          //Serial.println(c);
          //if HTTP request has ended
          if (c == '\n') //Richiesta terminata - Invio la risposta al client
          {
            // Serial.println();
            //     Serial.print(F("Il comando ricevuto e': "));
            Serial.println(readString);

            // ****************************************************
            client.println("HTTP/1.1 200 OK"); //invio lo status code
            client.println("Content-Type: text/html"); //imposto il data type
            client.println();
            //Inizio apertura comandata tenda
            int char_pos_a = 0;
            int char_pos_b = 0;
            if (readString.startsWith("GET /?out=0&value="))
            {
              int char_pos_a = readString.indexOf("value=");
              int char_pos_b = readString.indexOf(" HTTP/1.1");
              String value = readString.substring(char_pos_a + 6, char_pos_b + 1);
              double value_int = value.toInt();
              {
                /*
                  Serial.print("char_pos_a:");
                  Serial.println(char_pos_a);
                  Serial.print("char_pos_b:");
                  Serial.println(char_pos_b);
                  Serial.print("value contiene:");
                  Serial.println(value);
                */
                if (value_int >= 0 && value_int <= 100)
                {
                  if (value_int > Apertura)
                  {
                    /*
                      Serial.print("Apro la tenda da posizione:");
                      Serial.print(Apertura);
                      Serial.print("% a posizione:");
                      Serial.print(value_int);
                      Serial.print("%");
                    */
                    digitalWrite(RCH2, LOW);
                    delay(1800); // Attendo 1,8 secondi prima di riposizionare il relè sullo stato iniziale.
                    //Operazione necessaria per simulare la pressione del tasto altrimenti la centralina non riceve correttamente il comando
                    digitalWrite(RCH2, HIGH);
                    while (value_int > Apertura)
                    {
                      StampaApertura();
                      //Serial.println(Apertura);
                    }
                    digitalWrite(RCH2, LOW);
                    delay(250); //Attendo 250 millisecondi prima di riposizionare il relè sullo stato iniziale, altrimenti la centralina non processa correttamente il comando
                    digitalWrite(RCH2, HIGH);
                    client.print(F("status ok"));
                    /*
                      client.print(value_int);
                      client.print(",Apertura:");
                      client.print(Apertura);
                    */
                  }
                  if (value_int < Apertura)
                  {
                    /*
                      Serial.print("Chiudo la tenda da posizione:");
                      Serial.print(Apertura);
                      Serial.print("% a posizione:");
                      Serial.print(value_int);
                      Serial.print("%");
                    */
                    digitalWrite(RCH1, LOW);
                    delay(1800); // Attendo 1,8 secondi prima di riposizionare il relè sullo stato iniziale.
                    //Operazione necessaria per simulare la pressione del tasto altrimenti la centralina non riceve correttamente il comando
                    digitalWrite(RCH1, HIGH);
                    while (value_int < Apertura)
                    {
                      StampaApertura();
                      //Serial.println(Apertura);
                    }
                    digitalWrite(RCH1, LOW);
                    delay(250); //Attendo 250 millisecondi prima di riposizionare il relè sullo stato iniziale, altrimenti la centralina non processa correttamente il comando
                    digitalWrite(RCH1, HIGH);
                    client.print(F("status ok"));
                    /*
                      client.print(value_int);
                      client.print(",Apertura:");
                      client.print(Apertura);
                    */
                  }
                }
                else
                {
                  Serial.println(F("Valore fuori range"));
                  client.print(F("Error, value out of range"));
                }
              }
            }
            //Fine apertura comandata tenda

            // Inizio potenziometro tenda
            if (readString.startsWith("GET /?out=0&status=1"))
            {
              Serial.println(F("\n Trimmer_Sensor on pin A0 \n"));
              StampaApertura();
              if (isnan(Apertura))
              {
                Serial.println(F("\n Failed to read from Trimmer_Sensor on pin A0 \n"));
              }
              else
              {
                Serial.print(Ohm);
                Serial.println(F(" Ohm"));
                Serial.print(Apertura);
                Serial.println(F("% di apertura"));
                //delay(200);
                client.print(F("status ok,"));
                client.print(Apertura);
                client.print(F("%"));
              }
            }
            //Fine potenziometro tenda

            // Inizio contatore KwH
            if (readString.startsWith("GET /?out=19&status=1"))
            {
              Serial.println(F("\n KwH Counter_Sensor on pin D19 \n"));
              if (isnan(totPowerValue))
              {
                Serial.println(F("\n Failed to read from KwH Counter_Sensor on pin D19 \n"));
              }
              else
              {
                client.print(F("status ok,"));
                client.print(totPowerValue);
                client.print(F(" Wh"));
                Serial.print(totPowerValue);
                Serial.println(F(" Wh"));
              }
            }
            // Provo a stampare via web i dati continuamente con un refresh della pagina web ogni 1 secondi
            // client.println("<meta http-equiv=\"refresh\" content=\"1\">");

            //Fine contatore KwH

            // =================== INIZIO LETTURA SENSORI DI TEMPERATURA ========================
            Read_Temp();
            //Inizio lettura sensore INTERNO SALA DTH22 sul PIN D26
            if (readString.startsWith("GET /?out=26&status=1"))
            {
              Serial.print(F("\n DHT22_Sensor INTERNO SALA sul pin D26 OK!\n"));
              // check if returns are valid, if they are NaN (not a number) then something went wrong!
              if (isnan(t1) || isnan(h1)) {
                Serial.println(F("Errore di lettura DHT22 INTERNO SALA sul pin D26"));
                client.print(F("status error"));
              }
              else {
                //Serial.println("**** START SENSOR INTERNO SALA DTH22 sul PIN D26 ******");
                Serial.print(F("Umidita': "));
                Serial.print(h1);
                Serial.print(F("% - "));
                Serial.print(F("Temperatura: "));
                Serial.print(t1);
                Serial.println(F(" C"));
                //Serial.println("**** END SENSOR INTERNO SALA DTH22 sul PIN D26 ******");
                client.print(F("status ok,"));
                client.print(h1);
                client.print(F("%,"));
                client.print(t1);
                client.print(F("°C"));
              }
            }
            //Fine lettura sensore INTERNO SALA DTH22 sul PIN D26

            //Inizio lettura sensore ESTERNO SALA DTH21 sul PIN D27
            if (readString.startsWith("GET /?out=27&status=1"))
            {
              Serial.print(F("\n DHT21_Sensor ESTERNO SALA sul PIN D27 OK!\n"));
              // check if returns are valid, if they are NaN (not a number) then something went wrong!
              if (isnan(t2) || isnan(h2)) {
                Serial.println(F("Errore di lettura DHT21 ESTERNO SALA sul PIN D27"));
                client.print(F("status error"));
              }
              else {
                //Serial.println("**** START SENSOR ESTERNO SALA DTH21 sul PIN D27 ******");
                Serial.print(F("Umidita': "));
                Serial.print(h2);
                Serial.print(F("% - "));
                Serial.print(F("Temperatura: "));
                Serial.print(t2);
                Serial.println(F(" C"));
                //Serial.println("**** END SENSOR ESTERNO SALA DTH21 sul PIN D27 ******");
                client.print(F("status ok,"));
                client.print(h2);
                client.print(F("%,"));
                client.print(t2);
                client.print(F("°C"));
              }
            }
            //Fine lettura sensore ESTERNO SALA DTH21 sul PIN D27

            //Inizio lettura sensore ESTERNO CUCINA DTH21 sul PIN D28
            if (readString.startsWith("GET /?out=28&status=1"))
            {
              Serial.print(F("\n DHT21_Sensor ESTERNO CUCINA sul PIN D28 OK!\n"));
              // check if returns are valid, if they are NaN (not a number) then something went wrong!
              if (isnan(t3) || isnan(h3)) {
                Serial.println(F("Errore di lettura DHT21 ESTERNO CUCINA sul PIN D28"));
                client.print(F("status error"));
              }
              else {
                //Serial.println("**** START SENSOR ESTERNO CUCINA DTH21 sul PIN D28 ******");
                Serial.print(F("Umidita': "));
                Serial.print(h3);
                Serial.print(F("% - "));
                Serial.print(F("Temperatura: "));
                Serial.print(t3);
                Serial.println(F(" C"));
                //Serial.println("**** END SENSOR ESTERNO CUCINA DTH21 sul PIN D28 ******");
                client.print(F("status ok,"));
                client.print(h3);
                client.print(F("%,"));
                client.print(t3);
                client.print(F("°C"));
              }
            }
            //Fine lettura sensore ESTERNO CUCINA DTH21 sul PIN D28

            //Inizio lettura sensore INTERNO FEDERICO DTH22 sul PIN D29
            if (readString.startsWith("GET /?out=29&status=1"))
            {
              Serial.print(F("\n DHT22_Sensor INTERNO FEDERICO sul pin D29 OK!\n"));
              // check if returns are valid, if they are NaN (not a number) then something went wrong!
              if (isnan(t4) || isnan(h4)) {
                Serial.println(F("Errore di lettura DHT22 INTERNO FEDERICO sul pin D29"));
                client.print(F("status error"));
              }
              else {
                //Serial.println("**** START SENSOR INTERNO FEDERICO DTH22 sul PIN D29 ******");
                Serial.print(F("Umidita'1: "));
                Serial.print(h4);
                Serial.print(F("% - "));
                Serial.print(F("Temperatura: "));
                Serial.print(t4);
                Serial.println(F(" C"));
                //Serial.println("**** END SENSOR INTERNO FEDERICO DTH22 sul PIN D29 ******");
                client.print(F("status ok,"));
                client.print(h4);
                client.print(F("%,"));
                client.print(t4);
                client.print(F("°C"));
              }
            }
            //Fine lettura sensore INTERNO FEDERICO DTH22 sul PIN D29

            //Inizio lettura sensore INTERNO CAMERA MATRIMONIALE DTH22 sul PIN D30
            if (readString.startsWith("GET /?out=30&status=1"))
            {
              Serial.print(F("\n DHT22_Sensor INTERNO CAMERA MATRIMONIALE sul pin D30 OK!\n"));
              // check if returns are valid, if they are NaN (not a number) then something went wrong!
              if (isnan(t5) || isnan(h5)) {
                Serial.println(F("Errore di lettura DHT22 INTERNO CAMERA MATRIMONIALE sul pin D30"));
                client.print(F("status error"));
              }
              else {
                //Serial.println("**** START SENSOR INTERNO CAMERA MATRIMONIALE DTH22 sul PIN D30 ******");
                Serial.print(F("Umidita'1: "));
                Serial.print(h5);
                Serial.print(F("% - "));
                Serial.print(F("Temperatura: "));
                Serial.print(t5);
                Serial.println(F(" C"));
                //Serial.println("**** END SENSOR INTERNO CAMERA MATRIMONIALE DTH22 sul PIN D30 ******");
                client.print(F("status ok,"));
                client.print(h5);
                client.print(F("%,"));
                client.print(t5);
                client.print(F("°C"));
              }
            }
            //Fine lettura sensore INTERNO CAMERA MATRIMONIALE DTH22 sul PIN D30

            //Inizio lettura sensore INTERNO FRANCESCA DTH22 sul PIN D31
            if (readString.startsWith("GET /?out=31&status=1"))
            {
              Serial.print(F("\n DHT22_Sensor INTERNO FRANCESCA sul pin D31 OK!\n"));
              // check if returns are valid, if they are NaN (not a number) then something went wrong!
              if (isnan(t6) || isnan(h6)) {
                Serial.println(F("Errore di lettura DHT22 INTERNO FRANCESCA sul pin D31"));
                client.print(F("status error"));
              }
              else {
                //Serial.println("**** START SENSOR INTERNO FRANCESCA DTH22 sul PIN D31 ******");
                Serial.print(F("Umidita'1: "));
                Serial.print(h6);
                Serial.print(F("% - "));
                Serial.print(F("Temperatura: "));
                Serial.print(t6);
                Serial.println(F(" C"));
                //Serial.println("**** END SENSOR INTERNO FRANCESCA DTH22 sul PIN D31 ******");
                client.print(F("status ok,"));
                client.print(h6);
                client.print(F("%,"));
                client.print(t6);
                client.print(F("°C"));
              }
            }
            //Fine lettura sensore INTERNO FRANCESCA DTH22 sul PIN D31
            //Inizio lettura sensore INTERNO SOFFITTA DTH22 sul PIN D32
            if (readString.startsWith("GET /?out=32&status=1"))
            {
              Serial.print(F("\n DHT22_Sensor INTERNO SOFFITTA sul pin D32 OK!\n"));
              // check if returns are valid, if they are NaN (not a number) then something went wrong!
              if (isnan(t7) || isnan(h7)) {
                Serial.println(F("Errore di lettura DHT22 INTERNO SOFFITTA sul pin D32"));
                client.print(F("status error"));
              }
              else {
                //Serial.println("**** START SENSOR INTERNO SOFFITTA DTH22 sul PIN D32 ******");
                Serial.print(F("Umidita'1: "));
                Serial.print(h7);
                Serial.print(F("% - "));
                Serial.print(F("Temperatura: "));
                Serial.print(t7);
                Serial.println(F(" C"));
                //Serial.println("**** END SENSOR INTERNO SOFFITTA DTH22 sul PIN D32 ******");
                client.print(F("status ok,"));
                client.print(h7);
                client.print(F("%,"));
                client.print(t7);
                client.print(F("°C"));
              }
            }
            //Fine lettura sensore INTERNO SOFFITTA DTH22 sul PIN D32

            //Inizio lettura sensore CONGELATORE DALLAS DS18B20 sul PIN D33
            if (readString.startsWith("GET /?out=33&status=1"))
            {
              Serial.print(F("\n DS18B20_Sensor CONGELATORE sul pin D33 OK!\n"));
              // check if returns are valid, if they are NaN (not a number) then something went wrong!
              printTemperature(insideThermometer);
              if (isnan(tempDALLAS)) {
                Serial.println(F("Errore di lettura DS18B20 CONGELATORE sul pin D33"));
                client.print(F("status error"));
              }
              else {
                //Serial.println("**** START SENSOR CONGELATORE DS18B20 sul PIN D33 ******");
                Serial.print(F("Temperatura: "));
                Serial.print(tempDALLAS);
                Serial.println(F(" C"));
                //Serial.println("**** END SENSOR CONGELATORE DS18B20 sul PIN D33 ******");
                client.print(F("status ok,"));
                client.print(tempDALLAS);
                client.print(F("°C"));
              }
            }
            //Fine lettura sensore CONGELATORE DS18B20 sul PIN D33

            // =================== FINE LETTURA SENSORI DI TEMPERATURA ========================


            // Inizio Relè Tenda
            if (readString.startsWith("GET /?out=22&status=1"))
            {
              Serial.print(F("\n CH1 of relais on pin D22 is HIGH \n"));
              RCHT = RCH1; //Abbasso la tenda
              client.print(F("{\"status\" : \"1\" , \"out\" : \""));
              client.print(RCHT);
              Serial.print(F("\n CH1 of relais on pin D22 is HIGH \n"));
              digitalWrite(RCH1, LOW); //Abbasso la tenda
              client.print(F("{\"status\" : \"1\" , \"out\" : \""));
              client.print(RCH1);
              delay(1800); //Attendo 1,8 secondi prima di riposizionare il relè sullo stato iniziale.
              //Operazione necessaria per simulare la pressione del tasto altrimenti la centralina non riceve correttamente il comando
              digitalWrite(RCH1, HIGH);
              client.print(F("\"}"));
              client.print(F("\"}"));
            }

            if (readString.startsWith("GET /?out=23&status=1"))
            {
              Serial.print(F("\n CH2 of relais on pin D23 is HIGH \n"));
              RCHT = RCH2; //Alzo la tenda
              client.print(F("{\"status\" : \"1\" , \"out\" : \""));
              client.print(RCHT);
              Serial.print(F("\n CH2 of relais on pin D23 is HIGH \n"));
              digitalWrite(RCH2, LOW); //Alzo la tenda
              client.print(F("{\"status\" : \"1\" , \"out\" : \""));
              client.print(RCH2);
              delay(1800); //Attendo 1,8 secondi prima di riposizionare il relè sullo stato iniziale.
              //Operazione necessaria per simulare la pressione del tasto altrimenti la centralina non riceve correttamente il comando
              digitalWrite(RCH2, HIGH);
              client.print(F("\"}"));
              client.print(F("\"}"));
            }
            // Fine Relè Tenda

            // Inizio Relè Caldaia
            if (readString.startsWith("GET /?out=24&status=1"))
            {
              Serial.print(F("\n CH3 of relais on pin D24 is HIGH \n"));
              digitalWrite(RCH3, LOW);
              client.print(F("{\"status\" : \"1\" , \"out\" : \""));
              client.print(RCH3);
              client.print(F("\"}"));
            }
            if (readString.startsWith("GET /?out=24&status=0"))
            {
              Serial.print(F("\n CH3 of relais on pin D24 is LOW \n"));
              digitalWrite(RCH3, HIGH);
              client.print(F("{\"status\" : \"0\" , \"out\" : \""));
              client.print(RCH3);
              client.print(F("\"}"));
            }
            // Fine Relè Caldaia
            // ==================== INVIO TUTTE LE TEMPERATURE ===================
            if (readString.startsWith("GET /?out=AllTemp"))
            {
              printTemperature(insideThermometer);
              /*
                if  ((isnan(t1) || isnan(h1)) || (isnan(t2) || isnan(h2)) || (isnan(t3) || isnan(h3)) || (isnan(t4) || isnan(h4)) || (isnan(t5) || isnan(h5)) || (isnan(t6) || isnan(h6)) || (isnan(t7) || isnan(h7)) || isnan(tempDALLAS))
                {
                  Serial.println(F("Errore di lettura sensori di temperatura"));
                  client.print(F("status error"));
                }
                else
              */
              {
                // Stampo tutte le temperature sul web;
                client.print(F("status ok,"));
                // Temperatura Sala
                client.print(h1);
                client.print(F("%,"));
                client.print(t1);
                //client.println(F("°C ,"));
                client.println((","));
                // Temperatura Federico
                client.print(h4);
                client.print(F("%,"));
                client.print(t4);
                client.println((","));
                //client.println(F("°C ,"));
                // Temperatura Camera Matrimoniale
                client.print(h5);
                client.print(F("%,"));
                client.print(t5);
                client.println((","));
                //client.println(F("°C ,"));
                // Temperatura Francesca
                client.print(h6);
                client.print(F("%,"));
                client.print(t6);
                client.println((","));
                //client.println(F("°C ,"));
                // Temperatura Soffitta
                client.print(h7);
                client.print(F("%,"));
                client.print(t7);
                client.println((","));
                //client.println(F("°C ,"));
                // Temperatura Esterna Sala
                client.print(h2);
                client.print(F("%,"));
                client.print(t2);
                client.println((","));
                //client.println(F("°C ,"));
                // Temperatura Esterna Cucina
                client.print(h3);
                client.print(F("%,"));
                client.print(t3);
                client.println((","));
                //client.println(F("°C ,"));
                // Temperatura Congelatore
                client.print(tempDALLAS);
                // client.println(F("°C "));
              }
              Print_Temp();
            }

            if (readString.startsWith("GET /?out=all"))
            {
              printTemperature(insideThermometer);
              Serial.print(F("\n OUT ALL\n"));
              client.print(F("{\"ip\" : \"192.168.1.222\", "));
              client.print(F("\"devices\" : "));
              client.print(F("[{ \"type\" : \"temperature\", \"name\" : \"Umidita' / Temperatura interna SALA DA PRANZO\", \"out\" : \""));
              client.print(DHT_IN_SALA);
              client.print(F("\"}"));
              client.print(F(",{ \"type\" : \"temperature\", \"name\" : \"Umidita' / Temperatura esterna SALA DA PRANZO\", \"out\" : \""));
              client.print(DHT_OUT_SALA);
              client.print(F("\"}"));
              client.print(F(",{ \"type\" : \"temperature\", \"name\" : \"Umidita' / Temperatura esterna CUCINA\", \"out\" : \""));
              client.print(DHT_OUT_CUCINA);
              client.print(F("\"}"));
              client.print(F(",{ \"type\" : \"temperature\", \"name\" : \"Umidita' / Temperatura interna FEDERICO\", \"out\" : \""));
              client.print(DHT_IN_FEDERICO);
              client.print(F("\"}"));
              client.print(F(",{ \"type\" : \"temperature\", \"name\" : \"Umidita' / Temperatura interna CAMERA MATRIMONIALAE\", \"out\" : \""));
              client.print(DHT_IN_MATRIMONIALE);
              client.print(F("\"}"));
              client.print(F(",{ \"type\" : \"temperature\", \"name\" : \"Umidita' / Temperatura interna FRANCESCA\", \"out\" : \""));
              client.print(DHT_IN_FRANCESCA);
              client.print(F("\"}"));
              client.print(F(",{ \"type\" : \"temperature\", \"name\" : \"Umidita' / Temperatura interna SOFFITTA\", \"out\" : \""));
              client.print(DHT_IN_SOFFITTA);
              client.print(F("\"}"));
              client.print(F(",{ \"type\" : \"temperature\", \"name\" : \"Temperatura CONGELATORE\", \"out\" : \""));
              client.print(ONE_WIRE_BUS);
              client.print(F("\"}"));
              client.print(F(",{ \"type\" : \"gate\", \"name\" : \"Alza Tenda\", \"out\" : \""));
              client.print(RCH1);
              client.print(F("\"}"));
              client.print(F(",{ \"type\" : \"gate\", \"name\" : \"Abbassa Tenda\", \"out\" : \""));
              client.print(RCH2);
              client.print(F("\"}"));
              client.print(F(",{ \"type\" : \"gate\", \"name\" : \"Accendi caldaia\", \"out\" : \""));
              client.print(RCH3);
              client.print(F("\"}"));
              client.print(F(",{ \"type\" : \"sensor\", \"name\" : \"Potenza Istantanea\", \"out\" : \""));
              client .print(PORT_POWER_TOT);
              client.print(F("\"}"));
              client.print(F(",{ \"type\" : \"sensor\", \"name\" : \"Tenda aperta del \", \"out\" : \""));
              client.print(F("0"));
              client .print(F("\"}"));
              client.print(F("]}"));
            }
            readString = "";
            delay(1); // give the web browser time to receive the data
            client.stop(); // termino la comunicazione
          }
        }
      }
      //Serial.println(F("Client disconnesso \n"));
      // ==================================================== FINE CODICE PER IL COLLEGAMENTO CON RICHIESTE JSON A DISPOSITIVO ANDROID ====================================================
    }
  }

}

Ovviamente ho volutamente omesso per non allungare troppo il post, le parti relative alla dichiarazione, all'inizializzazione ed alla lettura dei vari sensori.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.