Go Down

Topic: Problemi nel codice? (Read 935 times) previous topic - next topic

Leonida

Nov 11, 2012, 11:50 am Last Edit: Nov 11, 2012, 12:18 pm by UweFederer Reason: 1
Sfrutto questo porto per presentarmi e poi per presentare il mio problema.
mi piace l'elettronica da molti anni e ora che ho trovato Arduino mi sto cimentando nel suo utilizzo ma ho dei problemi perchè di programmazione non so molto.

Questo è il mio codice:


Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int timemin;
int timesec;
int ist;
int time1;
int time2;
int ann;
int sic;
int start;
boolean countdown=false;
boolean countdown1=false;
boolean countdown2=false;
boolean ciclo=false;

void setup(){
  pinMode(1,INPUT); //start
  pinMode(6,INPUT); //istantaneo
  pinMode(7,INPUT); //30sec
  pinMode(8,INPUT); //2min
  pinMode(9,INPUT); //annulla
  pinMode(10,INPUT); //sicura
  pinMode(13,OUTPUT); //uscita segnale
  lcd.begin(16, 2);
}

void loop(){
  start=digitalRead(1);
  ist=digitalRead(6);
  time1=digitalRead(7);
  time2=digitalRead(8);
  ann=digitalRead(9);
  sic=digitalRead(10);
  if(sic=HIGH && ciclo==true){
    if(ist=HIGH){
      digitalWrite(13,HIGH);
      delay(100);
      digitalWrite(13,LOW);
    }
    if(time1=HIGH){
      timesec=30;
    }
    if (time2=HIGH){
      timesec=120;
    }
    if(start=HIGH){
      countdown=true;
    }
  }
  if(ann=HIGH){
    ciclo=false;
  }
  else{
    ciclo=true;
  }
  if(sic=LOW){
    lcd.setCursor(1,0);
    lcd.print("Sicura Inserita");
  }
  if(countdown=true){
    if(countdown1=true){
      if(timesec=30){
        lcd.setCursor(1,0);
        lcd.print("Cntdwn avviato");
        lcd.setCursor(1,1);
        lcd.print(timemin);
        lcd.print(":");
        lcd.print(timesec);
        for(timesec=30;timesec<0;timesec-=1){
          delay(1000);
        }
      }
    }
    if(countdown2=true){
      if(timesec=120){
        lcd.setCursor(1,0);
        lcd.print("Cntdwn avviato");
        lcd.setCursor(1,1);
        lcd.print(timemin);
        lcd.print(":");
        lcd.print(timesec);
        if(timesec>60){
          timesec=0;
          timemin+=1;
        }
        for(timesec=120;timesec<0;timesec-=1){
          delay(1000);
        }
      }
    }
  }
  else{
    countdown=false;
  }
  if(timesec=0&&timemin==0){
    digitalWrite(13,HIGH);
    delay(200);
    digitalWrite(13,LOW);
  }
}



appena accendo la board sullo schermo appare "Cntdwn avviato" e timemin:timesec aumentano a dismisura all'infinito.
cosa c'è di sbagliato? (non mangiatemi)

uwefed

Ciao Leonida
usa il simblo # (code) per marcare il codive e non il quote. Mi sono permesso di cambiarlo nel Tuo post.

A un controllo superficiale noto che ci sono problemi in quasi tutti gli IF.
Devi fare attenzione alla differenza tra  = e == .

il = assegna a una variable un valore e come riultato logico é sempre vero.
il == confronta 2 variabili/valori ed é vero se sono uguali o falso se sono differenti.
Correggi il Tuo codice e vediamo.

http://arduino.cc/en/Reference/Assignment
http://arduino.cc/en/Reference/If

Ciao Uwe

Leonida

#2
Nov 11, 2012, 01:14 pm Last Edit: Nov 11, 2012, 01:34 pm by Leonida Reason: 1
ho fatto le correzioni ma continua ad andare un po per i fatti suoi e ritorna agli stati sbagliati

Questo è il nuovo codice:

Code: [Select]

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int timemin;
int timesec;
int ist;
int time1;
int time2;
int ann;
int sic;
int start;
boolean sic1=false;
boolean countdown=false;
boolean countdown1=false;
boolean countdown2=false;
boolean ciclo=false;

void setup(){
  pinMode(1,INPUT); //start
  pinMode(6,INPUT); //istantaneo
  pinMode(7,INPUT); //30sec
  pinMode(8,INPUT); //2min
  pinMode(9,INPUT); //annulla
  pinMode(10,INPUT); //sicura
  pinMode(13,OUTPUT); //uscita segnale
  lcd.begin(16, 2);
}

