salve .
ho fatto un semplice timer con scghermo lcd usando arduino uno.
con questo timer con trollo l acccensione di led.
e funziona perfettamente se il conteggio viene fatto su una sola variabile , mi spiego meglio,
volevo impostare il tempo con scala sessantesimalle.
per l incremento il reset e il conteggio funziona ma volevo anche decrementare , in caso di sbaglio,
e qui le cose si complicano.
Non riesco a mettere il tag per il codice cmq
Verifica che il tasto avvio si premuto . Pone la variabile bool = tre
un if che verifica la variabile bool . Se e truce accendo il led e poi la funzione simile a quella postata sopra pe conto alla rovescia.
E un altro if che verifica se a《=0 && b《=0 la variabile diventa false e il led si spegne
Mi so accende il led quindi la variabile cambia di stato però non funziona la parte del conto alla rovescia
Qualche consiglio? Grazie
Non si capisce molto quello che vorresti fare Parli di cronometro ma tu decrementi una variabile alla pressione di un pulsante, questo non mi sembra un cronometro.
Io partirei dall'inizio, da cosa tu vuoi fare con la variabile a e la variabile b cosa vuoi ottenere, e poi pensare a come farlo.
Perché dal tuo codice e dalla tua spiegazione non si capisce cosa vorresti fare, quindi se non sappiamo la meta non ti si può indicare la strada
Bisogna dare nomi significativi alle variabili, a e b non dicono niente
Cronometro che conta i centesimi di secondo
Definiamo due variabili secondi e centesimi, inizializzate a valore 60
Se premo il pulsante centesimi viene decrementata di uno, si fa con un if()
Se centesimi arriva a zero, decremento di uno secondi e riporto centesimi a 60, si fa con un altro if()
Se secondi arriva a zero, porto secondi e centesimi di nuovo a 60, si fa con un altro if()
/* variabili globali dichiarate all'esterno di tutte le funzioni */
byte secondi=60;
byte centesimi=60;
/*********************************/
if(digitalRead(pulsante)==HIGH){
centesimi--; //decremento di uno
}
if(centesimi==0){
secondi--; //decremento secondi di uno
centesimi=60; //riporto centesimi a 60
}
if(secondi==0){
secondi=60;
centesimi=60;
}
/* Qui di seguito il codice per stampare su lcd */
tanto per non indurre in confusione con i tipi di variabili, essendo byte senza segno le variabili non potranno mai essere < di 0, sarebbe meglio fare il confronto solo con if (variabile == 0)
-zef- hai ragione, ho corretto le condizioni usare <= è una rimembranza da controllo numerico, siccome la posizione è calcolata a millesimi, è difficile avere un valore esatto della posizione "ma sbaglia sempre di qualche millesimo", allora nel manuale di programmazione consigliavano di usare sempre <= >= e mai uguale = "perché difficile che si verificasse"
int bottonepiu = 0;
int bottonemeno = 0;
int bottoneazzera = 0;
int bottoneavvio = 0;
int a = 0;
int b= 0;
boolean i = false;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
const int piu = 9;
const int meno = 8;
const int azzera = 7;
const int avvio = 6;
int led = 10;
void setup() {
lcd.begin();
lcd.backlight();
pinMode(piu , INPUT);
pinMode(meno , INPUT);
pinMode(azzera , INPUT);
pinMode(avvio , INPUT);
pinMode(led, OUTPUT);
i=false;
}
void loop() {
bottonepiu = digitalRead(piu);
bottonemeno = digitalRead(meno);
bottoneazzera = digitalRead(azzera);
bottoneavvio = digitalRead(avvio);
//-----------------------------------------aumenta il tempo
if(bottonepiu == HIGH){
a=a+1;//aumenta di uno i secondi
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(a);
lcd.setCursor(2, 0);
lcd.print(".");
lcd.setCursor(1, 0);
lcd.print(b);
if(a>=59){//se i secondi sono 59
a=0;// azzero i secondi
b=b+1;// aumento di 1 i minuti
}
delay(30);
}
//--------------diminuisce il tempo
if(bottonemeno==HIGH){
if(a《=0 && b《=0){// se a e b sono minori o uguali a zero .... con == non mi funzionava
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(a);
lcd.setCursor(2, 0);
lcd.print(".");
lcd.setCursor(1, 0);
lcd.print(b);
a=a-1;//---------diminuisce i secondi di uno
if(a<=0){// se i secondi sono meno o uguali a zero ,,, uguale a prima con == non so il perche ma non funzionava i secondi come valore minimo rimanevano ad 1
a=59;// riporto i secondi a 59
b=b-1;}// diminuisco di 1 i minuti
}
else{a=0;// questa parte non mi fa fermarea 0 secondi 0 minuti senza andare in valori negativi
b=0;}
delay(80);}
//--------------------------azzera il tempo
if(bottoneazzera==HIGH){// questo porta a zero i valori spegnedo i led
a=0;
b=0;
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(a);
lcd.setCursor(2, 0);
lcd.print(".");
lcd.setCursor(1, 0);
lcd.print(b);
delay(1000);
}
//-----------------------------accensione
if(bottoneavvio==HIGH){
i = true;}
if(i==true){
digitalWrite(led, HIGH);
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(a);
lcd.setCursor(2, 0);
lcd.print(".");
lcd.setCursor(1, 0);
lcd.print(b);
a=a-1;//---------diminuisce i secondi di uno
if(a<=0){// se i secondi sono meno o uguali a zero ,,, uguale a prima con == non so il perche ma non funzionava i secondi come valore minimo rimanevano ad 1
a=59;// riporto i secondi a 59
b=b-1;}// diminuisco di 1 i minuti
}
else{a=0;// questa parte non mi fa fermarea 0 secondi 0 minuti senza andare in valori negativi
b=0;}
if(a==0 && b==0 ){ i = false;
digitalWrite(led, LOW);}
}
tralasciano i delay che vanno impostati per il tempo di un secondo questo e il codice finale .
ho provato a far stampare sul lcd il valore della variabile bolean e rimane sempre ad 1
grazie
if(bottonemeno==HIGH){
if(a《=0 && b《=0){// se a e b sono minori o uguali a zero .... con == non mi funzionava
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(a);
lcd.setCursor(2, 0);
lcd.print(".");
lcd.setCursor(1, 0);
lcd.print(b);
a=a-1;//---------diminuisce i secondi di uno
if(a<=0){// se i secondi sono meno o uguali a zero ,,, uguale a prima con == non so il perche ma non funzionava i secondi come valore minimo rimanevano ad 1
a=59;// riporto i secondi a 59
b=b-1;}// diminuisco di 1 i minuti
}
else{a=0;// questa parte non mi fa fermarea 0 secondi 0 minuti senza andare in valori negativi
b=0;}
else dopo if, fa si che se a e b sono diversi da zero, porta sempre a e b a zero
SE A MINORE O UGALE A ZERO, ELSE SE A MAGGIORE DI ZERO PORTA a e b A ZERO
Direi di togliere l'else, e di decrementare solo se a e b sono maggiori di zero
if(bottonemeno==HIGH){
if(a>0 && b>=0){// se a e b sono maggiori di zero decremento altrimenti no
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(a);
lcd.setCursor(2, 0);
lcd.print(".");
lcd.setCursor(1, 0);
lcd.print(b);
a=a-1;//---------diminuisce i secondi di uno
if(a<=0 && b>0 ){// se i secondi sono meno o uguali a zero e minuti maggiori di zero
a=59;// riporto i secondi a 59
b=b-1;}// diminuisco di 1 i minuti
}else if(a<=0 && b==0)// se i minuti sono a zero
a=0;
Ho scritto col cellulare e ho sbagliato. Cmq la parte del decremento funziona . Senza l else scendeva anche a valori negativi.
E la parte se lo accensione e spegnimento led che non funziona o meglio funziona in parte. All pressione del pulsante i led si accende . Ma il tempo non cala e i led non si spegne
Grazie delle rispiste
int bottonepiu = 0;
int bottonemeno = 0;
int bottoneazzera = 0;
int bottoneavvio = 0;
int a = 0;
int b= 0;
const int buzzer = 12;
boolean i = false;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
const int piu = 9;
const int meno = 8;
const int azzera = 7;
const int avvio = 6;
int led = 10;
void setup() {
// the number of the pushbutton pin
lcd.begin();
lcd.backlight();
pinMode(piu , INPUT);
pinMode(meno , INPUT);
pinMode(azzera , INPUT);
pinMode(avvio , INPUT);
pinMode(led, OUTPUT);
pinMode(buzzer, OUTPUT);
i=false;
}
void loop() {
lcd.setCursor(3, 0);
lcd.print(a);
lcd.setCursor(2, 0);
lcd.print(".");
lcd.setCursor(1, 0);
lcd.print(b);
bottonepiu = digitalRead(piu);
bottonemeno = digitalRead(meno);
bottoneazzera = digitalRead(azzera);
bottoneavvio = digitalRead(avvio);
//-----------------------------------------aumenta il tempo
if(bottonepiu == HIGH){
delay(30);
a=a+1;//aumenta di uno i secondi
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(a);
lcd.setCursor(2, 0);
lcd.print(".");
lcd.setCursor(1, 0);
lcd.print(b);
if(a>=59){
a=0;
b=b+1;
}}
//----meno
if(bottonemeno==HIGH){
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(a);
lcd.setCursor(2, 0);
lcd.print(".");
lcd.setCursor(1, 0);
lcd.print(b);
delay(300);
a=a-1;
if(a==0 && b>0){
a=59;
b=b-1;}
if(a<=0 && b==0){
a=0;
b=0;
}
}
// ---azzera
if(bottoneazzera==HIGH){
a=0;
b=0;
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(a);
lcd.setCursor(2, 0);
lcd.print(".");
lcd.setCursor(1, 0);
lcd.print(b);
delay(1100);
}
//--------------avvio
if(bottoneavvio==HIGH){
i=true;
}
if(i==true){
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(a);
lcd.setCursor(2, 0);
lcd.print(".");
lcd.setCursor(1, 0);
lcd.print(b);
delay(1000);
digitalWrite(led, HIGH);
a=a-1;
if(a==0 && b>0){
a=59;
b=b-1;}
if(a<=0 && b==0){
digitalWrite(led,LOW);
i=false;
tone(buzzer, 1000);
delay(1000);
noTone(buzzer);
}}
}
questo codice funziona , sia l aumento del tempo che la diminuzione , che si ferma a 0.0 .
l avvio e un po lento , nel senzo che alla pressione del pulsante non è istantanea la partenza , come succede nell altri comandi.
ora l unica cosa che non funziona e il buzer ,la stessa parte di codice riguardante il buzer se la scrivo come uno skect tutto suo , compila e funziona .
volevo mettere un suona che avverta quando e finito il ciclo
qualche consiglio ? grazie mille per le risposte
si il led si avccende il conto alla rovescia inizia e quando arri a a 0.0 i le si spegne
seguendo questo IF
if(a<=0 && b==0){
digitalWrite(led,LOW);//spengo il led
i=false;//riporti i = a false
tone(buzzer, 1000);// il buzzer emette un suono a 100 HZ credo
delay(1000); //conto 1 secopndo
noTone(buzzer);//spendo il buzzer