incremento/ decremento variabile

Salve.
Volevo gestire un cronografo con l uso di arduino.

Imposto le variabili.
Poi uso un if(bottone == high)'{
++ val}
Stampo il valore su lcd Con un altro if gestisco il massimo impostabile. .E sempre con un altro if gestisco il livello del Pin che mi serve per accendere il led. Quando Val == 0 spengo i led.
( scrivo dal cell e non riesco ad inserire il codice con l apposito commenti).
Però il valore di Val mi rimane sempre 0.
Qualche consiglio?
Di esempi di timer in rete ne ho visti tantissimi ms volevo farne uno mio.
Grazie
P.s. Poi il tempo lo gestire i con un delay(1000);

ciao albepancio,

senza codice, io, non so risponderti.
posso dirti che ...evita il delay()...potrebbe funzionare se vuoi solo "contare" il tempo...ma se dopo, e l'appetito vien mangiando, vuoi che il tuo programma faccia altro, nel mentre conta il tempo trascorso, sei fregato.
gestisci il tutto con millis().

if(bottone == high)'{
++ val}

non so se è a causa del cel ma HIGH è minuscolo, c'è un apostrofo di troppo e manca un ;
In teoria funziona anche così,
prova così

if(bottone == HIGH) {
   val++;
}

occhio che mancano i debounce quindi non sai di quante unità incrementi val ad ogni pressione del pulsante

Scrivo veloce e mi sbaglio.
Cmq la cosa dovrebbe essere quella in più devo studiarli l anti rimbalzo. E poi o collegare il reset dell' arduino o impostare dal codice la possibilità di riportare a zero la variabile

per riportarla a zero puoi semplicemente scrivere nel loop una if di controllo che quando il valore di val diventa = al tuo valore limite allora val=0

if (val>=tuoValoreLimite) {
   val=0;
}

per l'antirimbalzo, segui il suggerimento di ORSO2001 e studiati l'uso di millis()

Per capire come funziona e come applicare la funzione millis(), puoi studiare prima QUI, poi QUI ed infine leggere anche QUI e QUI ... vedrai che ti sarà tutto più chiaro

e leggi anche questo post di Claudio_FF

digitaRad(2):// leggo il pin
digitalRead(3);// leggo il pin
if(2==HIGH){ se il pin 2 è alto aumento la variabile di 1
val=val+1;}
if(val =>100){se la variabile e piu di 100 la resetto a 0
val = 0;}
if(3 ==HIGH){
digitalWrite(4, HIGH);
val = val -1),;
if (val == 0){digitalWrite(4,LOW);}
delay(1000);}

ciao albepancio...scusa ma così non ci aiuti...posta il codice vero e completo...

]

Patrick_M:
per riportarla a zero puoi semplicemente scrivere nel loop una if di controllo che quando il valore di val diventa = al tuo valore limite allora val=0

if (val>=tuoValoreLimite) {

val=0;
}



per l'antirimbalzo, segui il suggerimento di ORSO2001 e studiati l'uso di millis()

Oppure te la cavi in una riga con

var=var%massimo;

...
Mentre per l'antirimbalzo puoi anche farne uno hardware, spendendo forse un po, ma senza rubare tempo al programma.
Infine attento alla precisione di millis(), che non é elevatissima ed é molto variabile

#define TEMPO_PIU  3 //definisco pin aumento tempo
#define TEMPO_MENO 4//definisco pin diminuzione tempo
#define start 5
#define led 6 
int val_tempo; //variabile per calcolo tempo
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27,16,2);


void setup() {
   lcd.begin();  
  lcd.backlight();
pinMode(TEMPO_PIU, INPUT);//definisco i pin
pinMode(TEMPO_MENO, INPUT);
pinMode(start, INPUT);//pin avvio timer
pinMode(led, OUTPUT);
}

void loop() {
lcd.clear();//pulisco lo schermo
lcd.setCursor(0, 0);//imposto la posizione
lcd.print(val_tempo);//stampo il valore della variabile
if(start==HIGH){//se il pulsante start e premuto 
  if(val_tempo > 0){digitalWrite(led,HIGH);//se val è maggiore di zero accendo i led
  val_tempo=val_tempo-1;//diminuisco il valore di 1

    lcd.print(val_tempo);//stampo il valore
    }
    else{digitalWrite led,LOW);}//se non è maggior di zero spengop i led
    
if (TEMPO_PIU == HIGH){//se  il tasto TEMPO_PIU è premuto aumento il valore di 1
  val_tempo = val_tempo + 1;
}
if (TEMPO_MENO == HIGH){//se il tasto TEMPO _MENO è premuto diminuisco di uno
  val_tempo = val_tempo-1;
}
lcd.print(val_tempo);//stampo il valore di val_tempo
}

ho provato ma non lo compila mi da errore alla riga 4 ( che viene marcata e in basso restituisce expected ';' befor numeric constant perche?
grazie

ci sono 2 errori:

  1. non essendo ben formattato non ti sei accorto che manca la graffa di chiusura del loop
  2. manca la parentesi tonda di apertura della digitalWrite
 else{digitalWrite led,LOW);}//se non è maggior di zero spengop i led

terzo ma non essenziale se una variabile che vuoi usare si colora di arancione.... magari è meglio cambiare nome
start è una parola riservata, funziona lo stesso ma se scrivi inizio o partenza...

infine
con la mia libreria
LiquidCrystal_I2C.h

lcd.begin non funziona e devo sostituirlo con
lcd.init... magari anche la tua :wink:

p.s.
che versione di ide stai usando? perchè anche a me con la 1.8.7 si ferma alla riga 4 anzichè sulla digitalWrite...

