Un delay che cambia tutto...

Ciao a tutti, le premesse usuali le vorrei rislvere in breve, ho riflettuto a lungo, letto e riletto, provato e riprovato... ma non trovo nulla del genere!
Sono stato un perito elettonico (ora grafico pubbliciario!) e dopo aver cercato una centralina in grado di gestire un orchidiario ho deciso di costruirla.
Un arduino, 4 resistenze, 3 bulsanti... Ora veniamo al codice:

arduino uno e lcs 16x2,
al menu accedo correttamente con 3 pulsanti e fino ad ora tutto bene:

se menu=1 e livello=0 temperatura
se menu=1 e livello =1 illuminazione...

Un incremento gestisce la cosa, button.h garantisce l'antirimbalzo.
Tutto funzionante! Il problema è questo, se aggiungo un delay>40 va tutto a pallino!
Insomma, chiedo in Serial.print menu e livello mi da 1 ed 1, se tolgo il delay mi da 0 e 0.

Chiedo quindi se qualcuno ha qualche spiegazione o qualche idea...

condelay40.tiff (70.9 KB)

senzadelay.tiff (73.7 KB)

Avrei un po' di idee:
Allega i Sketch INTERI come file e non come immagini del video.
Ciao Uwe

Certo, lo allego ridotto ai minimi termini....

rimosso.ino (2.75 KB)

Vorrei aiutarTi ma come posso farlo se non dai gli sketch dove fa errore.
Ciao Uwe

