Controller per serra automatizzata

Buongiorno a tutti,
Sto cercando di costruire una centralina per una serra per un progetto scolastico di una farm ad alta tecnologia e automazione.
Devo fare un paio di doverose premesse. La prima è ho provato prima a cercare sul forum se ci fosse qualcosa di simile ma ahimè, non sono stato in grado di trovarlo, la seconda è che non ci capisco un accidenti di programmazione, la terza invece, è che la parte hardware del progetto è stata affidata ad un amico che se ne intende parecchio trattando elettronica per lavoro (lavora con i plc e affini, programma qualsiasi cosa, ma al momento purtroppo non ha tempo di starci dietro), abbastanza da far funzionare correttamente il tutto. Non potendo allegare lo schema elettrico (perché non ho proprio idea di come fare, ma partiamo dal presupposto che il tutto sia cablato a dovere, mi scuso in anticipo per questa cosa, eventualmente se a qualcuno interessa proverò a domandare per vedere se si ricorda come l'ha costruita).
Inizierò elencando le componenti hardware utilizzate nel progetto:

  • arduino mega 2560
  • ethernet shield
  • sdc30 collegato a SDA SLA
  • ds18b20 (collegato a digital pin 46)
  • 2x SRD-05VDC-SL-C (collegati ad arduino mega dal digital pin 22 al 25 e dal 26 29).
    I relè che verranno impiegati saranno "22, 24 e 25", con il 22 collegato al primo e il 24 e 25 collegati dal 26 al 29).
  • 2 ventole da computer collegate ad alimentatore 12v, a sua volta collegato al relè 24.
  • riscaldatore (una semplice lampadina nel mio caso, atta a dimostrare il funzionamento) collegato al relè 25 (che si accenderà, ad esempio, se la temperatura dovesse essere inferiore ai 25 gradi)
  • una bombola di co2, che andrà ad attivarsi e disattivarsi tramite elettrovalvola nel caso in cui le ppm siano troppo basse rispetto quelle desiderate (essendo un progetto lascerò questa parte inutilizzata, non vi è niente di collegato serve solo al fine dimostrativo soffiando sopra al sensore).
    Ora, quello che il controller deve sostanzialmente fare non è niente di più di accendere/spegnere delle ventole in base alla temperatura e umidità registrate; possibilmente dando la priorità alla temperatura rispetto l'umidità (questo semplicemente per evitare conflitti di accendi/spegni continui)
    Faccio un esempio, se la temperatura massima è 29 gradi deve accendersi l'aspirazione finché non la riporta a 25, allo stesso tempo se la temperatura è di 25 ma l'umidità è superiore al 80% deve restare accesa finché non scende al 65 (questo in linea teorica, mi direte voi se è un'utopia perché come ho già detto mi dispiace, ma non me ne intendo).
    I sensori vengono alimentati collegando la 220 a un alimentatore 5v per cellulari.
    Ammetto di aver provato a sviluppare la cosa tramite l'utilizzo di chatgpt e devo dire che c'è molto vicina dal creare la cosa, fornirò ora il codice prodotto fino ad adesso, sapendo che (e dico così perché non leggendo i dati del sensore non ho modo di verificarne il corretto funzionamento) il programma in sé per sé funziona, l'unico problema riscontrato è che non mostra i dati dei sensori (indi per cui annulla la funzionalità del programma stesso).
    Chiedo aiuto ai più navigati, se potete consigliarmi come muovermi.
    Ringrazio anticipatamente per il tempo dedicatomi.
    Ecco qui il programma in uso al momento:
#include <SPI.h>
#include <Ethernet.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "SparkFun_SCD30_Arduino_Library.h"

#define DHTPIN 2
#define DHTTYPE DHT22

#define ONE_WIRE_BUS 8

#define RELAY_PIN_22 24
#define RELAY_PIN_24 26
#define RELAY_PIN_25 27

DHT dht(DHTPIN, DHTTYPE);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

EthernetServer server(80);

bool logicActive = true;
float temperature = 0;
float humidity = 0;
float co2 = 0;

float temperatureSetpointMin = 20;
float temperatureSetpointMax = 25;
int humiditySetpointMin = 60;
int humiditySetpointMax = 70;
int co2SetpointMin = 400;
int co2SetpointMax = 600;

void setup() {
  // Inizializza i pin dei relè come OUTPUT
  pinMode(RELAY_PIN_22, OUTPUT);
  pinMode(RELAY_PIN_24, OUTPUT);
  pinMode(RELAY_PIN_25, OUTPUT);

  // Inizializza la comunicazione seriale
  Serial.begin(9600);

  // Inizializza il sensore DHT
  dht.begin();

  // Inizializza il sensore di temperatura DS18B20
  sensors.begin();

  // Imposta il relè 22 come spento
  digitalWrite(RELAY_PIN_22, LOW);

  // Avvia la connessione Ethernet con MAC address e indirizzo IP
  uint8_t mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
  IPAddress ip(192, 168, 178, 180);
  Ethernet.begin(mac, ip);
  server.begin();
}

void loop() {
  // Gestisci la connessione client
  EthernetClient client = server.available();
  if (client) {
    processClient(client);
    client.stop();
  }

  // Esegui la logica solo se il programma è attivo
  if (logicActive) {
    updateSensorsData();
    checkAndControlRelays();
  }
}

void processClient(EthernetClient& client) {
  String request = client.readStringUntil('\r');
  client.flush();

  if (request.indexOf("/run") != -1) {
    logicActive = true;
  } else if (request.indexOf("/stop") != -1) {
    logicActive = false;
  } else if (request.indexOf("/releon22") != -1) {
    digitalWrite(RELAY_PIN_22, HIGH);
  } else if (request.indexOf("/releoff22") != -1) {
    digitalWrite(RELAY_PIN_22, LOW);
  } else if (request.indexOf("/releon24") != -1) {
    digitalWrite(RELAY_PIN_24, HIGH);
  } else if (request.indexOf("/releoff24") != -1) {
    digitalWrite(RELAY_PIN_24, LOW);
  } else if (request.indexOf("/releon25") != -1) {
    digitalWrite(RELAY_PIN_25, HIGH);
  } else if (request.indexOf("/releoff25") != -1) {
    digitalWrite(RELAY_PIN_25, LOW);
  } else if (request.indexOf("/IncSetPointReleOn22") != -1) {
    increaseCo2SetpointMin();
  } else if (request.indexOf("/DecSetPointReleOn22") != -1) {
    decreaseCo2SetpointMin();
  } else if (request.indexOf("/IncSetPointReleOff22") != -1) {
    increaseCo2SetpointMax();
  } else if (request.indexOf("/DecSetPointReleOff22") != -1) {
    decreaseCo2SetpointMax();
  } else if (request.indexOf("/IncSetPointReleOn24") != -1) {
    increaseTemperatureSetpointMin();
  } else if (request.indexOf("/DecSetPointReleOn24") != -1) {
    decreaseTemperatureSetpointMin();
  } else if (request.indexOf("/IncSetPointReleOff24") != -1) {
    increaseTemperatureSetpointMax();
  } else if (request.indexOf("/DecSetPointReleOff24") != -1) {
    decreaseTemperatureSetpointMax();
  } else if (request.indexOf("/IncSetPointReleOn25") != -1) {
    increaseHumiditySetpointMin();
  } else if (request.indexOf("/DecSetPointReleOn25") != -1) {
    decreaseHumiditySetpointMin();
  } else if (request.indexOf("/IncSetPointReleOff25") != -1) {
    increaseHumiditySetpointMax();
  } else if (request.indexOf("/DecSetPointReleOff25") != -1) {
    decreaseHumiditySetpointMax();
  }

  sendHttpResponse(client);
}

void sendHttpResponse(EthernetClient& client) {
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connection: close");
  client.println();

  client.println("<!DOCTYPE HTML>");
  client.println("<html><meta http-equiv=\"refresh\" content=\"10;URL=/\">");
  client.println("<a href=\"/run\">Attiva logica</a> <br><a href=\"/stop\">Ferma logica</a> <br>stato Logica=" + String(logicActive) + "<br>");
  client.println("Temperatura= " + String(temperature) + "<br>");
  client.println("Co2(ppm)= " + String(co2) + "<br>");
  client.println("temp(C)= " + String(dht.readTemperature()) + "<br>");
  client.println("humidity(%)= " + String(dht.readHumidity()) + "<br>");

  client.println("PPM minima desiderata&nbsp;&nbsp;<a href=\"/IncSetPointReleOn22\">[+]</a>&nbsp;&nbsp;<a href=\"/DecSetPointReleOn22\">[-]</a> valore=" + String(co2SetpointMin) + "<br>");
  client.println("PPM massima desiderata&nbsp;&nbsp;<a href=\"/IncSetPointReleOff22\">[+]</a>&nbsp;&nbsp;<a href=\"/DecSetPointReleOff22\">[-]</a> valore=" + String(co2SetpointMax) + "<br>");

  client.println("Temperatura minima desiderata&nbsp;&nbsp;<a href=\"/IncSetPointReleOn24\">[+]</a>&nbsp;&nbsp;<a href=\"/DecSetPointReleOn24\">[-]</a> valore=" + String(temperatureSetpointMin) + "<br>");
  client.println("Temperatura massima desiderata&nbsp;&nbsp;<a href=\"/IncSetPointReleOff24\">[+]</a>&nbsp;&nbsp;<a href=\"/DecSetPointReleOff24\">[-]</a> valore=" + String(temperatureSetpointMax) + "<br>");

  client.println("Umidita' minima desiderata&nbsp;&nbsp;<a href=\"/IncSetPointReleOn25\">[+]</a>&nbsp;&nbsp;<a href=\"/DecSetPointReleOn25\">[-]</a> valore=" + String(humiditySetpointMin) + "<br>");
  client.println("Umidita' massima  desiderata&nbsp;&nbsp;<a href=\"/IncSetPointReleOff25\">[+]</a>&nbsp;&nbsp;<a href=\"/DecSetPointReleOff25\">[-]</a> valore=" + String(humiditySetpointMax) + "<br>");

  client.println("<a href=\"/releon22\">Accendi rele22</a> <a href=\"/releoff22\">Spegni rele22</a> stato=" + String(digitalRead(RELAY_PIN_22)) + "<br>");
  client.println("<a href=\"/releon24\">Accendi rele24</a> <a href=\"/releoff24\">Spegni rele24</a> stato=" + String(digitalRead(RELAY_PIN_24)) + "<br>");
  client.println("<a href=\"/releon25\">Accendi rele25</a> <a href=\"/releoff25\">Spegni rele25</a> stato=" + String(digitalRead(RELAY_PIN_25)) + "<br>");
  client.println("</html>");
}

void updateSensorsData() {
  // Aggiorna i dati del sensore DHT
  temperature = dht.readTemperature();
  humidity = dht.readHumidity();

  // Aggiorna i dati del sensore SDC30 (da implementare correttamente)
  // co2 = ...;
}

void checkAndControlRelays() {
  // Controllo e attivazione relè 24 e 25 in base all'umidità
  if (humidity > humiditySetpointMax) {
    digitalWrite(RELAY_PIN_24, HIGH);
    digitalWrite(RELAY_PIN_25, HIGH);
  } else if (humidity < humiditySetpointMin) {
    digitalWrite(RELAY_PIN_24, LOW);
    digitalWrite(RELAY_PIN_25, LOW);
  }

  // Controllo e attivazione relè 24 e 25 in base alla temperatura
  if (temperature > temperatureSetpointMax) {
    digitalWrite(RELAY_PIN_24, HIGH);
    digitalWrite(RELAY_PIN_25, HIGH);
  } else if (temperature < temperatureSetpointMin) {
    digitalWrite(RELAY_PIN_24, LOW);
    digitalWrite(RELAY_PIN_25, LOW);
  }
}

void increaseTemperatureSetpointMin() {
  temperatureSetpointMin++;
}

void decreaseTemperatureSetpointMin() {
  temperatureSetpointMin--;
}

void increaseTemperatureSetpointMax() {
  temperatureSetpointMax++;
}

void decreaseTemperatureSetpointMax() {
  temperatureSetpointMax--;
}

void increaseHumiditySetpointMin() {
  humiditySetpointMin += 5;
}

void decreaseHumiditySetpointMin() {
  humiditySetpointMin -= 5;
}

void increaseHumiditySetpointMax() {
  humiditySetpointMax += 5;
}

void decreaseHumiditySetpointMax() {
  humiditySetpointMax -= 5;
}

void increaseCo2SetpointMin() {
  co2SetpointMin += 100;
}

void decreaseCo2SetpointMin() {
  co2SetpointMin -= 100;
}

void increaseCo2SetpointMax() {
  co2SetpointMax += 100;
}

void decreaseCo2SetpointMax() {
  co2SetpointMax -= 100;
}

Allego la sorgente che viene mostrata nella pagina

Attiva logica
Ferma logica
stato Logica=1
Temperatura= NAN
Co2(ppm)= 0.00
temp(C)= NAN
humidity(%)= NAN
PPM minima desiderata  [+]  [-] valore=400
PPM massima desiderata  [+]  [-] valore=600
Temperatura minima desiderata  [+]  [-] valore=20.00
Temperatura massima desiderata  [+]  [-] valore=25.00
Umidita' minima desiderata  [+]  [-] valore=60
Umidita' massima desiderata  [+]  [-] valore=70
Accendi rele22 Spegni rele22 stato=0
Accendi rele24 Spegni rele24 stato=0
Accendi rele25 Spegni rele25 stato=0

Buonasera e benvenuto nella sezione Italiana del forum,

:warning: prima di tutto ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato, dopo di che ...

... cortesemente, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15) e poi, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

