Etiquetas: , ,

Una de las formas más fáciles y rápidas para aprender programación y electrónica con Arduino es usar LED. Aquí veremos cómo controlar los LED y cómo seleccionar diferentes funcionalidades del código con solo un botón. Esto resume de manera simple lo que podría encontrar trabajando en un robot: Cerebro (placa Arduino), Sentidos (sensores, aquí un botón) y Ouputs o actuadores (aquí simbolizados por LED).

Material

  • Computadora
  • Arduino UNO
  • USB cable
  • LEDs x3
  • Breadboard
  • Dupont cable M/M
  • botón pulsador x1
  • Resistancias x4

Objetivo

En este tutorial, crearemos varias funciones para controlar los LED según el modo seleccionado. Este es el objetivo de cualquier programa de robot: ejecutar una acción dependiendo de las entradas de los sensores.

Alambrado

El botón pulsador está conectado al pin 7, LED1 en 8, LED2 en 9 y LED3 en 10. Agregamos algo de resistencia eléctrica para proteger los componentes, pero no siempre son necesarios. Consulte la hoja de datos de sus componentes antes de usarlos.

Código

Para controlar un LED, podemos usar la función digitalWrite() con el parámetro HIGH (ALTO) para encenderlo, LOW (BAJO) para apagarlo.

  digitalWrite(led1Pin,HIGH);
  delay(30);
  digitalWrite(led1Pin,LOW);
  delay(30);

También podemos modular el brillo del LED usando analogWrite().

  int brightness = 0; 
  int fadeAmount = 5;   

 for (brightness=0;brightness<=255;brightness+=fadeAmount){
    analogWrite(led1Pin, brightness);
    delay(30);  
  }

Esas funciones básicas se usan en los ejemplos de Arduino IDE, Blink and Fade. A partir de ellos, podemos crear subfunciones que controlarán los LED de manera diferente según el modo seleccionado.

Para leer el estado de un botón, usamos la función digitalRead(). En esta aplicación, queremos contar la cantidad de veces que se presiona el botón. Para hacerlo, la función dedicada es pulseIn() que mide la longitud de un pulso.

unsigned long buttonState = 0;
int funcState=0;

void buttonPressed() {
    buttonState = pulseIn(btnPin,HIGH,1000000);
    if (buttonState > 50){
      funcState += 1;
      Serial.print("Button state n: ");
      Serial.println(funcState);
    }
    funcState=funcState%NBSTATE;
  }

El modo seleccionado se almacena en la variable funcState. Podemos definir los modos y asociar las funciones correspondientes. Usamos las palabras clave enum, que crea una lista de enteros, y switch..case, que selecciona un fragmento de código para ejecutar según una variable.

enum fcnMode { 
  OFF, 
  LED1, 
  LED2, 
  LED3,
  FADE1, 
  ALL,
  BLINK,
  NBSTATE
  }; // OFF = 0 and NBSTATE=7

  switch(funcState){
    case OFF:
    break;
    case LED1:
      digitalWrite(led1Pin,HIGH);
    break;
    case LED2:
      digitalWrite(led2Pin,HIGH);
    break;
    case LED3:
       digitalWrite(led3Pin,HIGH);
    break;
    case FADE1:
      fade1();
      break;
    case ALL:
      digitalWrite(led1Pin,HIGH);
      digitalWrite(led2Pin,HIGH);
      digitalWrite(led3Pin,HIGH);
    break;
    case BLINK:
      blinkLed1();
      blinkLed2();
      blinkLed3();
    break;
  }

Código completo

Puede modificar el código completo para adaptarlo a su proyecto.

