Pages: [1] 2   Go Down
Author Topic: Encender y apagar leds con el mando a distancia.  (Read 6885 times)
0 Members and 1 Guest are viewing this topic.
Pamplona
Offline Offline
Newbie
*
Karma: 0
Posts: 23
un conejo
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 Er coneho ataca de nuevo: Acabo de hacer mi primer experimento con el mando a distancia y arduino... yupy, funciona... mi hija chispillas y yo to felices. le damos al uno y se enciende el led rojo...jajajaja dominaremos er mundo, Al dos y er naranha, er tré y er verde, er 4 y er amarillo limon. Le damos ar boton de off der mando y se apagan tos. ole ole y ole.
 Pero somos más exigentes... y nos gustaria pulsar el uno otra ves y que solo se apague er roho... que los demas se queden ensendidos. que le damo ar dos... pos solo se apague er naranha.
 o sea que con er mismo numero se apague o ensienda er led correspondiente.
El codigo usado es el siguiente.
// Sketch para controlar un led RGB con un
// mando a distancia IR con protocolo NEC

#include <WProgram.h>
#include <NECIRrcv.h> //Libreria del protocolo NEC
#define IRPIN 8 // Pin del receptor IR

NECIRrcv ir(IRPIN);

int rojo = 9;  //Pin del color ROJO del led RGB
int verde = 10; //Pin del color VERDE del led RGB
int azul = 11; //Pin del color AZUL del led RGB
int amarillo = 12; // pin nuevo

long power = 0xFF00BF00;  //Codigo correspondiente al boton POWER del mando a distancia
long butrojo = 0xEF10BF00; //Codigo correspondiente al boton 1 del mando a distancia
long butverde = 0xEE11BF00; //Codigo correspondiente al boton 2 del mando a distancia
long butazul = 0xED12BF00; //Codigo correspondiente al boton 3 del mando a distancia
long butamarillo = 0xEB14BF00; // codigo boton 4

void setup()
{
  Serial.begin(9600); //Iniciamos comunicacion serie
  Serial.println("NEC IR code reception") ;
  ir.begin(); //Iniciamos la recepcion IR
 
  pinMode(rojo, OUTPUT);
  pinMode(verde,OUTPUT);
  pinMode(azul, OUTPUT);
  pinMode(amarillo,OUTPUT);
}

void loop()
{
  unsigned long ircode; //Variable que contendra el codigo decimal del boton pulsado
 
  while (ir.available())
  {
    ircode = ir.read(); //Leemos el codigo del boton pulsado
     Serial.print("got code: 0x") ;
    Serial.println(ircode,HEX) ;
     if (ircode == power) //Si el boton de power... apagamos el led
     {
       digitalWrite(rojo, LOW);
       digitalWrite(verde, LOW);
       digitalWrite(azul, LOW);
       digitalWrite(amarillo, LOW);
     }
     else if (ircode == butrojo) digitalWrite(rojo,HIGH);  //Si boton 1, encendemos color rojo
     else if (ircode == butverde) digitalWrite(verde,HIGH); //Si boton 2, encendemos color verde
     else if (ircode == butazul) digitalWrite(azul,HIGH); //Si boton 3, encendemos color azul
     else if (ircode == butamarillo) digitalWrite(amarillo,HIGH); //si boton 4 enciende amarillo
  }
}
 Muchas grasias por adelantao... Er ficus y la chispillas
Logged

Offline Offline
Sr. Member
****
Karma: 9
Posts: 252
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola, no lo he podido probar aún, pero creo que esto podría funcionar. Se puede mejorar aún más para evitar que el código tome un click como que fué 2 clicks, por eso el Delay.

Lo armé para el rojo, de ahí habría que armar los demás. El de prender todos o apagar todos creo que sería similar.

PD: Explico, la idea es un "booleano" que puede ser cierto o falso, y que cambia cada vez que se presiona el boton correspondiente al color, entonces mandamos el write y en cada ciclo le invertimos su valor, por eso, una vez prende, a la siguiente apagaría.

Code:
// Sketch para controlar un led RGB con un
// mando a distancia IR con protocolo NEC

#include <WProgram.h>
#include <NECIRrcv.h> //Libreria del protocolo NEC
#define IRPIN 8 // Pin del receptor IR

NECIRrcv ir(IRPIN);

int rojo = 9;  //Pin del color ROJO del led RGB
int verde = 10; //Pin del color VERDE del led RGB
int azul = 11; //Pin del color AZUL del led RGB
int amarillo = 12; // pin nuevo

boolean estadorojo = false;