P.P.S.: Evitate di utilizzare la traduzione automatica fatta dal browser ... vi impedisce di capire la lingua della sezione dove andate a scrivere ...

Grazie mille, sinceramente non me n'ero nemmeno accorto!
Fatto tutto :wink: pronto ad imparare!

Aggiornamenti sul codice.
Adesso i sensori funzionano, ma non riesco a capire cosa sbaglio in relazione ai pulsanti della pagina html.
Quando li premi, non fanno nulla, non cambiano stato e il pulsante "Accendi" "Spegni" logica non funziona più.
Qualcuno mi può gentilmente spiegare?

#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#include "SparkFun_SCD30_Arduino_Library.h"
#include <OneWire.h>
#include <DallasTemperature.h>

// Constants
const int relay22Pin = 22;    // Pin for Relay 22
const int relay24Pin = 24;    // Pin for Relay 24
const int relay25Pin = 25;    // Pin for Relay 25
const int Temp_suoloPin = 46; // Pin for DS18B20 sensor

// OneWire and DallasTemperature setup
OneWire  ds(Temp_suoloPin); 
DallasTemperature Temp_suolo_sensor(&ds);

// SCD30 setup
SCD30 airSensor;
float currentTemp = 0.0;
float currentHumidity = 0.0;
float currentTemperature = 0.0;
int currentPPM = 0;