Usa i code tags (pulsante # nell'editor)

Scusate... mi serve un po di rodaggio....

#include <Button.h>                                                    // Libreria Uniquepress (antirimbalzo)
//-----------------------DICHIARAZIONE VARIABILI-----------------------
byte menu=0;                              //Menu                       // Contatore menù 1
byte level=0;                             //Menu                         // Contatore livello (menux = 0  livello = 1) come x e y nello schema del menu
//-----------------------DICHIARAZIONE per LIBRERIE -------------------

Button tastomenu  = Button(9, BUTTON_PULLUP_INTERNAL, true, 50);       // Identifica il Pin al quale è collegato il tasto Menu
Button tastoset  = Button(11, BUTTON_PULLUP_INTERNAL, true, 50);         // Identifica il Pin al quale è collegato il tasto Set
Button tastomeno = Button(10, BUTTON_PULLUP_INTERNAL, true, 50);       // Identifica il Pin al quale è collegato il tasto Tastomeno
//-----------------------VOID SETUP () --------------------------------
void setup() {
               Serial.begin(9600);                                     // Apre la porta seriale a 9600             
             }
//-----------------------VOID LOOP () --------------------------------
void loop()
{
  delay(1000);                                                              //!!!!!!!!!! DELAY INCRIMINATO !!!!!!!!!!!!!!!!
//-----------------------Gestione menù ---------------------------------
   
         
    if((tastomenu.uniquePress() && level==0)) { (menu=menu++); }                     
    if(tastoset.uniquePress() )  { (level++);  }
                         
    if (menu == 1 && level == 0) {}                                                     
    if (menu == 1 && level == 1) {}                                                       
    if (menu == 1 && level == 2) {}                                                       
    if (menu == 1 && level == 3) {}                                                       
    if (menu == 1 && level == 4) {}                                                       
    if (menu == 1 && level == 5) { (level=0);}

    if (menu ==2)  {}                                                     
    if (menu ==3)  {}                                                       
    if (menu ==4)  {}                                                     
    if (menu ==5)  {}                                                     
             
    if (menu ==6)  { delay(500); (menu=0); }             

    Serial.print("Dopo :"); Serial.print(menu); Serial.println(level);
       
    if (menu==0 && level==0) {}
    if (menu==0 && level==1) {}

}                                                  // Fine Loop

Probabilmente interferisce con l'antirimbalzo, dato anche in quella libreria ci sono dei delay, la button aspetta un pochino e anche nel loop aspetta un pochino e non si mettono d'accordo. :slight_smile:

delay() = male

pablos:
Probabilmente interferisce con l'antirimbalzo, dato anche in quella libreria ci sono dei delay, la button aspetta un pochino e anche nel loop aspetta un pochino e non si mettono d'accordo. :slight_smile:

delay() = male

più probabile che la libreria usi i millis(), in ogni caso anche io sono della vostra stessa idea.

@dvluca: impara ad usare la millis() e non usare mai più la delay() :grin:
per capire come osserva lo sketch di esempio blinkWithoutDelay

dvluca, cosí non funziona.
Non puoi chiederci un aiuto dandoci un sketch che non é quello che Ti da i problemi.
Ciao Uwe

Ciao, forse non sono riuscito a spiegarmi;
Questo da problemi!

prendo l'arduino, senza collegamenti eccetto l'USB, (senza bottoni, led, sonde, nulla di nulla)

copi il codice che ho inserito sopra,

fai l'upload senza delay, apri la seriale e dice: menu= 0 Level =0 ...poi...
fai l'upload con il delay, april la seriale e dice: menu= 1 Level =1

Vi prego di verifcare, sono certo di queste condizioni,

Il delay è male, lo sò... ma il delay non manda tutto a pallino!
Se avessi chiesto: "perchè se metto un delay di 2 ore non funziona nulla?" la risposta sarebbe ovvia per tutti,
Invece, in questo caso, il delay, da solo, altera 2 variabili!

perchè quel delay va a interferire con i tempi di milli memorizzati dalla libreria button.h per calcolare lo stato dei pulsanti, mandando tutto a pallino.

lo stesso vale per il delay(500) che vedo più avanti, ma viene chiamato in rari casi e quindi è un bug latente.

apri la button.h / button.cpp e leggiti il codice, dovresti capire cosa succede

La libreria dovrebbe funzionare così:

if (bitRead(state,CURRENT) != bitRead(state,PREVIOUS)){
bitWrite(state,CHANGED,true);

Leggi il tasto, prima era o ed adesso è 1 ;
prima era 1 ed adesso è 0;
bene lo stato è cambiato!

La libreria non ha delay ne millis...

lo stato iniziale era dei pin ai quali (non) sono collegati i bottoni è dichiarato a 0, i bottoni non ci sono! (quindi il problema non è hardware)
Scusate ma proprio non capisco!

prova a spostare quel delay 1000 in fondo al loop, se non altro almeno prima vede i tasti premuti ed esegue le relative cose, poi aspetta 1 sec.

aspetta, se ai pin dei bottoni non è presente pull up o pull down allora è normale avere cose a random

pablos:
prova a spostare quel delay 1000 in fondo al loop, se non altro almeno prima vede i tasti premuti ed esegue le relative cose, poi aspetta 1 sec.

Un delay di 1 secondo è distruttivo ovunque tu lo metta.

tuxduino:

pablos:
prova a spostare quel delay 1000 in fondo al loop, se non altro almeno prima vede i tasti premuti ed esegue le relative cose, poi aspetta 1 sec.

Un delay di 1 secondo è distruttivo ovunque tu lo metta.

lol .. è distruttivo, catastrofico, una cosa disumana, da ergastolo :slight_smile: ... dipende sempre cosa devi fare, posso comprare un I7 e fargli fare solo un timer da 1 secondo, quello che faccio del m.controllore o microprocessore sono affari miei ... l'istruzione esiste e usarla o no è una mia scelta. Perchè non impicchiamo quello che ha creato l'istruzione delay()? :fearful:
Dai su non esageriamo. pls

Allora! :slight_smile: il deley non mi serve, ne prima ne dopo; non è questo il punto!
Il nodo della questione è: i dati son sono random puoi resettare 10 volte e avrai sempre le stesse letture:
Con deley: menu=1 level=1
Senza: menu=0 level=0
I tasti li posso collegare o scollegare ma non cambia nulla!

pablos:

tuxduino:

pablos:
prova a spostare quel delay 1000 in fondo al loop, se non altro almeno prima vede i tasti premuti ed esegue le relative cose, poi aspetta 1 sec.

Un delay di 1 secondo è distruttivo ovunque tu lo metta.

lol .. è distruttivo, catastrofico, una cosa disumana, da ergastolo :slight_smile: ... dipende sempre cosa devi fare, posso comprare un I7 e fargli fare solo un timer da 1 secondo, quello che faccio del m.controllore o microprocessore sono affari miei ... l'istruzione esiste e usarla o no è una mia scelta. Perchè non impicchiamo quello che ha creato l'istruzione delay()? :fearful:
Dai su non esageriamo. pls

Appunto, non esageriamo. E non generalizziamo. Leggi la mia battuta come risposta al tuo commento: spostare delay(1000) da un punto all'altro così "almeno primva vede i tasti premuti..." ecc. non cambia nulla. Il problema è che i segnali vengono campionati una volta al secodo, e ritardare prima o dopo la loro campionatura non modifica questo fatto.

(edit: nella fretta avevo dimenticato questo: :slight_smile: )

Qui il punto è rimane perchè!

:0