In questo esempio accenderemo e spegneremo un LED mediante un pulsante esterno al circuito del LED, che per questioni di praticità potrà essere inserito direttamente sulle porte GND e 13 di Arduino.
Per prendere confidenza con diversi modi di risolvere lo stesso problema, vengono presentate più soluzioni leggermente diverse fra loro.
Componenti
- 1 LED
- 1 pulsante 1
- 3 cavetti MM
- 1 resistenza da 10 kΩ
Esempio presente nell’IDE in 02.Digital/Botton
const int buttonPin = 2;
const int ledPin = 13;
int buttonState = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin, LOW);
}
}
A riposo, i due lati dell’interruttore non sono collegati tra loro, e si dice che il pulsante è normalmente aperto. In tale esempio il LED rimane acceso finché è premuto il pulsante, poi si spegne; negli esempi che seguono il pulsante si comporta da commutatore.
Prima proposta (con due variabili char)
Memorizzeremo lo stato del LED e del pulsante, rispettivamente nelle variabile statoLED e statoPulsante ambedue di tipo char inizializzate con il valore “false” ossia 0.
int led = 13;
int pulsante = 2;
char statoLED = 0;
char statoPulsante = 0;
void setup() {
pinMode(led, OUTPUT);
pinMode(pulsante, INPUT);
}
void loop() {
statoPulsante = digitalRead(pulsante);
if (statoPulsante == HIGH) {
if (statoLED == 0) {
digitalWrite(led, 1);
statoLED = 1;
}
else {
digitalWrite(led, 0);
statoLED = 0;
}
}
delay(250);
}
Seconda proposta (con una sola variabile char)
int led=13;
int pulsante=2;
char statoLED=false;
void setup() {
pinMode(led,OUTPUT);
pinMode(pulsante,INPUT);
}
void loop(){
if(digitalRead(pulsante)==HIGH){
statoLED=!statoLED;
digitalWrite(led,statoLED);
}
delay(250);
}
Terza proposta
int led = 13;
int pulsante = 2;
void setup() {
pinMode(led, OUTPUT);
pinMode(pulsante, INPUT);
}
void loop() {
if (digitalRead(pulsante)) {
digitalWrite(led, !digitalRead(pulsante));
}
delay(250);
}
Nota
Per come sono costruiti i pulsanti presentano il cosiddetto effetto rimbalzo, ovvero non appena premuti, nei primi millisecondi, generano rumore che potrebbe dare false letture.
Per alcuni il modo per superare questo problema può essere quello di ripetere la lettura dell’input a distanza di qualche millisecondo e verificare se sono uguali
...
void loop(){
val1 = digitalRead(pinPulsante); // legge il valore
delay(10); // aspetta 10 millisecondi
val2 = digitalRead(pinPulsante); // rilegge il valore
if (val1 == val2) { // se i due valori sono uguali...
etc. etc.
Per altri basterebbe introdurre una pausa opportuna, ad esempio 100-300 ms, fra una lettura dello stato dell’interruttore e la successiva.
http://mbortolotti.blogspot.com/2012/01/led-e-pulsante-digital-inputcontinua.html?m=1
https://www.arduino.cc/reference/en/language/functions/math/constrain/