// Global variables
float desiredMinTemp = 25.00;
float desiredMaxTemp = 29.00;
float desiredMinHumidity = 65.0;
float desiredMaxHumidity = 75.0;
int desiredMinPPM = 450;
int desiredMaxPPM = 600;
int minEmergencyTemp = 20;
int maxEmergencyTemp = 25;
int logicaon = 1;

// Ethernet setup
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 178, 180);
EthernetServer server(80);

void setup() {
  // Initialize Serial and SCD30 sensor
  Serial.begin(115200);
  Serial.println("SCD30 Example");
  Wire.begin();

  if (airSensor.begin(Wire, true) == false) {
    Serial.println("Air sensor not detected. Please check wiring. Freezing...");
    while (1)
      ;
  }

  Serial.print("Auto calibration set to ");
  if (airSensor.getAutoSelfCalibration() == true)
    Serial.println("true");
  else
    Serial.println("false");

  // Initialize Ethernet
  Ethernet.begin(mac, ip);

  // Check for Ethernet hardware present
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // do nothing, no point running without Ethernet hardware
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }

  // Start the server
  server.begin();
  Serial.print("Server is at ");
  Serial.println(Ethernet.localIP());

  // Set pins for relay as OUTPUT
  pinMode(relay22Pin, OUTPUT);
  pinMode(relay24Pin, OUTPUT);
  pinMode(relay25Pin, OUTPUT);

  // Initialize DS18B20 sensor
  Temp_suolo_sensor.begin();

  // Set initial state of relays
  digitalWrite(relay22Pin, LOW);
  digitalWrite(relay24Pin, LOW);
  digitalWrite(relay25Pin, LOW);
}