void loop(){
  start=digitalRead(1);
  ist=digitalRead(6);
  time1=digitalRead(7);
  time2=digitalRead(8);
  ann=digitalRead(9);
  sic=digitalRead(10);
  if(sic1==true && ciclo==true){
    if(ist==HIGH){
      digitalWrite(13,HIGH);
      delay(100);
      digitalWrite(13,LOW);
    }
    if(time1==HIGH){
      timesec=30;
    }
    if (time2==HIGH){
      timesec=120;
    }
    if(start==HIGH){
      countdown=true;
    }
  }
  if(ann==HIGH){
    ciclo=false;
  }
  else{
    ciclo=true;
  }
  if(sic==HIGH){
    sic1=true;
    lcd.clear();
  }
  else{
    lcd.setCursor(0,0);
    lcd.print("Sicura Inserita");
    lcd.setCursor(0,1);
    lcd.print("Disinserire");
  }   
  if(sic1==true){
    lcd.print("Pronto");
  }
  if(countdown==true){
    if(countdown1==true){
      if(timesec==30){
        lcd.setCursor(1,0);
        lcd.print("Cntdwn avviato");
        lcd.setCursor(1,1);
        lcd.print(timemin);
        lcd.print(":");
        lcd.print(timesec);
        for(timesec=30;timesec<0;timesec-=1){
          delay(1000);
        }
      }
    }
    if(countdown2==true){
      if(timesec==120){
        lcd.setCursor(1,0);
        lcd.print("Cntdwn avviato");
        lcd.setCursor(1,1);
        lcd.print(timemin);
        lcd.print(":");
        lcd.print(timesec);
        if(timesec>60){
          timesec=0;
          timemin+=1;
        }
        for(timesec=120;timesec<0;timesec-=1){
          delay(1000);
        }
      }
    }
  }
  else{
    countdown=false;
  }
  if(timesec==0&&timemin==0&&countdown==true){
    digitalWrite(13,HIGH);
    delay(200);
    digitalWrite(13,LOW);
  }
}

tuxduino

Code tags, non quote ;-)

leo72

Leggi dei pulsanti, per caso?
Ricordati dei "rimbalzi", falsi contatti che si traducono nel tuo codice in false letture per cui potresti avere gli stessi problemi di pressioni a caso.

tuxduino

Scusa ma quel codice è davvero poco leggibile. Per rendere la vita più facile a chi legge dovresti (IMHO):
- evitare di usare nomi di variabili abbreviate
- aggiungere commenti nei punti chiave del codice che spieghino cosa sta accadendo e in alcuni casi _perché_ viene fatta una certa scelta
- usa gli spazi per dare "aria" al codice
- premere CTRL-T nell'IDE prima di postare il codice: sistemerà automaticamente l'indentazione.
E soprattutto spiegare in termini semplici e discorsivi cosa dovrebbe fare il tuo programma.
:)

PaoloP

#6
Nov 11, 2012, 04:41 pm Last Edit: Nov 11, 2012, 04:49 pm by PaoloP Reason: 1
Hai messo le resistenze di pull-down sui pulsanti?

Leonida

@leo72: si, per la precisione leggo 6 pulsanti.

@tuxduino: metterò dei nomi alle variabili più precisi, scusa ma non ci avevo pensato, aggiungerò delle spiegazioni emettrò in ordine. il programma sarebbe un timer che allo scadere del tempo deve emettere un segnale sul pin13 per 100 millisecondi. deve avere 30 secondi(pin7) / 2 minuti(pin8) di countdown in base a quale pultante viene premuto più una protezione (pin10) e uno stop del conteggio (pin9) più un pulsante che fa emettere subito al pin13 il segnale (sempre per 100 millisecondi).

@PaoloP: per fare il pulsante ho seguito questa guida: http://www.maffucci.it/2010/12/06/arduino-lezione-03-controlliamo-un-led-con-un-pulsante/

PaoloP

#8
Nov 11, 2012, 05:07 pm Last Edit: Nov 11, 2012, 05:09 pm by PaoloP Reason: 1
Ok, però ricorda di mettere una resistenza da 330ohm in serie con il led, anche se è sul pin 13.
Inoltre ti consiglio di fare un po' di debug anche con la seriale e spostare il pulsante dal pin 1 al pin A0.
Anche i pin analogici possono essere usati per gli ingressi digitale (come i pulsanti). Basta che lo nomini nel codice come pin 14.

Quindi al posto di
Code: [Select]
pinMode(1,INPUT); //start
puoi mettere
Code: [Select]
pinMode(14,INPUT); //start
e spostare il pulsante sul pin A0.
In questo modo liberi il pin 0 e 1 e puoi usare la seriale.

Ho messo mano al codice... guarda se gira così.
Code: [Select]
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int timemin;
int timesec;
int ist;
int time1;
int time2;
int ann;
int sic;
int start;
boolean sic1=false;
boolean countdown=false;
boolean countdown1=false;
boolean countdown2=false;
boolean ciclo=false;

