02. Pulsante di accensione led
Nota:
Quando il pulsante è premuto tutti i piedini sono in collegamento tra loro.
Componenti:
un interruttore a pulsante (normalmente aperto)
una resistenza da 10K Ω
un led
una resistenza da 150 Ω
La resistenza da 10K ohm assolve al ruolo di resistenza di pull-down (pressione del bottone), ossia la resistenza ha lo scopo di non far andare in corto circuito Arduino quando viene premuto pulsante.
Soluzione
Sketch
int buttonstatus;
void setup()
{
pinMode(12, OUTPUT);
pinMode(8, INPUT);
digitalWrite(12, LOW);
}
void loop()
{
buttonstatus = digitalRead(8); // lettura dell'ingresso
if (buttonstatus == HIGH) { // pulsante premuto?
digitalWrite(12, HIGH); // accendo il LED
}
else if (buttonstatus == LOW) { // pulsante rilasciato?
digitalWrite(12, LOW); // spengo il LED
}
}
Nota
Il valore delle resistenze pull-up/pull-down può essere scelto in un ampio range di valori.
Se sono troppo piccole la corrente a pulsante premuto è troppo grande e di conseguenza carica in modo eccessivo la fonte di alimentazione (valori sotto il K ohm).
Se sono troppo grandi non riescono a portare l'entrata al potenziale definito.
Tutti i valori intermedi possono essere adeguati. Valori sensati per la maggiore parte dei casi sono tra 1 e 100 K ohm.
Per gli ingressi di tipo digitale i valori di riferimento sono:
porte logiche TTL si usa il valore di 1 K Ω;
porte CMOS (tipologia a cui appartiene l'ATmega di Arduino) si usa il valore di 10 K Ω.
Variante 1
Introduciamo ora una variante per definire un nuovo comportamento del pulsante. Vogliamo fare in modo che premendo una volta il pulsante il led si accenda permanentemente e premendolo nuovamente il led si spenga permanentemente.
Gli stati da gestire sono dunque i seguenti:
stato 0: led spento;
stato 1: led acceso.
Sketch
int ledpin=12;
int buttonpin=8;
int buttonstatus;
int previous_buttonstatus=LOW;
int status = 0;
void setup()
{
pinMode(ledpin, OUTPUT);
pinMode(buttonpin , INPUT);
digitalWrite(ledpin, LOW);
}
void loop()
{
buttonstatus = digitalRead(buttonpin);
if (buttonstatus == HIGH && previous_buttonstatus == LOW) {
status++;
status = status % 2;
previous_buttonstatus = HIGH;
}
else if (buttonstatus == LOW)
previous_buttonstatus = LOW;
if (status==0){
digitalWrite(ledpin, LOW);
}
else if (status == 1){
digitalWrite(ledpin, HIGH);
}
}
Variante 2
Utilizziamo ora il pulsante per introdurre il nuovo stato "led lampeggiante".
Gli stati da gestire sono dunque i seguenti:
stato 0: led spento;
stato 1: led acceso;
stato 2: led lampeggiante.
Premendo il pulsante si passerà da uno stato al successivo in modo circolare come accade, ad esempio, con la serie di luci natalizie.
Sketch
int ledpin=12;
int buttonpin=8;
int buttonstatus;
int previous_buttonstatus=LOW;
int status = 0;
void setup()
{
pinMode(ledpin, OUTPUT);
pinMode(buttonpin , INPUT);
digitalWrite(ledpin, LOW);
}
void loop()
{
buttonstatus = digitalRead(buttonpin);
if (buttonstatus == HIGH && previous_buttonstatus == LOW) {
status++;
status = status % 3;
previous_buttonstatus = HIGH;
}
else if (buttonstatus == LOW)
previous_buttonstatus = LOW;
if (status==0){
digitalWrite(ledpin, LOW);
}
else if (status == 1){
digitalWrite(ledpin, HIGH);
}
else if (status == 2){
digitalWrite(ledpin, HIGH);
delay(2000);
digitalWrite(ledpin, LOW);
delay(2000);
}
}
Nota:
La presenza del delay all'interno del loop rende il sistema poco reattivo all'input. In pratica il pulsante talvolta sembra non avere effetto, il che è alquanto frustrante per l'utente.
Variante 3
Questa variante non implementa nuovi comportamenti ma elimina il problema della scarsa reattività al nuovo input sperimentato con il precedente sketch.
Sketch
int ledpin=12;
int buttonpin=8;
int buttonstatus;
int previous_buttonstatus=LOW;
int status = 0;
long TIMER1;
int lampeggiante;
#define SPENTO 0
#define ACCESO 1
int timer(long *t, long millisecondi)
{
long x;
x=millis();
if (!*t){
*t=x;
return 0;
}
else if (x-*t > millisecondi) {
*t=millis();
return 1;
}
else
return 0;
}
void setup()
{
pinMode(ledpin, OUTPUT);
pinMode(buttonpin , INPUT);
digitalWrite(ledpin, LOW);
}
void loop()
{
buttonstatus = digitalRead(buttonpin); // lettura stato bottone
if (buttonstatus == HIGH && previous_buttonstatus == LOW) {
// pulsante premuto?
status++;
status = status%3;
previous_buttonstatus = HIGH;
}
else if (buttonstatus == LOW) { // pulsante rilasciato?
previous_buttonstatus = LOW;
}
if (status==0) { // stato led spento
digitalWrite(ledpin, LOW);
}
else if (status == 1) { // stato led acceso
digitalWrite(ledpin, HIGH);
}
else if (status == 2) { // stato led lampeggiante
if (timer(&TIMER1, 100)) // sono trascorsi 100 ms?
{
if (lampeggiante == SPENTO){ // il led è spento?
digitalWrite(ledpin, HIGH);
lampeggiante=ACCESO;
}
else { // il led è acceso
digitalWrite(ledpin, LOW);
lampeggiante=SPENTO;
}
}
}
}
Sito: 7ecnologie
Sezione: 17. Robotica e domotica
Capitolo: 01. Elementi di Elettronica
Paragrafo: 03. Progetti
Sottoparagrafo: 02. Pulsante di accensione led
Indice dei capitoli: 00. Risorse - 01. Elementi di Elettronica - 02. Arduino - 98. Esercizi
Indice dei paragrafi: 01. Ambiente di sviluppo - 02. Elementi di programmazione - 03. Progetti - 04. Tutorial
Indice dei sottoparagrafi: 01. Led lampeggiante - 02. Pulsante di accensione led - 03. Pilotare un transistor - 04. Pilotare un relè - 05. Uso del fotoaccoppiatore - 06. Pilotare un Display a led - 07. Interruttore crepuscolare - 08. Gli infrarossi - 09. Sensore di distanza