Offline
Newbie
Karma: 0
Posts: 7
|
 |
« on: November 11, 2012, 05:50:45 am » |
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: #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)
Offline
Brattain Member
Karma: 162
Posts: 15752
+39 349 2158303
|
 |
« Reply #1 on: November 11, 2012, 06:23:23 am » |
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/Assignmenthttp://arduino.cc/en/Reference/IfCiao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 7
|
 |
« Reply #2 on: November 11, 2012, 07:14:30 am » |
ho fatto le correzioni ma continua ad andare un po per i fatti suoi e ritorna agli stati sbagliati Questo è il nuovo codice: #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
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #3 on: November 11, 2012, 07:28:04 am » |
Code tags, non quote ;-)
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Online
Brattain Member
Karma: 219
Posts: 16508
Don't know what I do
|
 |
« Reply #4 on: November 11, 2012, 09:21:02 am » |
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
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #5 on: November 11, 2012, 10:12:12 am » |
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. 
|
|
|
|
|
Logged
|
|
|
|
|
Cagliari
Offline
Faraday Member
Karma: 49
Posts: 3030
|
 |
« Reply #6 on: November 11, 2012, 10:41:19 am » |
Hai messo le resistenze di pull-down sui pulsanti?
|
|
|
|
« Last Edit: November 11, 2012, 10:49:19 am by PaoloP »
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 7
|
 |
« Reply #7 on: November 11, 2012, 10:58:23 am » |
@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
Offline
Faraday Member
Karma: 49
Posts: 3030
|
 |
« Reply #8 on: November 11, 2012, 11:07:42 am » |
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 pinMode(1,INPUT); //start puoi mettere 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ì. #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
|
|
|
|
|
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)
|
 |
« Reply #9 on: November 11, 2012, 11:10:29 am » |
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
Newbie
Karma: 0
Posts: 7
|
 |
« Reply #10 on: November 11, 2012, 11:28:03 am » |
@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
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #11 on: November 11, 2012, 11:48:13 am » |
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
Newbie
Karma: 0
Posts: 7
|
 |
« Reply #12 on: November 11, 2012, 03:00:12 pm » |
non va, si blocca dopo l'avvio
|
|
|
|
|
Logged
|
|
|
|
|
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)
|
 |
« Reply #13 on: November 11, 2012, 03:12:01 pm » |
"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)
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 7
|
 |
« Reply #14 on: November 11, 2012, 03:15:50 pm » |
si ma ora come lo sistemo? ho caricato il codice di PaoloP ma come dice "sicura inserita, disinserire" non risponde più
|
|
|
|
|
Logged
|
|
|
|
|
|