// Contatore
int pulsante =2;
int val = 0;
int contatore = 0;
int old_counter = 0;
int currentState = 0;
int previousState = 0;
void setup() {
pinMode(pulsante, INPUT);
Serial.begin(9600);
}
void loop(){
val = digitalRead(pulsante);
if (val == HIGH) {
currentState = 1;
}
else {
currentState = 0;
Serial.println("Pippo");
}
if(currentState != previousState){
if(currentState == 1){
contatore = contatore + 1;
Serial.println(contatore);
}
}
previousState = currentState;
delay(250);
}
il problema è che quando premo il pulsante ho la transizione da Pippo a 1 ma come rilascio torna a Pippo
se ripremo il pulsante fa 2 e se mollo rifà Pippo. le sto provando tutte ma proprio non trovo soluzione per far visualizzare sempre il numero e non pippo
In pratica il programma inizia visualizzando la parola Pippo come premo il pulsante visualizzo 1 e come rilascio visualizzo sempre 1 e così via per il 2 e per il 3
sostanzialmente Pippo è lo 0
Se ciò che vuoi è stampare pippo quando contatore vale zero è molto semplice: togli print("pippo") da dove si trova ora e aggiungi nel ciclo questo test:
quando premi il pulsante val è = HIGH e quindi entri e setti currentState ad 1, ma al prossimo giro, se il pulsante non è premuto, setti currentState a 0 e stampi Pippo! praticamente ricominci da capo. Io lascerei stare currentState e incrementerei il contatore alla pressione del pulsante. Utilizzerei old_counter per memorizzare il vecchio valore del contatore e stamperei il valore di contatore solo se maggiore di old_counter.
per capirci:
dopo i vostri consigli ieri mi sono divertito a modificare e rimodificare il codice in maniera folle ed ecco il risultato
// Contatore
int pulsante =2;
int pulsante2 =4;
int val = 0;
int val0 =0;
int contatore = 0;
int old_contatore = 0;
void setup() {
pinMode(pulsante, INPUT);
pinMode(pulsante2, INPUT);
Serial.begin(9600);
}
void loop(){
if ( contatore == 0 ) {
Serial.println("pippo");
}
if(digitalRead(pulsante)){
contatore +=1;
}
if(contatore > old_contatore){
if ( contatore == 1) {
Serial.println("2");
} if ( contatore == 2) {
Serial.println ("3");}
if ( contatore == 3) {
Serial.println ("4");}
if ( contatore == 4) {
Serial.println ("5");}
if ( contatore >=5) {
val0= contatore + 1;
Serial.println(val0);
}
}
if(digitalRead(pulsante2)){
contatore -=1;
}
if(contatore< old_contatore){
val = abs(contatore);
Serial.println(val);
}
delay (200);
}
i miei problemi sono i seguenti:
non riesco a far mantenere lo stato fisso dopo ogni incremento o decremento, in un paio di casi ci sono riuscito ma poi mi venivano numeri a caso con decremento di 2
Penso che sia "dummy code" che serve soltanto ora per assicurarsi che la struttura del programma sia corretta, cioè che premendo il pulsante si passa da una sezione all'altra. Una volta verificato che tutto funzia, si possono sostuire le println() con chiamate a funzione che fanno effettivamente quello che il programma deve fare...
(Nota: per cortesia, premi CTRL+T prima di postare il codice!)
Usa le righe vuote in modo consistente con il flusso del programma.
Raggruppa il codice che legge i pulsanti e modifica la variable contatore.
Non è chiaro perché pulsante e pulsante2 invece di pulsante1 e pulsante2. Poi ti consiglierei di dare un nome che renda più chiaro se si tratta del pin del pulsante o del suo stato. Tipo pinPulsante1, pinPulsante2.
Manca l'aggiornamento di old_contatore.
Infine è "semanticamente" più corretto scrivere if (digitalRead(pin) == HIGH) invece di if (digitalRead(pin)).
// Contatore
int pulsante =2;
int pulsante2 =4;
int val = 0;
int val0 =0;
int contatore = 0;
int old_contatore = 0;
void setup() {
pinMode(pulsante, INPUT);
pinMode(pulsante2, INPUT);
Serial.begin(9600);
}
void loop(){
if(digitalRead(pulsante)){
contatore +=1;
}
if(digitalRead(pulsante2)){
contatore -=1;
}
if ( contatore == 0 ) {
Serial.println("pippo");
}
if(contatore > old_contatore){
if ( contatore == 1) {
Serial.println("2");
}
if ( contatore == 2) {
Serial.println ("3");
}
if ( contatore == 3) {
Serial.println ("4");
}
if ( contatore == 4) {
Serial.println ("5");
}
if ( contatore >=5) {
val0= contatore + 1;
Serial.println(val0);
}
}
if(contatore < old_contatore) {
val = abs(contatore);
Serial.println(val);
}
old_contatore = contatore; // <<==== !
delay (200); // debounce
}
Penso che il debounce sia già abbondamentemente coperto dal delay(200) alla fine di loop().
Ma no, cerco solo di essere d'aiuto. Un po' per evitare agli altri le ore che ho perso io per cavolate simili, un po' perché sto leggendo Code Complete 2 e sono un tantino invasato
Infine è "semanticamente" più corretto scrivere if (digitalRead(pin) == HIGH) invece di if (digitalRead(pin)).
perchè dici che è semanticamete più corretto? forse rende il codice più leggibile ma sia sintatticamente che semanticamente a me sembra corretissimo. L'if controlla se la clausola è vera o falsa. Nel primo modo si controlla che il valore di ritorno di una funzione (che in questo caso può essere o vero o falso), sia vero. Nel secondo faccio valutare all'if direttamente il valore di ritorno della funzione. Non credo sia vero che sia più o meno corretto...a meno che non mi linkate un qualcosa tipo "regole della buona programmazione di Ritchie" o qualcosa di simile e mi smentite alla grande! Penso anche alla forma contratta dell'if con l'utilizzo dell'operatore ternario "?". E' semplicemente un altro modo di scriverlo. Che ne dite?
N.