Botoneando

Imos ver como meter botóns (pulsadores) nos nosos proxectos de Arduino, e esta vez imos controlar o semáforo mediante o pulsador. Ademais, imos aprender unha instrucción nova moi útil, a función switch ... case.

Preparación:

Precisas:

- Tres leds (vermello, verde e amarelo).

- Tres resistencias de 220 ohmnios.

- Unha resistencia de 10 Kohmnios.

- Breadboard e cables.

Os pulsadores:

Antes de nada, aclarar como funcionan os pulsadores máis comúns que atopamos, que adoitan ter catro patillas aínda que sexan en realidade un interruptor común. Segundo ves na imaxe resaltado en rosa, as patillas están unidas dúas a dúas, e ao premer cerras o interruptor.

Conexión co Arduino:

(Clica para ampliar)

O Código:

Ler o estado do pulsador:

Primeiro imos nada máis facer a lectura do pulsador, para ver como funciona. Tes o código abaixo, pero púxencho oculto en branco para que tentes facelo por ti mesmo/a a partir dos comentarios, que, a estas alturas, xa es un/ha experto/a en programación! Se te perdes demasiado, selecciona o texto para velo.

//Lectura do estado dun pulsador

//Defino a variable 'pinPulsador' e lle adxudico o valor 11

int pinPulsador=11;

//Abro a función setup

void setup() {

//Establezco que pinPulsador vai ser unha entrada

pinMode(pinPulsador,INPUT);

//Inicio o porto de comunicacion serie para poder facer as lecturas

Serial.begin(9600);

}

//Abro a funcion loop

void loop() {

//defino unha variable 'estadoBoton' e lle adxudico a lectura no pinPulsador

int estadoBoton=digitalRead(pinPulsador);

//Imprimo polo porto serie o valor de estadoBoton

Serial.println(estadoBoton);

//fago unha espera de 200 ms. para que as lecturas non sexan demasiado rapidas

delay (200);

}

Se o código cargou sen problemas, agora deberías abrir o monitor serie (lembras a lupiña de arriba á dereita?) e poder ler o estado do pulsador, mentres non premas nel deberían de aparecer ceros (LOW) e cando premes deberan aparecer uns (HIGH). Acontece así? Fíxate en que, mentres está premido o botón, non nos aparece un único "1", senón que sae un chorro deles durante todo o tempo que teña o meu dedo sobre o pulsador, logo será importante para mellorar o noso código.

Facer que o semáforo cambie co pulsador:

Agora imos relacionar o botón cos LEDs mediante o código de Arduino, e imos facer que estes cambien de estado cando prememos o pulsador.

//Semaforo regulado por pulsador

//Defino as variables que vou precisar

int ledVerde=8;

int ledAmarelo=9;

int ledVermello=10;

int pinBoton=11;

int estadoBoton;

//esta variable, ledAceso, vaime servir para identificar cada pin de LED cun numero para o seu control

int ledAceso=1;

//Abro a funcion de setup onde defino os pines dos LEDs como saidas e o do boton coma entrada

void setup(){

pinMode(ledVerde,OUTPUT);

pinMode(ledAmarelo,OUTPUT);

pinMode(ledVermello,OUTPUT);

pinMode(estadoBoton,INPUT);

}

void loop(){

//Empregamos a orde switch case para ver como esta ledAceso e encender un ou outro LED segundo o seu valor

switch (ledAceso) {

//se ledAceso e 1 encende o verde e apaga os outros

case 1:

digitalWrite(ledVerde,HIGH);

digitalWrite(ledAmarelo,LOW);

digitalWrite(ledVermello,LOW);

break;

//se ledAceso e 2 encende o amarelo e apaga os outros

case 2:

digitalWrite(ledVerde,LOW);

digitalWrite(ledAmarelo,HIGH);

digitalWrite(ledVermello,LOW);

break;

//se ledAceso e 3 encende o vermello e apaga os outros

case 3:

digitalWrite(ledVerde,LOW);

digitalWrite(ledAmarelo,LOW);

digitalWrite(ledVermello,HIGH);

break;

}

//asigno a estadoBoton a lectura do pinBoton

estadoBoton=digitalRead(pinBoton);

//se estadoBoton e 1, o pulsador estara premido

if (estadoBoton==1) {

//fago que ledAceso aumente o seu valor en un

ledAceso++;

// se ledAceso chega a ser maior de 3,voltamos a empezar

if (ledAceso>3) {

ledAceso=1;

}

}

//esta espera regula o tempo que precisa estar premido o boton para cambiar de LED

delay(100);

}

Comproba o funcionamento deste código... que pasa se deixo pulsado demasiado tempo o pulsador? que pasa se pulso moi pouco tempo? Como podes cambiar a velocidade coa que cambia o pulsador? Solución: Cambiando o valor do delay() da última liña (selecciona o espazo en branco para velo).

Como podes comprobar, este código non é perfecto, xa que require un certo "entrenamento" ou "destreza" para poder manexar o semáforo, e iso non debera ser así. Sexamos máis ou menos rápidos premendo o pulsador, o semáforo debera cambiar igual, de color en color. Este sinxelo cambio require un código un chisco complexo, que explicaremos nunha entrada aparte, de momento, ímonos contentar con este funcionamento, que ademais mola moito ver o semáforo cambiar a toda velocidade :)

A función switch ... case:

Se escribiches o código e reparaches un pouco nos comentarios, xa intuirías que empregamos a función 'switch ... case' para ver que valor ten a variable ledAceso e para poñer os LEDs nunha posición determinada segundo ese valor. Esta función traballa do seguinte modo:

switch (variable que quero comprobar) {

case posibles valores da variable :

o que ten que facer para cada valor

break;

}

Como exemplo, imaxina que temos unha variable 'nome' na que gardamos os nomes duns usuarios, e queremos que a cada usuario o programa lle saúde dun xeito. Para isto, unha función switch case nos sería moi útil.

switch (nome) {

case "tucho":

print ("Que guapo estás hoxe!");

break;

case "noa":

print ("Que forte estás... vas ao ximnasio?");

break;

case "leo":

print ("Que ben te senta o blaugrana!");

break;

case "cristiano":

print ("Tes que pensarte o das túas cellas...");

break;

}

Que cres que faría este programa?

Solución:

Vería o valor da variable "nome" e, segundo fose este, contestaría unha frase a cada un.

O break que hai ao final de cada case é para que o Arduino, en caso de que o valor da variable coincida co que se compara no case, se salte o resto da estructura e pase a facer as instruccións seguintes no código.

Se queres ampliar un pouco sobre switch ... case , podes consultar a referencia de Arduino e este estupendo post dos patacalabs e a súa estación refraneira.

Retos:

- Poderías facer que o semáforo cambiase en sentido inverso? (Vermello - Amarelo - Verde)

- O anterior se pode facer cambiando UNICAMENTE tres liñas... cres que poderías facelo? PISTA: Tes que cambiar ledAceso++ por ledAceso--

- Poderías facer que o pulsador fixera calquera outra cousa (que cada vez que prema se encendan ou apaguen todas as luces, que primeiro se vaian encendendo todas por orde e logo apagando...)