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...
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.
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.
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()
per capire come osserva lo sketch di esempio blinkWithoutDelay
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
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!
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.
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 ... 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()?
Dai su non esageriamo. pls
Allora! 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:
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 ... 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()?
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.