|
Un po' di teoria
Â
Il codice accende il Led quando è premuto il pulsante ( MicroSwitch ) e lo mantiene acceso dopo che lo si rilascia.
Questi piccoli pulsante sono dispositivi molto semplici: due parti di metallo separate da una molla. Quando premete il pulsante, i due contatti si toccano e l'elettricità può fluire. Questo suona facile, ma nella vita reale il collegamento non è così perfetto, specie quando il pulsante non è premuto completamente, e genera dei segnali spuri detti simbalzi ( Bouncing )
Quando il pulsante produce questi segnali, Arduino vede una sequenza molto rapida di segnali acceso-spento. Per evitarlo sono state sviluppate molte tecniche, ma in questo semplice codice ho notato che normalmente basta aggiungere un ritardo di 10/50 millisecondi quando il codice rileva una transizione.
L'esempio sottostante mostra il codice.
Â
Â
Codice ( Sketch ) Accensione e Cambio luminosità ( Brightness )
Â
Esempio: Accende il Led quando è premuto il pulsante e lo mantiene acceso dopo che lo si rilascia, includendo un semplice antirimbalzo ( de-bouncing )
Â
#define Led 9Â Â Â Â // Il Pin del Led
#define Pulsante 7Â // Pin di Input del pulsante
int Valore = 0;Â Â Â Â Â // Conserva lo stato del pin input
int Vecchio_Valore = 0;Â // Conserva il valore precedente di "Valore"
int Stato = 0;Â Â Â // 0 = Led spento mentre 1 = Led acceso
int brightness = 128;Â Â Â Â Â Â Â // Conserva il valore della luminositÃ
unsigned long startTime = 0; // quando è cominciata la pressione ?
void setup() {
pinMode(Led, OUTPUT);  // Indica ad Arduino che Led è un Output
pinMode(Pulsante, INPUT); // E che Pulsante è un Input
}
void loop() {
Valore = digitalRead(Pulsante); // Legge il valore dell'input e lo conserva
if ((Valore == HIGH) && (Vecchio_Valore == LOW)) // Controlla se è venuta una transizione
{
Stato = 1 - Stato; // Cambio lo stato da spento ad acceso o viceversa
startTime = millis(); // millis() è l'orologio di Arduno che restituisce quanti millisecondi sono passati da quando è stata resettata la scheda.
// ( Questa riga ricorda quando è stato premuto il pulsante l'ultima volta )
delay(10);
}
if ((Valore == HIGH) && (Vecchio_Valore == HIGH)) // Verifica che il pulsante sia ancora premuto
{
if (Stato == 1 && (millis() - startTime) > 500) // Se il pulsante è premuto per più di 500Ms
{
brightness++; // Incrementa la luminosità di 1
delay(10);   // Ritardo per evitare che la luminosità aumenti troppo rapidamente
if (brightness > 255) { // 255 è la luminosità massima
brightness = 0; // Se va oltre 255 torna a 0
}
}
}
Vecchio_Valore = Valore; // Memorizza il valore precedente di " Valore "
if (Stato == 1)
{Â Â Â Â Â
analogWrite(Led, brightness); // Accende il led al livello corrente di luminositÃ
}
else
{
analogWrite(Led, 0); // Spegne il Led
}
}
|