Interruptor ON/OFF amb Arduino

Interruptor ON/OFF amb Arduino

Podem utilitzar els botons com a polsadors (les accions definides només s’executaran mentre el botó estigui premut) o com a interruptors (un cop premut les accions definides s’executaran fins que no torni a ser premut un altre cop).

Pretenem controlar l’encesa d’un LED amb un polsador que funcioni com un interruptor, és a dir: quan premem el polsador el LED s’ha d’encendre, quan deixem anar el botó el LED ha de romandre encés. Per apagar el LED hem de tornar a prèmer el botó.

Botó com Interruptor

La nostra estratègia:
Utilitzarem una variable el valor de la qual cambiarà cada cop que premem el botó. Anomenarem EstatSensor a aquesta variable, i fixarem el seu valor inicial a 1.
Cada cop que premem el botó, farem que el nou valor de EstatSensor sigui EstatSensor multiplicat per -1

D’aquesta manera:
• en prèmer 1 cop:      EstatSensor = 1*-1 = -1
• en tornar a prèmer:  EstatSensor = -1*-1 = 1
• en tornar a prèmer:  EstatSensor = 1*-1 = -1
• i així successivament …
Per tant, les polsacions imparells correspondran al valor -1 de la variable, i les parells al valor 1.

L’execució de les accions ara no ha de dependre de l’estat del botó, sinó del valor de la variable EstatSensor, de manera que:
• si EstatSensor = 1 (polsacions parells) el LED s’ha d’apagar
• si EstatSensor = -1 (polsacions imparells) el LED s’ha d’encendre

Explicació visual amb llenguatge Scratch for Arduino:
La pausa de 0,5 segons abans d’establir el valor de la variable quan premem el botó és necessària, ja que si no, en el temps en que premem el botó es repetirien molts cicles en els quals estat aniria canviant de valor (1 a -1), així que el valor llegit dependria més de l’atzar que d’una altra cosa.

El programa amb llenguatge Arduino:
Hem afegit les instruccions Serial.begin i Serial.println per visualitzar el valor de la variable pel monitor sèrie i comprovar el canvi cada cop que premem el botó.

/* Botó. Encendre i apagar un LED en funció de l’estat d’un botó */

int Led = 8; // pin de connexió LED
int Boto = 2; // pin de connexió botó
int EstatSensor = 1; // variable per guardar l’estat del botó. Valor inicial: 1

void setup()
{
pinMode(Led, OUTPUT); // el pin és una sortida digital
pinMode(Boto, INPUT); // el pin és una entrada digital
Serial.begin(9600);
}

void loop()
{
if (digitalRead(Boto) == 1) // lectura de l’estat del botó: si botó premut …
{
delay(500); // petita pausa per evitar lectures errònies
EstatSensor = EstatSensor*(-1);    // nou valor de la variable
}

if (EstatSensor == -1)
digitalWrite(Led, HIGH); } // per a polsacions imparells del botó, encén el LED
else
digitalWrite(Led, LOW); } // per a polsacions parells, apaga el LED

Serial.println (EstatSensor);
}

Hem utilitzat el botó com interruptor de les nostres espelmes digitals: LED RGB amb encesa aleatòria. El projecte està documentat al bloc de Eli i Helena