long power = 0xFF00BF00;  //Codigo correspondiente al boton POWER del mando a distancia
long butrojo = 0xEF10BF00; //Codigo correspondiente al boton 1 del mando a distancia
long butverde = 0xEE11BF00; //Codigo correspondiente al boton 2 del mando a distancia
long butazul = 0xED12BF00; //Codigo correspondiente al boton 3 del mando a distancia
long butamarillo = 0xEB14BF00; // codigo boton 4

void setup()
{
  Serial.begin(9600); //Iniciamos comunicacion serie
  Serial.println("NEC IR code reception") ;
  ir.begin(); //Iniciamos la recepcion IR
 
  pinMode(rojo, OUTPUT);
  pinMode(verde,OUTPUT);
  pinMode(azul, OUTPUT);
  pinMode(amarillo,OUTPUT);
}

void loop()
{
  unsigned long ircode; //Variable que contendra el codigo decimal del boton pulsado
 
  while (ir.available())
  {
    ircode = ir.read(); //Leemos el codigo del boton pulsado
     Serial.print("got code: 0x") ;
    Serial.println(ircode,HEX) ;
     if (ircode == power) //Si el boton de power... apagamos el led
     {
       digitalWrite(rojo, LOW);
       digitalWrite(verde, LOW);
       digitalWrite(azul, LOW);
       digitalWrite(amarillo, LOW);
     }
     else if (ircode == butrojo){
     delay(100);
     estadorojo = !estadorojo;
     digitalWrite(rojo,estadorojo);
     }

     else if (ircode == butverde) digitalWrite(verde,HIGH);
     else if (ircode == butazul) digitalWrite(azul,HIGH);
     else if (ircode == butamarillo) digitalWrite(amarillo,HIGH);
  }
}
« Last Edit: April 03, 2013, 06:26:33 pm by American2020 » Logged

My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

Pamplona
Offline Offline
Newbie
*
Karma: 0
Posts: 23
un conejo
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 Joe que gusto da.... todo resuelto en un dia. Gracias American2020 por tu ayuda que ha resuelto totalmente mi problema.
 Tras tostar mi receptor de infrarojos por invertirle la polaridad (jejeje, por eso somos chispas y chispillas) y comprar unos nuevos, integro el codigo con boolean en todos los leds y funcionaaaaaa...jajajaja... dominaremos el mundo... jajajjajajaa.
 Quiero agradecer de nuevo a American2020 su desinteresada ayuda que se vera recompensada con una cerveza bien fria si viene por pamplona a correr los sanfermines. Y a todos los demas que seguis teniendo paciencia con este coneho...
 Ficus y chispillas
Logged

Pamplona
Offline Offline
Newbie
*
Karma: 0
Posts: 23
un conejo
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ops... y para todos aquellos que quieran repetir mi experimento el codigo es:
// Sketch para controlar un led RGB con un
// mando a distancia IR con protocolo NEC

#include <WProgram.h>
#include <NECIRrcv.h> //Libreria del protocolo NEC
#define IRPIN 8 // Pin del receptor IR

NECIRrcv ir(IRPIN);

int rojo = 9;  //Pin del color ROJO del led RGB
int verde = 10; //Pin del color VERDE del led RGB
int azul = 11; //Pin del color AZUL del led RGB
int amarillo = 12; // pin nuevo

boolean estadorojo = false;
boolean estadoverde = false;
boolean estadoazul = false;
boolean estadoamarillo = false;

long power = 0xFF00BF00;  //Codigo correspondiente al boton POWER del mando a distancia
long butrojo = 0xEF10BF00; //Codigo correspondiente al boton 1 del mando a distancia
long butverde = 0xEE11BF00; //Codigo correspondiente al boton 2 del mando a distancia
long butazul = 0xED12BF00; //Codigo correspondiente al boton 3 del mando a distancia
long butamarillo = 0xEB14BF00; // codigo boton 4

void setup()
{
  Serial.begin(9600); //Iniciamos comunicacion serie
  Serial.println("NEC IR code reception") ;
  ir.begin(); //Iniciamos la recepcion IR
 
  pinMode(rojo, OUTPUT);
  pinMode(verde,OUTPUT);
  pinMode(azul, OUTPUT);
  pinMode(amarillo,OUTPUT);
}