void loop() {
  EthernetClient client = server.available();
  if (client) {
    _delay_ms(200);
    if (client.available()) {
      char buf_in[1000];
      int ss = client.readBytes(&buf_in[0], 1000);
      int i = 0;
      while (i < ss) {
        if (buf_in[i] == '\n') {
          buf_in[i] = 0x0;
          buf_in[i - 1] = 0x0;
          break;
        }
        i++;
      }

      buf_in[ss] = 0x0;
      Serial.println(buf_in);
      Processweb(&client, buf_in);
      client.println("</html>");
      client.write((uint8_t)0x00);
      client.write((uint8_t)0x00);
      client.stop();
    }
  } else {
    // Update sensor readings
    updateSensors();

    // Check and process logic if enabled
    if (logicaon == 1) {
      processLogic();
    }
  }
}

void updateSensors() {
  // Read temperature from DS18B20 sensor
  Temp_suolo_sensor.requestTemperatures();
  currentTemp = Temp_suolo_sensor.getTempCByIndex(0);

  // Read CO2 and humidity from SCD30 sensor
  if (airSensor.dataAvailable()) {
    currentPPM = airSensor.getCO2();
    currentHumidity = airSensor.getHumidity();
    currentTemperature = airSensor.getTemperature();
  }
}

void processLogic() {
  // Relay 22: Solenoid valve based on CO2 value
  if (currentPPM >= desiredMinPPM && currentPPM <= desiredMaxPPM) {
    digitalWrite(relay22Pin, HIGH);
  } else {
    digitalWrite(relay22Pin, LOW);
  }

  // Relay 24: Temperature control
  if (currentTemp >= desiredMaxTemp) {
    digitalWrite(relay24Pin, HIGH);
  } else if (currentTemp <= desiredMinTemp && currentHumidity <= 70) {
    digitalWrite(relay24Pin, LOW);
  }

  // Relay 25: Heater control
  if (currentTemp <= minEmergencyTemp) {
    digitalWrite(relay25Pin, HIGH);
  } else if (currentTemp >= maxEmergencyTemp) {
    digitalWrite(relay25Pin, LOW);
  }
}