void setup(){
 pinMode(1,INPUT); //start
 pinMode(6,INPUT); //istantaneo
 pinMode(7,INPUT); //30sec
 pinMode(8,INPUT); //2min
 pinMode(9,INPUT); //annulla
 pinMode(10,INPUT); //sicura
 pinMode(13,OUTPUT); //uscita segnale

 lcd.begin(16, 2);
 lcd.setCursor(0,0);
 lcd.print("Avvio!!");
 delay(1000);
 lcd.clear();
}

void loop(){
 start=digitalRead(1);
 ist=digitalRead(6);
 time1=digitalRead(7);
 time2=digitalRead(8);
 ann=digitalRead(9);
 sic=digitalRead(10);
 delay(10); // debounce

 if(sic==HIGH){
   sic1=true;
   lcd.clear();
 }
 else{
   lcd.setCursor(0,0);
   lcd.print("Sicura Inserita");
   lcd.setCursor(0,1);
   lcd.print("Disinserire");
 }

 if(sic1==true){
   lcd.print("Pronto");
 }

 if(ann==HIGH){
   ciclo=false;
 }
 else{
   ciclo=true;
 }

 if(sic1==true && ciclo==true){
   if(ist==HIGH){
     digitalWrite(13,HIGH);
     delay(100);
     digitalWrite(13,LOW);
   }
   if(time1==HIGH){
     timesec=30;
   }
   if (time2==HIGH){
     timesec=120;
   }
   if(start==HIGH){
     countdown=true;
   }
 }

 if(countdown==true){

   if(countdown1==true){
     if(timesec==30){
       lcd.setCursor(1,0);
       lcd.print("Cntdwn avviato");
       lcd.setCursor(1,1);
       lcd.print(timemin);
       lcd.print(":");
       lcd.print(timesec);
       for(timesec=30;timesec<0;timesec-=1){
         delay(1000);
       }
     }
   }

   if(countdown2==true){
     if(timesec==120){
       lcd.setCursor(1,0);
       lcd.print("Cntdwn avviato");
       lcd.setCursor(1,1);
       lcd.print(timemin);
       lcd.print(":");
       lcd.print(timesec);
       if(timesec>60){
         timesec=0;
         timemin+=1;
       }
       for(timesec=120;timesec<0;timesec-=1){
         delay(1000);
       }
     }
   }
 }
 else{
   countdown=false;
 }

 if(timesec==0 && timemin==0 && countdown==true){
   digitalWrite(13,HIGH);
   delay(200);
   digitalWrite(13,LOW);
 }

}


Per la sicura, con il codice cosi implementato, devi montare un deviatore in modo che rimanga attivo, altrimenti devi mantenere il pulsante schiacciato.

tuxduino

Ora è un po' più chiaro... :-)
Secondo me dovresti studiarti il (mai abbatanza citato) blink without delay (sezione Examples dell'IDE) per togliere di mezzo tutti i delay, specialmente quel ciclo di 120 delay(1000) che di fatto "congela" l'arduino per ben 120 secondi... Tra l'altro si tratta di un intervallo di tempo non interrompibile, visto che non controlli i pulsanti mentre attendi...

Leonida

@PaoloP: ti (vi, a tutti) farò sapere questa sera perchè (intelligentemente...) non ho dietro il cavo per arduino...sono d'accordo con le tue correzioni e grazie per avermi informato per quell'impostazione dei pin analogici che basta rinominarli come 14, 15,...
per la sicura avevo in mente proprio di mettere un interruttore, l'ho fatto apposta a non metterci una variabile per usare un pulsante semplice

@tuxduino: ma se il pulsante annulla è messo fuori dal countdown perchè non dovrebbe rispondere mentre scorre il tempo?

tuxduino

Code: [Select]
for(timesec=120;timesec<0;timesec-=1){
          delay(1000);
        }


Durante questo ciclo for il programma non fa altro che attendere. Non c'è alcuna lettura dei pulsanti, né alcuna istruzione di interruzione del ciclo.
Per 2 minuti il programma è come se fosse fermo.

Idem per gli altri conteggi.

Per poter interrompere queste attese hai due strade: una, che sconsiglio, è replicare il controllo del pulsante di stop e/o di altri pulsanti che riterrai opportuno monitorare per decidere se interrompere l'attesa, uscendo dal ciclo prima del tempo; l'altra, che richiede un po' di sforzo ma ripaga nel lungo periodo è di imparare a programmare "per stati" anziché in modo sequenziale. Come forse ho già detto, studia bene l'esempio "blink without delay".

Leonida

non va, si blocca dopo l'avvio

tuxduino

"Estiquaatsi del fatto che non va... pensa che è meglio se va."

Ringraziamo come sempre il Grande Capo per le sue parole illuminanti.

]:)

(per capire la battuta bisogna aver ascoltato radio2 dalle 17 alle 18)

Leonida

si ma ora come lo sistemo? ho caricato il codice di PaoloP ma come dice "sicura inserita, disinserire" non risponde più

Go Up