/**
ESP32 + DHT22 Example for Wokwi
https://wokwi.com/arduino/projects/322410731508073042
*/
#include <LiquidCrystal_I2C.h>
#include "DHTesp.h"
#define MAX_DHT_SENSORS 3
//impostazine pins usati per i moduli dht
const int DHT1_PIN = 27;
const int DHT2_PIN = 13;
const int DHT3_PIN = 14;
//impostazione pins usati per rele
const int RELE_RADIANT_PIN = 4;
const int RELE_FAN_PIN = 2;
//ipostazione pins per sensori temperatura acaqua
const int TEMP_ACQ_IN_PIN = 15;
const int TEMP_ACQ_OUT_PIN = 15;
//impostazine pins pulsanti
const int BTNUP_PIN = 19;
const int BTNOK_PIN = 18;
const int BTNDW_PIN = 23;
// set the LCD number of columns and rows
int lcdColumns = 20;
int lcdRows = 4;
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
DHTesp dhtSensor[MAX_DHT_SENSORS];
TempAndHumidity dhtData[MAX_DHT_SENSORS];
float avgTemp,avgHum;
void setup() {
Serial.begin(115200);
//inizializza i tre sensori
dhtSensor[0].setup(DHT1_PIN, DHTesp::DHT22);
dhtSensor[1].setup(DHT2_PIN, DHTesp::DHT22);
dhtSensor[2].setup(DHT3_PIN, DHTesp::DHT22);
// imposta pin ingresso pulsanti
pinMode(BTNUP_PIN,INPUT);
pinMode(BTNOK_PIN,INPUT);
pinMode(BTNDW_PIN,INPUT);
//LCD
// initialize LCD
lcd.init();
// turn on LCD backlight
lcd.backlight();
splashLCD();
}
void loop() {
//aggiornamento dati sensore
updateDhtData(dhtData);
//controllo condizioni e attivazione
//controllo corretto funzionamento sensori
if (chkSensor(dhtData)){
Serial.println("errore");
}
//calcolo media
avgTemp=averageTemp(dhtData);
avgHum=averageHum(dhtData);
//memorizzazione dati
printDhtData(dhtData,avgTemp,avgHum);
printLcdData(avgTemp,avgHum);
//controllo interfaccia utente
if (chkBtn()) {
printMenu();
}
delay(1000);
}
//Interfaccia Utente
//interfaccia a pannello di controllo
bool chkBtn(){
if (digitalRead(BTNDW_PIN) || digitalRead(BTNUP_PIN) || digitalRead(BTNOK_PIN) ){
return true;
}
else {
return false;
}
}
void printMenu(){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Impostazioni ");
lcd.setCursor(0, 1);
lcd.print("Ok per continuare");
lcd.setCursor(0, 2);
lcd.print(" **** ");
lcd.setCursor(0, 3);
lcd.print("o attendi per uscire");
delay(3000);
}
//interfaccia WEB
//app BLE
//controllo temperatura Acqua
//attivazione Radiante
//attivazione Radiente
//invio dati a cloud
//calcolo media
float averageTemp(TempAndHumidity data[]){
float avg;
for (int i=0;i<MAX_DHT_SENSORS;i++){
avg += data[i].temperature;
}
avg=avg/MAX_DHT_SENSORS;
return avg;
}
float averageHum(TempAndHumidity data[]){
float avg;
for (int i=0;i<MAX_DHT_SENSORS;i++){
avg += data[i].humidity;
}
avg=avg/MAX_DHT_SENSORS;
return avg;
}
//-----------------
//funzione che controlla che dati letti dai sensori non si discostano tra loro più di 5 gradi
//ritorna 0 se i dati rientrano nello scostamento
//o un numero intero che segnala quale sensore di discosta dagli altri due
short int chkSensor(TempAndHumidity dD[]){
short int test=0;
return 0;
}
//-----------------
//funzione che legge e memorizza i valori rilevati dalle sonde ambientali
void updateDhtData(TempAndHumidity dhtD[]){
for (int i=0;i<MAX_DHT_SENSORS;i++)
{
dhtD[i]=dhtSensor[i].getTempAndHumidity();
}
}
//funzione che stampa i valori rilevati
void printDhtData(TempAndHumidity data[], float mT, float mH){
for (int i=0;i<MAX_DHT_SENSORS;i++){
Serial.println("DHT " + String(i));
Serial.println("Temp: " + String( data[i].temperature, 2) + "°C");
Serial.println("Humidity: " + String( data[i].humidity, 1) + "%");
Serial.println("---");
}
Serial.println("media Temperatura ed umidità: "+String( mT, 2) + "°C " +String( mH,1) + "%");
}
void printLcdData(float tempX, float humX){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temperatura " + String(tempX,2) + " C");
lcd.setCursor(0,2);
lcd.print("Umidita' " + String(humX,1) + " %");
}
void splashLCD(){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Control Vino");
lcd.setCursor(0, 1);
lcd.print("by Thebe s.r.l.");
lcd.setCursor(0, 2);
lcd.print("& Angelo Perlin");
delay(3000);
}