sábado, 28 de marzo de 2015

Because we can

Me ha hecho mucha gracia el vídeo que se muestra a continuación, porque me he sentido muy identificado. Una de las ideas que tenía justamente es encender una lampara con Arduino de la misma forma que se muestra en el vídeo.

domingo, 22 de marzo de 2015

Encender rápidamente una serie de LEDs con un potenciómetro

Al girar el potenciómetro encendemos una serie de LEDs de forma acumulada. En esta ocasión podemos mover rápidamente la rueda del potenciómetro.

Un potenciómetro o resistencia variable nos permite disponer de valores analógicos entre 0 y 1023, en total son 1024 valores que podemos asociar a una entrada analógica como A0 y luego con condicionales establecer en el código las acciones que necesitamos. En este caso encenderemos una serie de LEDs de forma secuencial.

Ahora podemos mover rápidamente el potenciómetro y conseguiremos que se enciendan siempre no solo el LED que toque sino todos los anteriores. Esto se logra dando la instrucción en el código de que se enciendan todos los previos. Y el proceso análogo al apagarlos.

El proyecto se puede ver en el siguiente enlace:



int i;
int j;
int pinPotenciometro = A0;
int valorPotenciometro = 0;

void setup()
 {
  pinMode(pinPotenciometro, INPUT);
  for (i = 0; i < 14; i++)
  pinMode(i, OUTPUT);
  Serial.begin(9600);
 }

void loop()
 {
  valorPotenciometro = analogRead(pinPotenciometro);
  for (i = 0; i < 14; i++)
   {
    if (valorPotenciometro == 0) apagarLeds();
    if (valorPotenciometro > i*73 && valorPotenciometro <= (i+1)*73) encenderHasta(); //en este rango está el LED que toca encender
    if (valorPotenciometro == 1023) encenderLeds();
   }
 }

void encenderHasta()
 {
  for (j = 0; j < 14; j++) 
   if (j<=i) digitalWrite(j, HIGH); //se enciende el LED que toca (el i-esimo) y todos los anteriores
   else digitalWrite(j, LOW);       //el resto se apagan
 }

void apagarLeds()
 {
  for (i = 0; i < 14; i++)
   digitalWrite(i, LOW);
 }

void encenderLeds()
 {
  for (i = 0; i < 14; i++)
   digitalWrite(i, HIGH);
 }

Encender uno a uno una serie de LEDs con un potenciómetro

Al girar el potenciómetro encendemos uno a uno una serie de LEDs y luego los apagamos. Solo hay uno encendido salvo en los extremos del potenciómetro.

Encendemos uno a uno 14 LEDs usando un potenciómetro, salvo en los extremos de la rueda del potenciómetro donde en un extremo apagamos todos y en contrario encendemos todos.

Podemos ver el proyecto en el siguiente enlace:



int i;
int j;
int pinPotenciometro = A0;
int valorPotenciometro = 0;
int tocaLed; //este es el LED que toca encender en cada momento

void setup()
 {
  pinMode(pinPotenciometro, INPUT);
  for (i = 0; i < 14; i++)
  pinMode(i, OUTPUT);
  Serial.begin(9600);
 }

void loop()
 {
  valorPotenciometro = analogRead(pinPotenciometro);
  for (i = 0; i < 14; i++)
   {
    if (valorPotenciometro == 0) apagarLeds();
    if (valorPotenciometro > i*73 && valorPotenciometro <= (i+1)*73)  //en este rango está el LED que toca encender
     {
      tocaLed = i;
      for (j=0; j<14; j++) //creamos otro bucle para encender el LED que toca y apagar el resto
        {
         if (j==tocaLed) digitalWrite(j, HIGH);
         else digitalWrite(j, LOW);
        }
     }
    if (valorPotenciometro == 1023) encenderLeds();
   }
 }

void apagarLeds()
 {
  for (i = 0; i < 14; i++)
   digitalWrite(i, LOW);
 }

void encenderLeds()
 {
  for (i = 0; i < 14; i++)
   digitalWrite(i, HIGH);
 }

sábado, 21 de marzo de 2015

Encender lentamente una serie de LEDs con un potenciómetro

Vamos a ver cómo actúa un potenciómetro al ir encendiendo una serie de LEDs y luego al ir apagándolos.

En este caso se trata de girar la rueda del potenciómetro o resistencia variable para conseguir que se vayan encendiendo los 14 LEDs, de forma que al encenderse uno de ellos queden encendidos los anteriores. Podemos girar la rueda hasta su posición final que es cuando todos quedan encendidos, y luego podemos ir girando en sentido contrario de forma que se irán apagando los LEDs hasta que al volver a la posición original todos quedarán apagados.

Disponemos de un voltímetro para ir mirando las lecturas que nos proporciona la resistencia variable.

Puedes ver el proyecto en el siguiente enlace:



int i = 0;
int pinPotenciometro =A0;
int valorPotenciometro = 0;

void setup()
 {
  pinMode(pinPotenciometro, INPUT);
  for (i = 0; i < 14; i++)
  pinMode(i, OUTPUT);
  Serial.begin(9600);
 }