void loop()
{
  unsigned long ircode; //Variable que contendra el codigo decimal del boton pulsado
 
  while (ir.available())
  {
    ircode = ir.read(); //Leemos el codigo del boton pulsado
     Serial.print("got code: 0x") ;
    Serial.println(ircode,HEX) ;
     if (ircode == power) //Si el boton de power... apagamos el led
     {
       digitalWrite(rojo, LOW);
       digitalWrite(verde, LOW);
       digitalWrite(azul, LOW);
       digitalWrite(amarillo, LOW);
     }
     else if (ircode == butrojo){
     delay(100);
     estadorojo = !estadorojo;
     digitalWrite(rojo,estadorojo);
     }

     else if (ircode == butverde){
       delay (100);
     estadoverde = !estadoverde;
     digitalWrite(verde,estadoverde);
     }
     else if (ircode == butazul){
      delay (100);
      estadoazul = !estadoazul;
      digitalWrite(azul,estadoazul);
     }
     else if (ircode == butamarillo){
       delay (100);
       estadoamarillo = !estadoamarillo;
       digitalWrite(amarillo,estadoamarillo);
     }
  }
}
Logged

Offline Offline
Sr. Member
****
Karma: 9
Posts: 252
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias por el agradecimiento...

Ahora yo te dejo un desafío. Has lo mismo con el botón Power.

boolean estadopower = false;


     if (ircode == power) //Si el boton de power... apagamos el led
     {
       delay (100);
       estadopower != estadopower;
       digitalWrite(rojo, estadopower);
       digitalWrite(verde, estadopower);
       digitalWrite(azul, estadopower);
       digitalWrite(amarillo, estadopower);
     }

Y si querés, aunque no se de que serviría, pero estaría bueno, y para implementarlo en el botón power, u otros que tengas en el control, hacer que al presionar ese botón, los 4 leds inviertan su estado, osea, prender los que estaban apagados y apagar los que estaban prendidos. smiley-wink

PD: Aún no tengo un control remoto de esos, pero me podrías decir que pasa con este código, si te quedás presionando el botón por largo tiempo. ¿El led empieza a prender y apagar cada 100ms? Si eso pasa es lo que te decía que el código se puede mejorar smiley
« Last Edit: April 04, 2013, 07:43:14 am by American2020 » Logged

My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

Pamplona
Offline Offline
Newbie
*
Karma: 0
Posts: 23
un conejo
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 Estimado American 2020... he probado a mantener pulsado el boton... nada... solo reconoce una pulsacion con lo que deja el led como estaba. no empieza una intermitencia. Ahora voy a integrar el codigo para el boton power... te dire que me sirve esa idea, ya que me dedico al tren miniatura. Esto lo he hecho para controlar luces en la ciudad. Con una inversion de los leds el efecto queda muy chulo.
 Muchas gracias por la nueva aportacion.
 Ahora te pongo en otra idea que tengo.
 Aunque no se si deberia abrir otro post.
 Gracias de parte de estos dos conejos de Pamplona.
Logged

Pamplona
Offline Offline
Newbie
*
Karma: 0
Posts: 23
un conejo
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 He probado a añadir lo del boton power... y no funciona como pensabamos. Enciende todos o apaga todos. No hace un cambio de estado en general de todos los leds... uyyyyy ... que pena...sonaba muy bien.
 Gracias de nuevo
Logged

Offline Offline
Sr. Member
****
Karma: 9
Posts: 252
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Es porque no te pasé las "Solución" a esa idea smiley-razz esa era para que la desarrolles vos. Sería así.

Code:
     if (ircode == power) //Si el boton de power o un sexto botón
     {
       delay (50); //Prueba bajarlo entonces si no hay interfencias y hace las cosas 2 veces
       
       //Invertimos todos los estados
     estadorojo = !estadorojo;
     estadoverde = !estadoverde;
     estadoazul = !estadoazul;
     estadoamarillo = !estadoamarillo;
     
       //Los mandamos
     digitalWrite(rojo,estadorojo);
     digitalWrite(verde,estadoverde);
     digitalWrite(azul,estadoazul);
     digitalWrite(amarillo,estadoamarillo);
     }

Decime que con ese código si funciona smiley-razz Al menos en la teoría debería...

Tienes razón, porque si lo haces en maquetas de trenes está muy bueno invertir señales con este código, por ejemplo para los semáforos y demás en las vías.

Lo que aún no se, y no he investigado, es que pasa si quiero hacer que un led quede titilando mientras aún sea capaz de seguir controlando los demás smiley-razz
Logged

My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

Pamplona
Offline Offline
Newbie
*
Karma: 0
Posts: 23
un conejo
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Jijiji no pense que se trataba de mi primer examen.... y lo habría suspendido.
Ahora ya esta todo el codigo integrado y la cosa va que arde.
los leds cambian a apagado los que estan encendidos y al reves. También he añadido la función de stop para apagar todo.
 Muchisimas gracias American 2020. Ahora puedo poner ya reles al invento y hacer que se iluminen casas, faroles en las calles y un parque de atracciones. ole ole y ole... como había dicho...jajajajajaja dominaremos el mundo (aunque sea en miniatura escala n)
 Ficus y chispillas
Logged

Offline Offline
Sr. Member
****
Karma: 9
Posts: 252
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

smiley Cuando lo tengas armado quiero fotos!!!

PD: Hoy viendo más videos en YouTube, aprendí un método "nuevo"

digitalWrite(rojo, !digitalRead(rojo));

Osea, sin tenes que usar variables declaradas antes, se puede leer en ese momento el estado de ese PIN y decirle que invierta su estado, me pareció bueno compartir esta variante, ya que evita el tener que declarar variables y demás.
Logged

My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

Palencia, Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 568
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

smiley Cuando lo tengas armado quiero fotos!!!

PD: Hoy viendo más videos en YouTube, aprendí un método "nuevo"

digitalWrite(rojo, !digitalRead(rojo));

Osea, sin tenes que usar variables declaradas antes, se puede leer en ese momento el estado de ese PIN y decirle que invierta su estado, me pareció bueno compartir esta variante, ya que evita el tener que declarar variables y demás.

Gracias por compartir, porque tenía en mi agenda mental probar exactamente eso. Estaba casi seguro de que funcionaba leer un pin de salida, pero no quería meter la pata. (Nota mental: ¿se puede leer igualmente el pwm enviado a una salida analógica?)
Logged

Offline Offline
Sr. Member
****
Karma: 9
Posts: 252
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

No se como sería, porque tampoco esto, que entiendo me debería devolver algo, me está mandando nada hacia el Serial

Code:
int ledPin = 9;


void setup() {
  pinMode(ledPin, OUTPUT);     
}

void loop()
{
    digitalWrite(ledPin, HIGH);
   
    int pinState = digitalRead(ledPin);
   
    Serial.println(pinState);
   
    delay (100);
}

Acá algo explican de esto en inglés, pero no entendí bien smiley-razz

http://playground.arduino.cc/Learning/AnalogPins

Quote
The analogRead command will not work correctly if a pin has been previously set to an output, so if this is the case, set it back to an input before using analogRead. Similarly if the pin has been set to HIGH as an output.

Al parecer debo establecerlo como INPUT antes de querer hacer la lectura, pero buscaré ejemplos de esto, que no quiero meter la pata smiley-razz Imagino que será que se puede hacer dentro del loop esto, ahora me toca ver como, si es de la manera "obvia" o si hay que considerar algo primero.

CUIDADO

Quote
The Atmega168 datasheet also cautions against switching digital pins in close temporal proximity to making A/D readings (analogRead) on other analog pins. This can cause electrical noise and introduce jitter in the analog system. It may be desirable, after manipulating analog pins (in digital mode), to add a short delay before using analogRead() to read other analog pins.
« Last Edit: April 05, 2013, 11:35:13 am by American2020 » Logged

My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

Pamplona
Offline Offline
Newbie
*
Karma: 0
Posts: 23
un conejo
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 Que gusto da encontrar que hay personas dispuestas a ayudarte a encontrar la solucion a los problemas... chispillas y yo sacaremos foto en cuanto el sistema este en funcionamiento. Ahora tambien me gustaria proponer mi siguiente dilema.
 Tengo una feria o parque de atracciones que controlar. Para ello tengo varios reles. Los  actuo via transistor y con un diodo para evitar el efecto rebote de la bobina. Funcionan genial. Pero ahora viene mi deseo... quiero algo que sea una sorpresa, de chocolate y un regalo.... y me trajeron un kinderegg. Noooooooooooooo eso es broma. Me gustaria poder poner un programa en arduino para que las atracciones se vayan conectando de manera aleatoria... y por tiempo aleatorio. Y todo ello sin contratar a un feriante.
 Gracias por adelantado
Ficus y Chispillas.

Logged

Offline Offline
Sr. Member
****
Karma: 9
Posts: 252
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sep, ahí ya es "más difícil" eso, osea, sabría como plantearlo, pero no bien como hacerlo.

Imagino que cada "atracción" podría ser una función y que haya un "Random" en el código que las vaya ejecutando aleatoriamente durante X tiempo y Y cantidad al mismo tiempo, y así apagarlas y encender otras, etc etc.

Creo que sería bueno si me pongo a armar algo de código, creo que es mi posibilidad de aprender como es esto de ejecutar las cosas por un tiempo definido, sin usar delays smiley
Logged

My 3x3x3 Led Cube

[url=http://arduino.cc/forum/index.php/topic,1642

Pamplona
Offline Offline
Newbie
*
Karma: 0
Posts: 23
un conejo
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Al final American 2020 me vas a llegar a odiar por explotador... jajajajaja... te agradezco que me hayas prestado toda tu ayuda.
Gracias
 Ficus y chispillas
Logged

Pages: [1] 2   Go Up
Jump to: