Go Down

Topic: MEGA2560 - LCD Menu e Rele (Read 324 times) previous topic - next topic

andrianopolino

Ciao a tutti,

sto costruendo un sistema di agricoltura aeroponica guidato da Arduino Mega.

Il sistema prevede: MEGA2560 + LCD Keypad Shield + Relè 5v

La mia idea è di usare i tasti del display per settare i tempi di ON/OFF del relè (cui sarà in futuro collegata la pompa per innaffiare le piante).

Sono riuscito a creare il menù che funziona abbastanza bene, il problema è che il relè non risponde ai comandi, ma cambia stato ogni volta che premo un qualsiasi tasto del display.

Qui sotto il codice. Mi potete aiutare per piacere?



Grazie mille
Ciao

PS purtroppo il programma è troppo lungo non riesco a postare il solo codice, allego il file arduino direttamente.

fabpolli

Ma ti cambia stato o, come penso, si accende e si spegne di continuo? Perchè nel loop richiami sempre la funzione pompa che non può far altro che far passare la pompa da uno stato all'altro (accesa 2,5 secondi e spenta 1)
Magari ho capito male come deve funzionare, vuoi che si comporti così o che si attivi solo dal menù?

andrianopolino

Ma ti cambia stato o, come penso, si accende e si spegne di continuo? Perchè nel loop richiami sempre la funzione pompa che non può far altro che far passare la pompa da uno stato all'altro (accesa 2,5 secondi e spenta 1)
Magari ho capito male come deve funzionare, vuoi che si comporti così o che si attivi solo dal menù?

L'idea sarebbe di selezionare con il menu i tempi di ON/OFF. Purtroppo non funziona, quindi ho fatto un passo indietro cercando di far accendere il il relè ad intervalli fissi (come hai giustamente notato 2,5sec ON e poi 1sec OFF) e poi nel frattempo poter usare il menù.

Anche in questo caso non funziona: il relè non segue la temporarizzazione di cui sopra, ma accende/spegne ogni volta che premo un tasto.

ps grazie mille per il supporto  :)

fabpolli

Procediamo per gradi ilò problema che non ti rispetta i tempi è dovuto a questa parte di codice:
Code: [Select]

previousMillis += Pompa_Accesa;

prova a cambiarli in
Code: [Select]

previousMillis = millis();

poi la logica della funzione Popma è comunque sbagliata nel senso che la prima volta che entra lo stato è LOW quindi entri nel then dell'if attivi la pompa e esci, al prossimo giro di loop la funzione viene richiamata e entra nel ramo else dell'if essendo la pompa accesa e quindi valuti
Code: [Select]

if (currentMillis - previousMillis >= Pompa_Spenta)

facendo sballare i tempi.
Ti suggerisco di rivedere il codice della funzione pompa facendo in modo che all'avvio della procedura attivi la pompa per il tempo prestabilito e nulla di più, passato questo tempo la pompa si deve disattivare e restare spenta a prescindere da cosa succede nel menù.
Quando sei arrivato a questo obiettivo allora integrerai facendo il controllo che trascorso il secondo si riattivi e a quel punto dovrai verificare che la pompa si accenda/spenga a prescindere dalle azioni del menù

Go Up