Introduction: C/C++ En Arduino: Casos Con Switch Case

About: Músico, matemático, computación, ciencia... insolente y subversivo, pero siempre propositivo

En este instructable aprenderemos a utilizar el comando switch case. Construiremos un sem[aforo que cambia la luz apretando un botón. Cuando tenemos muchas opciones podríamos llenar de condicionales if...else, pero el código se hace poco legible e infeiciente. Cuando hay más de dos casos por lo general es práctico utilizar esti tipo de estrucutra para condicionales. La sintaxis es:

switch (var) { 
  case 1:
    //ejecuta algo cuando var es 1
  break;  //sale del switch
  case 2:    
      //ejecuta algo cuando var es 2
  break;  //sale del switch  
  default:     
    //ejecuta algo en cualquier otro caso (default es opcional)
  break;  //sale del switch
}

La variable var debe ser un entero (int). Cuando esta variable tiene un valor de 1, entonces ejecuta lo que está justo después de "case 1:", luego de eso el "break" garantiza que se sale del "siwtch". Si no colocamos el "break" va a continuar verificando los casos y perdería el tiempo buscando los casos que ya sabemos no corresponden. En este instructable haremos un semáforo con 3 casos.

Step 1: Materiales

Ocupamos:

  1. Arduino UNO
  2. Leds rojo, amarillo y verde
  3. Resistencias de 330 Ohmn
  4. Botón
  5. Cables
  6. Breadboard

Step 2: Conexiones

Botón

El botón lo colocamos en el breadboard en el centro como se ve en la foto. Conectamos una pata al GND y la otra al pin 8. En este caso vamos a usar un pullup resistor (ver este instructable para detalles) para controlar el estado del botón (estado quiere decir si está presionado o no)

Leds

Para conectar los leds hay que usar una resistencia de 330 Ohmns, para cada uno. En este instructable puede aprender un poco más de los leds y como se conectan. Como se muestra en la foto conectamos los leds y de la pata negativa a la resistencia y de esta al GND. Cada led se conecta a un pin diferente. En este caso conectamos el verde al 2, el amarillo al 3 y el rojo al 4.

Step 3: Código

El código es bastante directo. Queremos que cada vez que se presione el botón, una variable interna que la vamos a llamar "botonState" cambie de valor. del estado 0 al 1, al 2 y nuevamente al 0. Para lograr eso, vamos a utilizar un operador matemática bastante utilizado en programación, que es el operador módulo "%"

La operación módulo en una computadora lo que hace es retornar el residuo de la división de enteros. Dados dos operandos, en dividendo a y el divisor n, a%n, es el resíduo de la division, llamada euclidiana por ser división de dos números enteros, de a entre n. ASí por ejemplo 0 % 3 = 0, y 1 % 3 = 1, 2%3 = 2, 3%3 = 0, 4%3 = 1, y así sucesivamente, vean como el resultado va circulando entre 0,1 y 2, para regresar al 0 nuevamente. este operador es muy útil en el código, donde se quieran comportamientos circulares de variables. En Wikipedia hay una buena explicación de esto.

En la línea 1, creamos una variable global, de tipo entero, que la llamamos "botonState". En esta variable almacenaremos el cambio de estado, cada vez que se aprieta el botón. En las líneas de 4 a 7 simplemente inicializamos los pines. Noten como el pin 8 indicamos que es INPUT_PULLUP. Acá pueden ver más sobre los pines en Arduino.

El código en las líneas 10 a 14:

if (digitalRead(8) == 0) {
// el operador % significa modulo botonState = (botonState + 1) % 3; delay(200); }

Acá es donde utilizamos la operación módulo. Noten como le agregamos un delay para que el cambio no sea tan rápido. Primero leemos si el botón está presionado, es decir cuando la lectura del pin es igual a 0. Si es así, entonces actualizamos el estado de la variable "botonState", con la expresión:

botonState = (botonState + 1) % 3;

Lo que hace esta expresión es sumarle 1 al lo que ya estaba en "botonState" y luego aplicar la función módulo, de esa forma la variable puede tener los varlores 0,1,2 y da vueltas en esos números. Ahora para indicar cual led prender, utilizamos el "estado" en el que está "botonState", en la siguiente línea de código (líneas 15 a 31):

switch (botonState) {
case 0: digitalWrite(2, HIGH); digitalWrite(3, LOW); digitalWrite(4, LOW); break; case 1: digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, LOW); break; case 2: digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, HIGH); break; }

Como ven, si "botonState" es igual a 1, entonces prende el led conectado al pin2, si es igual a 0, y el resto los apaga. Si es igual a 1, etonces prende el led del pin 3 y el resto los apaga, y así sucesivamente. Listo!

Step 4: Funcionando

Cargar el código. Ahora simplemente aprieten el botón y la luz cambiará acordemente. Pueden hacer modificaciones si quieren algún otro tipo de transición entre luces. En este otro instructable(REF), por ejemplo, acomodamos el código usando funciones, para hacer un semáforo automático.