void loop()
 {
  valorPotenciometro = analogRead(pinPotenciometro);
  //Las dos siguientes líneas de código se ponen si deseamos ver los valores por el monitor serial
  //Serial.println(valorPotenciometro, DEC);
  //delay(100);
  for (i = 0; i < 14; i++)
   {
    if (valorPotenciometro == 0) apagarLeds();
    if (valorPotenciometro > i*73 && valorPotenciometro < (i+1)*73) digitalWrite(i, HIGH);
    if (valorPotenciometro > (i-1)*73 && valorPotenciometro < i*73) digitalWrite(i, LOW);
    if (valorPotenciometro == 1023) encenderLeds();
  }
 }

void apagarLeds()
 {
  for (i = 0; i < 14; i++)
   digitalWrite(i, LOW);
 }

void encenderLeds()
 {
  for (i = 0; i < 14; i++)
   digitalWrite(i, HIGH);
 }

Potenciómetro y LED

Introducimos un potenciómetro o resistencia variable que proporcionará valores analógicos a la placa Arduino entre 0 y 1023. Esto es, existen 1024 valores analógicos que se recogen en la entrada A0 del Arduino.

El código analiza esos valores y lo que hace es que al inicio del recorrido del potenciómetro el LED está apagado, en el recorrido intermedio del potenciómetro el LED se enciende de forma intermitente y en su recorrido final el LED queda encendido de forma continua.

En términos aproximados estos son los intervalos según el voltímetro que se adjunta.
  • de 0V a 1.4V el LED está apagado
  • de 1.5V a 3.4V el LED está encendido de forma intermitente
  • de 3.5V a 5V el LED está encendido de forma continua

Hemos añadido un voltímetro para ir viendo los valores que arroja entre 0V y 5V al ir girando el potenciómetro.

Se puede ver el proyecto en el siguiente enlace:




int valorPotenciometro = 0;
void setup()
{
pinMode(A0, INPUT);
pinMode(13, OUTPUT);
Serial.begin(9600);
}
void loop()
{
valorPotenciometro = analogRead(A0);
//delay(100);
if (valorPotenciometro < 300) digitalWrite(13, LOW);
if (valorPotenciometro >= 300 && valorPotenciometro < 700) intermitencia();
if (valorPotenciometro >= 700) digitalWrite(13, HIGH);
}
void intermitencia()
{
digitalWrite(13, HIGH);   
  delay(200);             
  digitalWrite(13, LOW);  
  delay(200);             
}

En una entrada posterior vamos a controlar una serie de LEDs con un potenciómetro, para que se vayan encendiendo de forma secuencial.

viernes, 13 de marzo de 2015

Apagar un LED mientras esté apretado un botón

En la entrada anterior de este blog hemos visto el caso denominado Encender un LED mientras esté apretado un botón.

Para este caso hemos respetado el código íntegramente y el circuito únicamente cambia en dos puntos que están marcados en la siguiente imagen mediante un circulo de color azul que rodea la resistencia y uno de los cables, que son los dos únicos que cambian.

Este es el proyecto:



/*
 El LED está asociado al pin digital 12.
 El botón está asociado al pin digital 2.
 El LED está permanentemente encendido
 sólo se apaga al presional el pulsador
 */

// Variables estáticas
int pinBoton = 2;   // Declaramos la variable pin del Botón
int pinLed =  12;   // Declaramos la variable pin del Led

// Variables dinámicas
int estadoBoton = 0;  // Variable para estado del botón

void setup() {
// Inicializa el pin del LED como salida:
pinMode(pinLed, OUTPUT);
// Inicializa el pin del botón como entrada:
pinMode(pinBoton, INPUT);
}

void loop(){
// Lee el valor del pin del botón y lo almacena
// en la variable estadoBoton
estadoBoton = digitalRead(pinBoton);

// Chequea si el botón está pulsado:
if (estadoBoton == HIGH) {
// Si es así, enciende el LED:
digitalWrite(pinLed, HIGH);
}

else {
// Si no, lo mantiene apagado:
digitalWrite(pinLed, LOW);
}
}

También podríamos sustituir el código del proyecto anterior por el siguiente código y funcionaría perfectamente.

int estado;
void setup(){
  pinMode(12,OUTPUT);
  pinMode(2,INPUT);
}
void loop(){
  estado = digitalRead(2);
  digitalWrite(12,estado);
  delay(50);
}

Encender un LED mientras esté apretado un botón

Puedes ver el proyecto en el siguiente enlace:



/*
 El LED se conecta al pin digital 12.
 El botón está conectado al pin digital 2.
 Al pulsar el botón se enciende el LED
*/

// Variables estáticas
int pinBoton = 2;   // Declaramos la variable Botón
int pinLed =  12;   // Declaramos la variable Led

// Variables dinámicas
int estadoBoton = 0;  // Variable para estado del botón

void setup() {
// Inicializa el pin del LED como salida:
pinMode(pinLed, OUTPUT);
// Inicializa el pin del botón como entrada:
pinMode(pinBoton, INPUT);
}

void loop(){
// Lee el valor del pin del botón y lo almacena
// en la variable estadoBoton
estadoBoton = digitalRead(pinBoton);

// Chequea si el botón está pulsado:
if (estadoBoton == HIGH) {
// Si es así, enciende el LED:
digitalWrite(pinLed, HIGH);
}

else {
// Si no, lo mantiene apagado:
digitalWrite(pinLed, LOW);
}
}

También puedes verse otro proyecto donde se consigue el mismo resultado pero con código mucho más corto. Es el siguiente proyecto:



int estado;
void setup(){
  pinMode(2,OUTPUT);
  pinMode(8,INPUT);
}
void loop(){
  estado = digitalRead(8);
  digitalWrite(2,estado);
  delay(50);
}