cronometro

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.

if(bottonemeno==HIGH){
 
  if(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);
     a=a-1;
     if(a==0){b=b-1;}
     if(a<=0){
      a=59;}
     }

funzina pero si ferma a 0.1

avete qualche consiglio?

trovata la soluzione :slight_smile:

if(bottonemeno==HIGH){
  
  if(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);
     a=a-1;
     
     if(a<=0){
      a=59;
      b=b-1;}
      
     }
     else{a=0;
      b=0;}
   
    
    
  delay(80);}

aggiunto un else
ho usato per tutte le funzioni degli IF , ma si potrebbe usare una serie di case???
uno per ogni secondo di incremento?

Buon giorno .
Ho risolto il problema di ieri ma adesso non va il conteggio . O meglio si accende il led ma non parte il conto alla rovesci.

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 :slight_smile: 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 :slight_smile:

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 */

torn24:

byte secondi=60;

byte centesimi=60;

if(centesimi<=0){

if(secondi<=0){

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) :wink:

-zef- hai ragione, ho corretto le condizioni :slight_smile: 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” :slight_smile:

torn24:
Se centesimi arriva a zero, decremento di uno secondi e riporto centesimi a 60, si fa con un altro if()

Uh?... In un secondo ci sono 100 centesimi di secondo, quindi prima di 1.00 c'è 0.99.

@albepancio

Per primo usa per le variabili dei nomi parlanti come minuti secondi ecc.
Per secondo dacci lo sketch completo che compila senza problemi.

Ciao Uwe

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

Questa parte di codice

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

Sei certo che l'unica cosa che non faccia sia attivare il buzzer? Il led fa quello che deve? E in quello che deve fare é compreso spegnersi?

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

i lde si spegne ma il buzer non suona

Bene. Allora é collegato male il buzzer. Non può essere un problema di codice, almeno per come la vedo io

quando avvio il caricamento il buzzer suona ,,,
per ora sono su basetta per prototipi.