Pages: [1]   Go Down
Author Topic: Problemi nel codice?  (Read 836 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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)
« Last Edit: November 11, 2012, 06:18:32 am by UweFederer » Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 266
Posts: 21652
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho fatto le correzioni ma continua ad andare un po per i fatti suoi e ritorna agli stati sbagliati

Questo è il nuovo codice:

Code:
#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);
  }
}
« Last Edit: November 11, 2012, 07:34:30 am by Leonida » 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

Code tags, non quote ;-)
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 332
Posts: 22804
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7123
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai messo le resistenze di pull-down sui pulsanti?
« Last Edit: November 11, 2012, 10:49:19 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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/
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7123
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
pinMode(1,INPUT); //start
puoi mettere
Code:
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:
#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.
« Last Edit: November 11, 2012, 11:09:43 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

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

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

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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?
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

Code:
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".
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

non va, si blocca dopo l'avvio
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

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

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

 smiley-evil

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

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: