Go Down

Topic: Conteggio attivazione di un ingresso digitale (Read 1 time) previous topic - next topic

daddi

Salve a tutti vorrei posarvi il mio problema che secondo me è molto banale ma sono alle prime armi con arduino e non so come sviare a ciò.

Vi spiego vorrei creare il mio software che rilevi quante volte io premo il mio pulsante collegato al arduino board, al pin digitale es.(4), in un frangente di tempo di un secondo, ogni volta che rilevo il pinmode in on parte il mio timer e la variabile cambia il valore poi visualizzato sul serial monitor

Il problema più grande e capire come fare un contatore che conta i miei input in sequenza

Spero di esser stato abbastanza chiaro nella spiegazione per ulteriori domande chiedetemi pure

Grazie a tutti e buona serata :)

Michele Menniti

chiaro non sei stato, forse sarebbe il caso che facessi un bell'esempio con azioni e cifre reali
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

llluca


daddi

ook allora provo ad esser più chiaro, io ho un pulsante collegato al ingresso digitale dovrei contare quanti impulsi io mando tramite pulsante in un secondo, praticamente un timer di un secondo parte a contare quando rileva il primo impulso digitale e nel arco di quel tempo io premo il pulsate per 6 volte allora nel mio serial monitor visualizzerò in continuo sul mio serial monitor quanti impulsi al secondo sono stati rilevati .

Spero d'esser stato più chiaro sta volta
Grazie a tutti

uwefed

Quote
Spero di esser stato abbastanza chiaro nella spiegazione per ulteriori domande chiedetemi pure


poco, poco chiaro.

uwefed

http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay per il tempo.
Ciao Uwe

daddi

facciamo un pezzo alla volta, scusate per prima cosa e fondamentale dovrei realizzare un contatore che conti i miei input come posso fare

ad esempio io premo il pulsante per 5 volte in un secondo e lui deve rilevarmi e visualizzarmi sul serial monitor 5 volte pressione del pulsante  :)

pelletta

Usi una variabile: inizia il conteggio, la variabile vale 0; ogni volta che premi il pulsante la variabile incrementa il suo valore di 1. Quando è trascorso un secondo stampi sul monitor il valore della variabile poi lo resetti a 0 e tutto riparte dall'inizio.

leo72


Usi una variabile: inizia il conteggio, la variabile vale 0; ogni volta che premi il pulsante la variabile incrementa il suo valore di 1. Quando è trascorso un secondo stampi sul monitor il valore della variabile poi lo resetti a 0 e tutto riparte dall'inizio.

Più chiaro di così  ;)

daddi

ook proprio cosi pelletta :-) , come posso realizzare ciò una volta settata la variabile su o come posso iniziare con i cicli setup e loop?

vittorio68

Ciao Daddi,

in generale credo che il modo migliore per imparare a scrivere codice è quello di... scriverlo!!! Poi ci si rompe la testa per capire perchè non funziona. Soltanto così alla fine ci rimane impresso nella mente quello che abbiamo imparato.

Ciò premesso, mi rendo conto che magari, all'inizio, non si sa proprio da dove cominciare. Per venirti incontro provo a postarti un esempio di codice che "dovrebbe" fare quello che ti serve. Non l'ho provato quindi è possibile che vada rivisto. Nel caso parliamone.

Code: [Select]

int button = 4;
int buttonState;
int oldButtonState;
int counter;
unsigned long startTime;
unsigned long delay = 1000;
bool firstClick;

void setup()
{               
Serial.begin(9600);
pinMode(button, INPUT);     

firstClick = true;

oldButtonState = LOW;
counter = 0;
}

void loop()
{
buttonState = digitalRead(button);

if (buttonState == HIGH)
{
// ho premuto il pulsante

if (oldButtonState == LOW)
{
oldButtonState = HIGH;

if (firstClick)
{
startTime = millis();
firstClick = false;
}

counter++;
}
}
else oldButtonState = buttonState;

unsigned long elapsedTime =  millis() - startTime;
if (elapsedTime > delay)
{
firstClick = true;
Serial.print("Impulsi contati: ");
Serial.println(counter, DEC);
counter = 0;
}
}


In pratica la variabile buttonState contiene lo stato attuale del pulsante, mentre oldButtonState mantiene lo stato precedente. Questo serve perchè, data la velocità alla quale viene eseguito il loop, non è sufficiente incrementare il contatore (la variabile counter) quando buttonState=HIGH perchè sicuramente durante ogni pressione passeresti n volte nel ciclo.

Pertanto counter viene incrementata ogni volta che buttonState è HIGH e oldButtonState è LOW.

Al primo click (indicato da firstClick) viene anche impostato il valore di startTime. Poi ad ogni ciclo viene controllato quanto tempo è passato da startTime (elapsedTime = millis() - startTime). Quando questo valore diventa maggiore di delay (1000 ms = 1 s come richiesto), il valore di counter viene inviato alla seriale e resettato.

Se hai bisogno di altre informazioni, chiedi pure.

Ciao.
Vittorio.

daddi

Grazie mille Vittorio adesso provo il tutto e ti faccio sapere, comunqe come hai detto te adesso sono alle prime armi e sono affascinato da arduino per questo che ho bisogno di piccoli aiutini grazie mille buona giornata

daddi

Caio Vittorio ho provato a caricare il programma sul Arduino ma mi da errore nella riga ''unsigned long delay '' come posso risolvere?

pelletta

delay è una funzione dell'IDE, non puoi usarla come nome di variabile. Cambiala con "ritardo", "intervallo", ecc.

leo72


delay è una funzione dell'IDE, non puoi usarla come nome di variabile. Cambiala con "ritardo", "intervallo", ecc.

Le parole chiave del linguaggio non possono essere usate come variabili o nomi di funzione:
http://arduino.cc/en/Reference/HomePage
Te ne accorgi perché scrivendole diventano arancioni.

Go Up