allora sto provando il funzionamento
e ho riscontrato 2 problemi
primo problema se do il lcd.clear nel loop lo zero rimane chiaro
poi premendo il tasto TEMPO_PIU la variabile non aumenta,
e scriito giusto ?

if (TEMPO_PIU == HIGH){//se  il tasto TEMPO_PIU è premuto aumento il valore di 1
  val_tempo = val_tempo +1;

?
ho usato una resistenza di up
grazie

#define TEMPO_PIU  3 //definisco pin aumento tempo
#define TEMPO_MENO 4//definisco pin diminuzione tempo
#define start 5
#define led 6 
//variabile per calcolo tempo
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27,16,2);
const int ledPin =  13; 
int aumento ; 
int diminuisco;
int conteggio;
int val_tempo = 0;
void setup() {


   lcd.init();  
  lcd.backlight();
pinMode(TEMPO_PIU, INPUT);//definisco i pin
pinMode(TEMPO_MENO, INPUT);
pinMode(start, INPUT);//pin avvio timer
pinMode(led, OUTPUT);

lcd.clear();//pulisco lo schermo

}

void loop() {
 diminuisco = digitalRead(TEMPO_MENO);   
aumento = digitalRead(TEMPO_PIU);
conteggio =digitalRead(start);
lcd.setCursor(3, 0);//imposto la posizione

if(conteggio==HIGH){//se il pulsante start e premuto 
  if(val_tempo > 0){digitalWrite(led,HIGH);//se val è maggiore di zero accendo i led
  val_tempo=val_tempo-1;//diminuisco il valore di 1

   
   }

    else{digitalWrite (led, LOW);}//se non è maggior di zero spengop i led
}
if (aumento == HIGH){//se  il tasto TEMPO_PIU è premuto aumento il valore di 1
  digitalWrite(ledPin, HIGH);
  val_tempo = val_tempo +1;
}
if (diminuisco == HIGH){//se il tasto TEMPO _MENO è premuto diminuisco di uno
  val_tempo = val_tempo-1;
}
lcd.print(val_tempo);//stampo il valore di val_tempo

}

ora premendo i pulsanti aumento ma quando arriva a 10 scrive solo 1 a 20 scrie solo 2 ecc

Temo che TEMPO_SU sia la #definr del pin del tasto e non il valore letto. Indi per cui, per usarlo come tasto devi sostituire a TEMPO_SU digitalRead (TEMPO_SU).
P.S.
Non avevo letto l'ultimo post

ora funziona solo che conta fino a 9 poi invece di scrivere 10 scrive uno e via discorendo scrive 2 al posto di venti e via discorendo , scrive solo le decine
se porto il tasto 6 al positivo , parte il conto alla rovescia fino a zero , non ho provato se si accendono i led perch non li ho collegati

seguiamo un po il programma
allora:
parte il loop
diciamo che premi start e conteggio diventa HIGH
e diciamo che hai premuto tempo_piu
val_tempo=0 --> è impostato così prima del setup
quindi conteggio è HIGH ed entra nel primo if
val_tempo =0 quindi non entra nel secondo if ma esegue l'else
quindi led LOW --> cioè spento
aumento (che è tempo_piu) è HIGH
quindi entra nell'if
per cui val_tempo diventa 1
stampi su lcd il valore 1
immediatamente (senza nessun delay) ricomincia
appena conteggio diventa HIGH
entra nel primo if
val_tempo vale 1, quindi entra nel secondo if
accendo il led
e val_tempo diventa 0
ora 3 possibilità:

    1. non tocchi nulla per cui
      salta i 2 if (aumento e diminuisco)
      e allora stampa su lcd 0
    1. premi aumento e val_tempo ritorna = 1
      e stampa 1 su lcd
    1. premi diminuisco e allora val_tempo diventa = -1
      e stampa -1 su lcd

non so se fa quello che vuoi tu :slight_smile:

comunque qui mancano i debounce dei tasti...

trascurando il stetup.
quello che ho scritto dovrebbe fare cosi: do corrente :slight_smile:
parte il loop arriva all if e val-tempo vale zero quindi non accende i led . poi premo tempo_piu entra nel if ed aumenta val-tempo. fino a 9 .
e sul lcd stampa 9.
premo start parte l if e val vale piu di zero quindi accende i led e diminuisce di uno la val-tempo.
fino a quando val-tempo vale 0 .
secondo me doveva fare una cosa del genere.
e piu o meno lo fa , anche se prende dei rimbalzi , pero se incremento il tempo mi stampa solo una cifra , cioè, arriva al 9 e poi 10 lo scrive come 1 , 20 che lo scrive come 2 ......
grazie

scusa l'introduzione da profano,

prova a pulire lo schermo prima di scrivere
setta dove scrivere
e alla fine scrivi il valore tempo

così in teoria non dovresti avere problemi (credo e spero)

ciao

Io per risolvere userei un sistema molto brutale: non mandare in stampa il numero, ma una strings contenente la rappresentazione del nunero. Divrebbe esistere una funzione tipo itoa(), che anche se non esistesse non credo sarebbe difficile da scrivere. Se il display non rispondesse neanche alla scrittura di una stringa (cosa che normalmente fa) non so cosa dirti

P. S. SO che NON é una soluzione ufficiale e che Guglielmo potrebbe bannarmi anchebsolo perhé ho pensaro di postarla, ma é l'unica che mi viene in mente che possa andare quasi certamente

Silente:
P. S. SO che NON é una soluzione ufficiale e che Guglielmo potrebbe bannarmi anchebsolo perhé ho pensaro di postarla, ma é l'unica che mi viene in mente che possa andare quasi certamente

Guglielmo