// Pin assignement
#define btnPin 7
#define led1Pin 8
#define led2Pin 9
#define led3Pin 10
enum fcnMode { 
OFF, 
LED1, 
LED2, 
LED3,
FADE1, 
ALL,
BLINK,
NBSTATE
}; // OFF = 0 and NBSTATE=7
int ledState1 = LOW,ledState2 = LOW,ledState3 = LOW;             // ledState used to set the LED
unsigned long buttonState = 0;
int funcState=0;
unsigned long currentMillis1,currentMillis2,currentMillis3;        // will store current time
unsigned long previousMillis1,previousMillis2,previousMillis3;        // will store last time LED was updated
const long interval1 = 100;           // interval at which to blink (milliseconds)
const long interval2 = 300;
const long interval3 = 500;
/******************************************************************\
* PRIVATE FUNCTION: setup
*
* PARAMETERS:
* ~ void
*
* RETURN:
* ~ void
*
* DESCRIPTIONS:
* Initiate inputs/outputs
*
\******************************************************************/
void setup(){
Serial.begin(9600); // initialize serial port
pinMode(btnPin,INPUT_PULLUP);
pinMode(led1Pin,OUTPUT);
pinMode(led2Pin,OUTPUT);
pinMode(led3Pin,OUTPUT);
}
/******************************************************************\
* PRIVATE FUNCTION: loop
*
* PARAMETERS:
* ~ void
*
* RETURN:
* ~ void
*
* DESCRIPTIONS:
* Main Function of the code 
\******************************************************************/
void loop(){
buttonPressed();
setMode();
}
/******************************************************************
* SUBFUNCTIONS 
\******************************************************************/
void buttonPressed() {
buttonState = pulseIn(btnPin,HIGH,1000000);
if (buttonState > 50){
funcState += 1;
Serial.print("Button state n: ");
Serial.println(funcState);
}
funcState=funcState%NBSTATE;
}
void setMode() {
// All Off
digitalWrite(led1Pin,LOW);
digitalWrite(led2Pin,LOW);
digitalWrite(led3Pin,LOW);

Serial.print("Function : ");
Serial.println(funcState); 
switch(funcState){
case OFF:
break;
case LED1:
digitalWrite(led1Pin,HIGH);
break;
case LED2:
digitalWrite(led2Pin,HIGH);
break;
case LED3:
digitalWrite(led3Pin,HIGH);
break;
case FADE1:
fade1();
break;
case ALL:
digitalWrite(led1Pin,HIGH);
digitalWrite(led2Pin,HIGH);
digitalWrite(led3Pin,HIGH);
break;
case BLINK:
blinkLed1();
blinkLed2();
blinkLed3();
break;
}
}
void fade1(){
int brightness = 0; 
int fadeAmount = 5;   
for (brightness=0;brightness<=255;brightness+=fadeAmount){
analogWrite(led1Pin, brightness);
delay(30);  
}
for (brightness=255;brightness>=0;brightness-=fadeAmount){
analogWrite(led1Pin, brightness);
delay(30); 
}
}
void blinkLed1(){
currentMillis1 = millis();
if (currentMillis1 - previousMillis1 >= interval1) {
// save the last time you blinked the LED
previousMillis1 = currentMillis1;
// if the LED is off turn it on and vice-versa:
if (ledState1 == LOW) {
ledState1 = HIGH;
} else {
ledState1 = LOW;
}
// set the LED with the ledState of the variable:
digitalWrite(led1Pin, ledState1);
}
}
void blinkLed2(){
currentMillis2 = millis();
if (currentMillis2 - previousMillis2 >= interval2) {
// save the last time you blinked the LED
previousMillis2 = currentMillis2;
// if the LED is off turn it on and vice-versa:
if (ledState2 == LOW) {
ledState2 = HIGH;
} else {
ledState2 = LOW;
}
// set the LED with the ledState of the variable:
digitalWrite(led2Pin, ledState2);
}
}
void blinkLed3(){
currentMillis3 = millis();
if (currentMillis3 - previousMillis3 >= interval3) {
// save the last time you blinked the LED
previousMillis3 = currentMillis3;
// if the LED is off turn it on and vice-versa:
if (ledState3 == LOW) {
ledState3 = HIGH;
} else {
ledState3 = LOW;
}
// set the LED with the ledState of the variable:
digitalWrite(led3Pin, ledState3);
}
}

Deja un comentario para compartir tus proyectos o para decirnos qué piensas de este tutorial. No dude en contact us para cualquier pregunta que pueda tener.

Application

Build a traffic light

Source

Referencia Arduino

Aprenda a leer el valor del sensor