Buongiorno a tutti,
sono nuovo nel forum infatti questo è il mio primo argomento pubblicato.
sto lavorando da un po a questo progetto ma sono arrivato a scontrarmi con un problema che non riesco a risolvere in nessun modo ed eccomi qui sul forum.
DESCRIZIONE DEL PROGETTO:
serra completamente automatizzata con regolazione di : temperatura, umidità, e cicli di areazione.
in base ai parametri impostati, Arduino mantiene costanti le condizioni all'interno della serra e
sul display è possibile visualizzare: i valori attuali, i valori registrati in Arduino, dei checkbox che mostrano in tempo reale quale attuatore è attivo ed infine è possibile selezionare tramite i rispettivi pulsanti il funzionamento in manuale di ogni singolo attuatore ed escluderlo cosi dal ciclo automatico.
il tutto è indicizzato in modo da poter cambiare i parametri a proprio piacimento, soprattutto in base alla tipologia di coltura in serra, tramite un display Nextion "nx4827t043_011" ed un Arduino uno.
Il display è programmato con la libreria ufficiale (modificata in modo da essere compatibile con arduino)
Il problema è il seguente.
se faccio girare il programma caricando in Arduino le singole funzioni una per volta tutto funziona correttamente.
Nel momento in cui metto tutte le funzioni insieme e carico nell'Arduino alcuni pulsanti sul display non funzionano più.
Non riesco a capire se mettendo tutti insieme ci sia qualche pezzo di programma che entra in qualche loop strano oppure se ho sbagliato qualcosa io.
Il programma non è così complesso è solo un po lungo, spero che qualcuno con più esperienza di me riesca a indicarmi l'errore che ho commesso.
GRAZIE IN ANTICIPO.
ecco il programma.
#include <Nextion.h>
#include <SimpleDHT.h>
NexText Temperatura_Letta = NexText(0, 7, "t50");
NexText Umidita_Letta = NexText(0, 8, "t51");
NexCheckbox Presenza_Luce = NexCheckbox(0, 12, "c8");
NexNumber Temperatura_Max_Giorno = NexNumber(1, 5, "n50");
NexNumber Temperatura_Min_Giorno = NexNumber(1, 6, "n51");
NexNumber Temperatura_Max_Notte = NexNumber(1, 20, "n54");
NexNumber Temperatura_Min_Notte = NexNumber(1, 21, "n55");
NexNumber Umidita_Max = NexNumber(1, 13, "n52");
NexNumber Umidita_Min = NexNumber(1, 14, "n53");
NexButton Pulsante_Invio_Temp = NexButton(1, 7, "i0");
NexNumber Ventilatore_Ton_Set = NexNumber(2, 8, "n58");
NexNumber Ventilatore_Toff_Set = NexNumber(2, 9, "n59");
NexNumber Ventilatore_Ton_Arduino = NexNumber(2, 20, "n60");
NexNumber Ventilatore_Toff_Arduino = NexNumber(2, 21, "n61");
NexNumber Estrattore_Ton_Set = NexNumber(2, 14, "n62");
NexNumber Estrattore_Toff_Set = NexNumber(2, 15, "n63");
NexNumber Estrattore_Ton_Arduino = NexNumber(2, 24, "n64");
NexNumber Estrattore_Toff_Arduino = NexNumber(2, 25, "n65");
NexButton Pulsante_Invio_Aria = NexButton(2, 16, "i1");
NexButton Pulsante_On_Tenda_Mano = NexButton(3, 6, "b10");
NexButton Pulsante_Off_Tenda_Mano = NexButton(3, 7, "b11");
NexText Txt_Tenda_Mano = NexText(3, 20, "t53");
NexButton Pulsante_On_Estrattore_Mano = NexButton(3, 10, "b12");
NexButton Pulsante_Off_Estrattore_Mano = NexButton(3, 11, "b13");
NexText Txt_Estrattore_Mano = NexText(3, 21, "t54");
NexButton Pulsante_On_Ventilatore_Mano = NexButton(3, 13, "b14");
NexButton Pulsante_Off_Ventilatore_Mano = NexButton(3, 14, "b15");
NexText Txt_Ventilatore_Mano = NexText(3, 18, "t55");
NexButton Pulsante_On_Umidificatore_Mano = NexButton(3, 16, "b16");
NexButton Pulsante_Off_Umidificatore_Mano = NexButton(3, 17, "b17");
NexText Txt_Umidificatore_Mano = NexText(3, 19, "t56");
NexCheckbox Checkbox_Tenda_On = NexCheckbox(4, 7, "c4");
NexCheckbox Checkbox_Estrattore_On = NexCheckbox(4, 5, "c5");
NexCheckbox Checkbox_Ventilatore_On = NexCheckbox(4, 3, "c6");
NexCheckbox Checkbox_Umidificatore_On = NexCheckbox(4, 1, "c7");
NexNumber Temp_Giorno_Max_Set = NexNumber(5, 5, "n70");
NexNumber Temp_Giorno_Min_Set = NexNumber(5, 6, "n71");
NexNumber Temp_Notte_Max_Set = NexNumber(5, 19, "n74");
NexNumber Temp_Notte_Min_Set = NexNumber(5, 20, "n75");
NexNumber Umi_Max_Set = NexNumber(5, 12, "n72");
NexNumber Umi_Min_Set = NexNumber(5, 13, "n73");
NexTouch *nex_list[] = {
&Pulsante_Invio_Temp, &Pulsante_Invio_Aria,
&Pulsante_On_Tenda_Mano, &Pulsante_Off_Tenda_Mano,
&Pulsante_On_Estrattore_Mano, &Pulsante_Off_Estrattore_Mano,
&Pulsante_On_Ventilatore_Mano, &Pulsante_Off_Ventilatore_Mano,
&Pulsante_On_Umidificatore_Mano, &Pulsante_Off_Umidificatore_Mano,
NULL
};
SimpleDHT22 dht22(5);
float temp = 0;
float umi = 0;
unsigned int lux;
const int tenda = 8;
const int umidificatore = 9;
const int ventilatore = 10;
const int estrattore = 11;
bool t = false;
bool u = false;
bool v = false;
bool e = false;
bool t_mano = false;
bool u_mano = false;
bool v_mano = false;
bool e_mano = false;
unsigned long Temp_Max_Giorno = 25;
unsigned long Temp_Min_Giorno = 20;
unsigned long Temp_Max_Notte = 25;
unsigned long Temp_Min_Notte = 20;
unsigned long Umi_Max = 60;
unsigned long Umi_Min = 40;
unsigned long HMI_t1, HMI_dt;
unsigned long V_t1, V_dt1;
bool VENT = LOW;
unsigned long tempoVent = 0;
unsigned long tempoVent_ON = 1;
unsigned long tempoVent_OFF = 4;
unsigned long bk_V_ON;
unsigned long bk_V_OFF;
unsigned long E_t1, E_dt1;
bool EST = LOW;
unsigned long tempoEst = 0;
unsigned long tempoEst_ON = 1;
unsigned long tempoEst_OFF = 9;
unsigned long bk_E_ON;
unsigned long bk_E_OFF;
unsigned long h = 60000;
void setup() {
Serial.begin(9600);
nexInit();
Pulsante_Invio_Temp.attachPop(Inviadati_Temperatura, &Pulsante_Invio_Temp);
Pulsante_Invio_Aria.attachPop(Timer, &Pulsante_Invio_Aria);
Pulsante_On_Tenda_Mano.attachPop(manu_tenda_on, &Pulsante_On_Tenda_Mano);
Pulsante_Off_Tenda_Mano.attachPop(manu_tenda_off, &Pulsante_Off_Tenda_Mano);
Pulsante_On_Estrattore_Mano.attachPop(manu_estrattore_on, &Pulsante_On_Estrattore_Mano);
Pulsante_Off_Estrattore_Mano.attachPop(manu_estrattore_off, &Pulsante_Off_Estrattore_Mano);
Pulsante_On_Ventilatore_Mano.attachPop(manu_ventilatore_on, &Pulsante_On_Ventilatore_Mano);
Pulsante_Off_Ventilatore_Mano.attachPop(manu_ventilatore_off, &Pulsante_Off_Ventilatore_Mano);
Pulsante_On_Umidificatore_Mano.attachPop(manu_umidificatore_on, &Pulsante_On_Umidificatore_Mano);
Pulsante_Off_Umidificatore_Mano.attachPop(manu_umidificatore_off, &Pulsante_Off_Umidificatore_Mano);
pinMode(tenda, OUTPUT);
pinMode(umidificatore, OUTPUT);
pinMode(ventilatore, OUTPUT);
pinMode(estrattore, OUTPUT);
digitalWrite(tenda, HIGH);
digitalWrite(umidificatore, HIGH);
digitalWrite(ventilatore, HIGH);
digitalWrite(estrattore, HIGH);
}
void loop() {
nexLoop(nex_list);
Ciclo();
Leggi();
Attuatori();
HMI_dt = millis() - HMI_t1;
if (HMI_dt > 300) {
Lettura_Temp_Umi_Luce();
HMI_t1 = millis();
}
}
void Ciclo() {
if (lux > 100) {
if (t_mano == false) {
if (temp <= Temp_Min_Giorno) {
digitalWrite(tenda, LOW);
t = true;
} else if (temp >= Temp_Max_Giorno) {
digitalWrite(tenda, HIGH);
t = false;
}
}
} else if (lux < 60) {
if (t_mano == false) {
if (temp <= (Temp_Min_Notte)) {
digitalWrite(tenda, LOW);
t = true;
} else if (temp >= Temp_Max_Notte) {
digitalWrite(tenda, HIGH);
t = false;
}
}
}
if (temp > 30.00) {
digitalWrite(estrattore, LOW);
digitalWrite(ventilatore, LOW);
digitalWrite(umidificatore, HIGH);
e = true;
v = true;
u = false;
} else if (temp <= 30.00) {
if (u_mano == false) {
if (umi >= Umi_Max) {
digitalWrite(umidificatore, HIGH);
u = false;
} else if (umi <= Umi_Min) {
digitalWrite(umidificatore, LOW);
u = true;
}
}
if (v_mano == false) {
V_dt1 = millis() - V_t1;
if (V_dt1 >= tempoVent) {
V_t1 = millis();
VENT = !VENT;
digitalWrite(ventilatore, !VENT);
if (VENT) {
bk_V_ON = tempoVent = (tempoVent_ON * h);
Ventilatore_Ton_Arduino.setValue(bk_V_ON / h);
v = true;
} else {
bk_V_OFF = tempoVent = (tempoVent_OFF * h);
Ventilatore_Toff_Arduino.setValue(bk_V_OFF / h);
v = false;
}
}
}
if (e_mano == false) {
E_dt1 = millis() - E_t1;
if (E_dt1 >= tempoEst) {
E_t1 = millis();
EST = !EST;
digitalWrite(estrattore, !EST);
if (EST) {
bk_E_ON = tempoEst = (tempoEst_ON * h);
Estrattore_Ton_Arduino.setValue(bk_E_ON / h);
e = true;
} else {
bk_E_OFF = tempoEst = (tempoEst_OFF * h);
Estrattore_Toff_Arduino.setValue(bk_E_OFF / h);
e = false;
}
}
}
}
}
void Lettura_Temp_Umi_Luce() {
lux = analogRead(A1);
dht22.read2(&temp, &umi, NULL);
if (lux > 100) {
Presenza_Luce.Set_font_color_pco(1024);
} else if (lux < 60) {
Presenza_Luce.Set_font_color_pco(65535);
}
String command = "t50.txt=\"" + String(temp, 1) + "\"";
Serial.print(command);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
String command2 = "t51.txt=\"" + String(umi, 1) + "\"";
Serial.print(command2);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
}
void Inviadati_Temperatura(void *ptr) {
Temperatura_Max_Giorno.getValue(&Temp_Max_Giorno);
Temperatura_Min_Giorno.getValue(&Temp_Min_Giorno);
Temperatura_Max_Notte.getValue(&Temp_Max_Notte);
Temperatura_Min_Notte.getValue(&Temp_Min_Notte);
Umidita_Max.getValue(&Umi_Max);
Umidita_Min.getValue(&Umi_Min);
}
void Leggi() {
Temp_Giorno_Max_Set.setValue(Temp_Max_Giorno);
Temp_Giorno_Min_Set.setValue(Temp_Min_Giorno);
Temp_Notte_Max_Set.setValue(Temp_Max_Notte);
Temp_Notte_Min_Set.setValue(Temp_Min_Notte);
Umi_Max_Set.setValue(Umi_Max);
Umi_Min_Set.setValue(Umi_Min);
}
void Timer(void *ptr) {
Ventilatore_Ton_Set.getValue(&tempoVent_ON);
Ventilatore_Toff_Set.getValue(&tempoVent_OFF);
Estrattore_Ton_Set.getValue(&tempoEst_ON);
Estrattore_Toff_Set.getValue(&tempoEst_OFF);
Ventilatore_Ton_Arduino.setValue(tempoVent_ON);
Ventilatore_Toff_Arduino.setValue(tempoVent_OFF);
Estrattore_Ton_Arduino.setValue(tempoEst_ON);
Estrattore_Toff_Arduino.setValue(tempoEst_OFF);
}
void manu_tenda_on(void *ptr) {
t_mano = true;
digitalWrite(tenda, LOW);
t = true;
}
void manu_tenda_off(void *ptr) {
t_mano = false;
digitalWrite(tenda, HIGH);
t = false;
}
void manu_estrattore_on(void *ptr) {
e_mano = true;
digitalWrite(estrattore, LOW);
e = true;
}
void manu_estrattore_off(void *ptr) {
e_mano = false;
digitalWrite(estrattore, HIGH);
e = false;
}
void manu_ventilatore_on(void *ptr) {
v_mano = true;
digitalWrite(ventilatore, LOW);
v = true;
}
void manu_ventilatore_off(void *ptr) {
v_mano = false;
digitalWrite(ventilatore, HIGH);
v = false;
}
void manu_umidificatore_on(void *ptr) {
u_mano = true;
digitalWrite(umidificatore, LOW);
u = true;
}
void manu_umidificatore_off(void *ptr) {
u_mano = false;
digitalWrite(umidificatore, HIGH);
u = false;
}
void Attuatori() {
if (t) {
Checkbox_Tenda_On.Set_font_color_pco(1024);
} else {
Checkbox_Tenda_On.Set_font_color_pco(0);
}
if (e) {
Checkbox_Estrattore_On.Set_font_color_pco(1024);
} else {
Checkbox_Estrattore_On.Set_font_color_pco(0);
}
if (v) {
Checkbox_Ventilatore_On.Set_font_color_pco(1024);
} else {
Checkbox_Ventilatore_On.Set_font_color_pco(0);
}
if (u) {
Checkbox_Umidificatore_On.Set_font_color_pco(1024);
} else {
Checkbox_Umidificatore_On.Set_font_color_pco(0);
}
if (t_mano == true) {
Txt_Tenda_Mano.setText("Manuale");
Txt_Tenda_Mano.Set_background_color_bco(1024);
} else {
Txt_Tenda_Mano.setText("Automatico");
Txt_Tenda_Mano.Set_background_color_bco(16904);
}
if (e_mano == true) {
Txt_Estrattore_Mano.setText("Manuale");
Txt_Estrattore_Mano.Set_background_color_bco(1024);
} else {
Txt_Estrattore_Mano.setText("Automatico");
Txt_Estrattore_Mano.Set_background_color_bco(16904);
}
if (v_mano == true) {
Txt_Ventilatore_Mano.setText("Manuale");
Txt_Ventilatore_Mano.Set_background_color_bco(1024);
} else {
Txt_Ventilatore_Mano.setText("Automatico");
Txt_Ventilatore_Mano.Set_background_color_bco(16904);
}
if (u_mano == true) {
Txt_Umidificatore_Mano.setText("Manuale");
Txt_Umidificatore_Mano.Set_background_color_bco(1024);
} else {
Txt_Umidificatore_Mano.setText("Automatico");
Txt_Umidificatore_Mano.Set_background_color_bco(16904);
}
}