void Processweb(EthernetClient* client, char* url) {
  // Read the first line of the HTTP request
  String request = client->readStringUntil('\r');
  client->flush();

  // Process the request based on the URLs provided in the HTML page
  if (request.indexOf("/run") != -1) {
    // Activate logic (enable the program)
    logicaon = 1;
  } else if (request.indexOf("/stop") != -1) {
    // Stop logic (disable the program)
    logicaon = 0;
  } else if (request.indexOf("/IncSetPointReleOn22") != -1) {
    // Increase the desired minimum PPM
    desiredMinPPM += 100;
  } else if (request.indexOf("/DecSetPointReleOn22") != -1) {
    // Decrease the desired minimum PPM
    desiredMinPPM -= 100;
  } else if (request.indexOf("/IncSetPointReleOff22") != -1) {
    // Increase the desired maximum PPM
    desiredMaxPPM += 100;
  } else if (request.indexOf("/DecSetPointReleOff22") != -1) {
    // Decrease the desired maximum PPM
    desiredMaxPPM -= 100;
  } else if (request.indexOf("/IncSetPointReleOn24") != -1) {
    // Increase the desired minimum temperature
    desiredMinTemp++;
  } else if (request.indexOf("/DecSetPointReleOn24") != -1) {
    // Decrease the desired minimum temperature
    desiredMinTemp--;
  } else if (request.indexOf("/IncSetPointReleOff24") != -1) {
    // Increase the desired maximum temperature
    desiredMaxTemp++;
  } else if (request.indexOf("/DecSetPointReleOff24") != -1) {
    // Decrease the desired maximum temperature
    desiredMaxTemp--;
  } else if (request.indexOf("/IncSetPointReleOn25") != -1) {
    // Increase the minimum emergency temperature
    minEmergencyTemp++;
  } else if (request.indexOf("/DecSetPointReleOn25") != -1) {
    // Decrease the minimum emergency temperature
    minEmergencyTemp--;
  } else if (request.indexOf("/IncSetPointReleOff25") != -1) {
    // Increase the maximum emergency temperature
    maxEmergencyTemp++;
  } else if (request.indexOf("/DecSetPointReleOff254") != -1) {
    // Decrease the maximum emergency temperature
    maxEmergencyTemp--;
  }

  // Generate the HTML response
  client->println("<!DOCTYPE HTML>");
  client->println("<html><meta http-equiv=\"refresh\" content=\"10;URL=/\">");
  client->println("<a href=\"/run\">Logica Attiva</a> <br><a href=\"/stop\">Logica Disattiva</a> <br>Logic status=" + String(logicaon) + "<br>");
  client->println("Temperature= " + String(currentTemp) + " degrees<br>");
  client->println("Co2(ppm)= " + String(currentPPM) + "ppm<br>");
  client->println("temp(C)= " + String(currentTemperature) + " degrees<br>");
  client->println("humidity(%)= " + String(currentHumidity) + "%<br>");

  client->println("Desired minimum PPM&nbsp;&nbsp<a href=\"/IncSetPointReleOn22\">[+]</a>&nbsp;&nbsp<a href=\"/DecSetPointReleOn22\">[-]</a> value=" + String(desiredMinPPM) + "<br>");
  client->println("Desired maximum PPM&nbsp;&nbsp<a href=\"/IncSetPointReleOff22\">[+]</a>&nbsp;&nbsp<a href=\"/DecSetPointReleOff22\">[-]</a> value=" + String(desiredMaxPPM) + "<br>");

  client->println("Desired minimum temperature&nbsp;&nbsp<a href=\"/IncSetPointReleOn24\">[+]</a>&nbsp;&nbsp<a href=\"/DecSetPointReleOn24\">[-]</a> value=" + String(desiredMinTemp) + "<br>");
  client->println("Desired maximum temperature&nbsp;&nbsp<a href=\"/IncSetPointReleOff24\">[+]</a>&nbsp;&nbsp<a href=\"/DecSetPointReleOff24\">[-]</a> value=" + String(desiredMaxTemp) + "<br>");

  client->println("Minimum emergency temperature&nbsp;&nbsp<a href=\"/IncSetPointReleOn25\">[+]</a>&nbsp;&nbsp<a href=\"/DecSetPointReleOn25\">[-]</a> value=" + String(minEmergencyTemp) + "<br>");
  client->println("Maximum emergency temperature&nbsp;&nbsp<a href=\"/IncSetPointReleOff25\">[+]</a>&nbsp;&nbsp<a href=\"/DecSetPointReleOff25\">[-]</a> value=" + String(maxEmergencyTemp) + "<br>");

  client->println("Desired minimum humidity&nbsp;&nbsp<a href=\"/IncSetPointReleOn24\">[+]</a>&nbsp;&nbsp<a href=\"/DecSetPointReleOn24\">[-]</a> value=" + String(desiredMinHumidity) + "<br>");
  client->println("Desired maximum humidity&nbsp;&nbsp<a href=\"/IncSetPointReleOff24\">[+]</a>&nbsp;&nbsp<a href=\"/DecSetPointReleOff24\">[-]</a> value=" + String(desiredMaxHumidity) + "<br>");

  client->println("<a href=\"/releon22\">Turn on rele22</a> <a href=\"/releoff22\">Turn off rele22</a> status=" + String(digitalRead(relay22Pin)) + "<br>");
  client->println("<a href=\"/releon24\">Turn on rele24</a> <a href=\"/releoff24\">Turn off rele24</a> status=" + String(digitalRead(relay24Pin)) + "<br>");
  client->println("<a href=\"/releon25\">Turn on rele25</a> <a href=\"/releoff25\">Turn off rele25</a> status=" + String(digitalRead(relay25Pin)) + "<br>");
}

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