Pages: [1] 2   Go Down
Author Topic: Un delay che cambia tutto...  (Read 2317 times)
0 Members and 1 Guest are viewing this topic.
Milano, IT
Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.86 KB, 996x383 - viewed 145 times.)

* senzadelay.tiff (73.66 KB, 1033x365 - viewed 143 times.)
« Last Edit: January 23, 2013, 06:21:50 pm by dvluca » Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21938
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Milano, IT
Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

* rimosso.ino (2.75 KB - downloaded 21 times.)
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21938
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Usa i code tags (pulsante # nell'editor)
Logged

Milano, IT
Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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

Logged

Genova
Offline Offline
Faraday Member
**
Karma: 43
Posts: 3478
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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. smiley
Logged

no comment

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

delay() = male
Logged

0
Offline Offline
Shannon Member
****
Karma: 136
Posts: 10525
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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. smiley
Quote
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()  smiley-mr-green
per capire come osserva lo sketch di esempio blinkWithoutDelay
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21938
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

dvluca, cosí non funziona.
Non puoi chiederci un aiuto dandoci un sketch che non é quello che Ti da i problemi.
Ciao Uwe
« Last Edit: January 24, 2013, 09:45:31 am by uwefed » Logged

Milano, IT
Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!

« Last Edit: January 24, 2013, 05:41:25 am by dvluca » Logged

0
Offline Offline
Shannon Member
****
Karma: 136
Posts: 10525
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Milano, IT
Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!

Logged

Genova
Offline Offline
Faraday Member
**
Karma: 43
Posts: 3478
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: January 24, 2013, 07:25:00 am by pablos » Logged

no comment

0
Offline Offline
Shannon Member
****
Karma: 136
Posts: 10525
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1] 2   Go Up
Jump to: