Ciao!
oggi affronterò un tema all'apparenza banale,
ma che spero possa tornarvi utile.
Vedremo infatti come rilevare il fronte di salita di un pulsante.
Questo risultato può essere ottenuto anche con l'uso di un interrupt (link reference),
ma questa funzione non può essere utilizzata su tutti i pin (almeno nell'Arduino Uno)
Per questo motivo ho scritto questo semplice programma, esso contiene la funzione "ReadRiseEdge" che restituisce il valore "1" al rilevamento del fronte di salita del segnale.
Per la funzione ho utilizzato i puntatori, puoi trovare maggiori info a riguardo qui.
Qui sotto puoi trovare l'esempio realizzato con TinkerCad, cliccando su "Avvia simulazione" potrai cliccare sui tasti per accendere i led.
Potrai anche accedere al serial monitor per vedere i contatori incrementare di uno ad ogni click.
Per vedere il codice poi è sufficiente cliccare sul tasto "Codice".
Ecco il link a cui puoi trovare collegamenti, codice e simulare il progetto
- #define NumOut 3
- #define NumIn 3
- #define Led0 2
- #define Led1 3
- #define Led2 4
- #define Puls0 11
- #define Puls1 12
- #define Puls2 13
- #define WaitBetwReadPuls 50
- bool StatePuls0, StatePuls1, StatePuls2;
- bool MemStatePuls0, MemStatePuls1, MemStatePuls2;
- bool RiseEdgePuls0, RiseEdgePuls1, RiseEdgePuls2;
- unsigned int Out[NumOut] = {Led0, Led1, Led2};
- unsigned int In[NumIn] = {Puls0, Puls1, Puls2};
- unsigned int Count0, Count1, Count2;
- unsigned long TimeNow;
- unsigned long TimerPuls0, TimerPuls1, TimerPuls2;
- void setup()
- {
- Serial.begin(9600);
- //Configurazione ingressi/uscite
- for (int i = 0; i < NumIn; i++)
- {
- pinMode(In[i], INPUT_PULLUP);
- }
- for (int i = 0; i < NumOut; i++)
- {
- pinMode(Out[i], OUTPUT);
- }
- TimeNow = 0;
- }
- void loop()
- {
- TimeNow = millis();
- //funzione che restituisce 1 al rilevamento del fronte di salita del pulsante (livello logico del segnale che passa da 1 a 0)
- RiseEdgePuls0 = ReadRiseEdge(Puls0, &MemStatePuls0, &StatePuls0, &TimerPuls0);
- RiseEdgePuls1 = ReadRiseEdge(Puls1, &MemStatePuls1, &StatePuls1, &TimerPuls1);
- RiseEdgePuls2 = ReadRiseEdge(Puls2, &MemStatePuls2, &StatePuls2, &TimerPuls2);
- //quando rilevo il fronte accendo il led ed incremento il contatore
- if (RiseEdgePuls0) {
- digitalWrite(Out[0], HIGH);
- Count0++;
- }
- if (RiseEdgePuls1) {
- digitalWrite(Out[1], HIGH);
- Count1++;
- }
- if (RiseEdgePuls2) {
- digitalWrite(Out[2], HIGH);
- Count2++;
- }
- Serial.println();
- Serial.print ("Count0: ");
- Serial.println(Count0);
- Serial.print ("Count1: ");
- Serial.println(Count1);
- Serial.print ("Count2: ");
- Serial.println(Count2);
- Serial.println();
- delay(10);
- }
- //Funzione per leggere i fronti, vengono utilizzati i puntatori per passare delle memorie alla funzione
- //inoltre viene utilizzato il tempo ottenuto tramite la funzione "millis" per non avere ritardi nel programma
- bool ReadRiseEdge(unsigned int InPin, bool *MemState, bool *StatePuls, unsigned long *MemTime)
- {
- bool RiseEdge;
- *MemState = *StatePuls;
- if (TimeNow > (*MemTime + WaitBetwReadPuls))
- {
- *StatePuls = digitalRead(InPin);
- *MemTime = TimeNow;
- }
- if (*StatePuls == *MemState)
- {
- RiseEdge = 0;
- }
- if (*StatePuls != *MemState)
- {
- if (*StatePuls == 0)
- {
- RiseEdge = 1;
- }
- if (*StatePuls == 1)
- {
- RiseEdge = 0;
- }
- }
- return RiseEdge;
- }
Questo è tutto, ciao!
Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!
Nessun commento:
Posta un commento
Lascia un commento qui sotto, ti risponderò il prima possibile!