Pages: 1 [2]   Go Down
Author Topic: Encender y apagar leds con el mando a distancia.  (Read 6882 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 9
Posts: 252
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


De nada smiley-wink

No, me gusta ayudar, porque también estoy empezando en Arduino y todo esto también me ayuda a practicar

Te dejo mi código, al menos parte de él. Ya tiene salida por el "Monitor Serial" para ver que es lo que está haciendo. De momento lo que hace y sin usar "delay" en lo absoluto, es esperar un tiempo "Random"

En fin, enciendo 2 atracciones y luego simplemente se queda esperando tiempos al azar sin hacer nada más, porque aún no se como controlar cuando se deben apagar las atracciones.

Code:
const int pinAtraccUNO = 12;
const int pinAtraccDOS = 11;
const int pinAtraccTRES = 10;
const int pinAtraccCUATRO = 9;
const int pinAtraccCINCO = 8;

boolean setAtraccUNO = LOW;
boolean setAtraccDOS = LOW;
boolean setAtraccTRES = LOW;
boolean setAtraccCUATRO = LOW;
boolean setAtraccCINCO = LOW;

boolean randomEsperando = 0;

int atraccionesON =  0;

int timeON = 0;
int waitFOR = 0;

int numAtraccSimul = 2;
int numAtraccTotal = 5;

int minAtraccON = 5; //Segundos
int maxAtraccON = 30; //Segundos

int minEspera = 5; //Segundos
int maxEspera = 15; //Segundos

long timeActual = 0;
long timePrevio = 0;

long previousMillis = 0;        // will store last time LED was updated

void setup() {
Serial.begin(9600); //Para la prueba vemos las cosas en el serial

  // if analog input pin 0 is unconnected, random analog
  // noise will cause the call to randomSeed() to generate
  // different seed numbers each time the sketch runs.
  // randomSeed() will then shuffle the random function.
  randomSeed(analogRead(0)); //Al parecer esto hará que Random sea realmente Random
 
}

void loop() {
 
  if (randomEsperando == 0) { //Levantamos un número random
  //Espera Random sin usar delay
  waitFOR = random(minEspera,maxEspera+1); //Número random entre espera mínima y máxima, a máxima se le suma uno, para que lo incluya
  waitFOR = (waitFOR*1000); //Lo pasamos a milisegundos
 
  randomEsperando=1; //Esto indica que ya tenemos un número
  }
 
  else { //Si ya tenemos el número ejectuamos esto
 
  unsigned long timeActual = millis();
 
  if(timeActual - timePrevio > waitFOR) { //Vemos si se cumplió el tiempo de espera
  timePrevio = timeActual;   
   
  Serial.print("Espere por: ");
  waitFOR = (waitFOR/1000);
  Serial.print(waitFOR);
  Serial.println(" segundos...");

  randomEsperando=0; //Lo ponemos en 0 para que vaya a buscar otro número random
 
  //Se esperó X tiempo podemos pasar a lanzar atracciones al azar
 
  //Primero vemos si hemos alcanzado el máximo de atracciones ON
 
  if (atraccionesON <= (numAtraccSimul-1)) { //Tuve que poner ese -1 no se por qué :)

  int lanzarAtracc = random(1,numAtraccTotal+1); //Seleccionamos el número random de la atracción a lanzar, lo mismo, le sumamos 1
 
  timeON = random(minAtraccON,maxAtraccON+1); //Seleccionamos cuanto tiempo estará ON
 
  switch (lanzarAtracc) {
    case 1:
      atraccionesON++; //Sumamos 1 al total de atracciones ON
      atraccionUNO(timeON);
      break;
    case 2:
      atraccionesON++; //Sumamos 1 al total de atracciones ON
      atraccionDOS(timeON);
      break;
    case 3:
      atraccionesON++; //Sumamos 1 al total de atracciones ON
      atraccionTRES(timeON);
      break;
    case 4:
      atraccionesON++; //Sumamos 1 al total de atracciones ON
      atraccionCUATRO(timeON);
      break;
    case 5:
      atraccionesON++; //Sumamos 1 al total de atracciones ON
      atraccionCINCO(timeON);
      break;
    default:
      atraccionesON=0; //Indicamos que estan todas apagadas
      apagarTODAS(); //Acción por default, apagamos todas, en caso de que algo haya salido mal
      break;
  } //Fin del switch
 
  } //Fin de código lanza atraccionesON
 
  } //Fin del código ejecutado si se había alcanzado el tiempo de espera
 
  } //FIN código ejecutado al pasar X tiempo volverá a empezar
 
} //FIN loop
 

 
 
// Configuración de las atracciones

void atraccionUNO(int time) {
 
  Serial.print("Ok esto lanza la atraccion 1 por: ");
  Serial.print(time);
  Serial.println(" segundos...");
 
  // No se como controlar cuando pasó este tiempo, para proceder a apagarla
  // Imagino que un if, como el que está dentro del loop no serviría, ya que esta función se lanzó una sóla vez fuera del mismo
 
}

void atraccionDOS(int time) {
 
  Serial.print("Ok esto lanza la atraccion 2 por: ");
  Serial.print(time);
  Serial.println(" segundos...");
}

void atraccionTRES(int time) {
 
  Serial.print("Ok esto lanza la atraccion 3 por: ");
  Serial.print(time);
  Serial.println(" segundos...");
}

void atraccionCUATRO(int time) {
 
  Serial.print("Ok esto lanza la atraccion 4 por: ");
  Serial.print(time);
  Serial.println(" segundos...");
}

void atraccionCINCO(int time) {
 
  Serial.print("Ok esto lanza la atraccion 5 por: ");
  Serial.print(time);
  Serial.println(" segundos...");
}




void apagarTODAS() {
  Serial.println("Apagamos todas");
}
« Last Edit: April 07, 2013, 03:25:06 pm by American2020 » Logged

My 3x3x3 Led Cube

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

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

Bueno, te invito a probar este código, al parecer funciona 100%  smiley

Aún no digo que tengo una maestría en "delays" sin usar delays, pero me acerco bastante.

Cargalo y abrí el Monitor Serial, para ir viendo lo que va pasando.

Ya luego si quieres, conecta algunos Leds a los pines asignados y escribes el código para prenderlos y apagarlos dentro de cada función.

Recuerda que si lo usarás en maquetas, tendrás que mandar la señal a unos Relay o algo, porque la potencia que mandará el Arduino no alcanzará creo yo.

Fijate de tratar de ir entendiendo paso a paso que está pasando en cada etapa del código, igual está lleno de comentarios, cualquier cosa que no entiendas me avisas y si puedo lo explico, porque hay cosas que ni yo estoy seguro de por qué están así  smiley-razz

Está en el archivo adjunto

* Aleatorio.ino (9.22 KB - downloaded 19 times.)
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

Probado en el serial y va genial. aunque al poner los leds en los pines del 8 al 12 no encendian... vale ... me he quedado calvo y no he escrito ningun codigo, pero no es que sea newie...es que soy muy torpe y me esta costando entenderlo. Una pista porfa.
 La electronica ya se me da mejor. He construido unos reles activados por arduino a traves de transistores bc547 lo que evita que los pines de salida superen los 20mA mueven unos reles de 5 v y llevan un diodo 4007 pra evitar la corriente de rebote de las bobinas de los reles. Funcionan bien. Pero si, estimado amigo American 2020 soy un torpe de la informatica. asi que una pista de como prenderlos seria de muchisima ayuda... y mas teniendo en cuenta que te has molestado en escribir todo ese codigo.
Gracias como siempre
Rafa y chispillas
Logged

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

Ahhh bueno, si se te da mejor la electrónica, entonces ya te pediré consejos con un Cubo de Leds que armé, y en dónde uso algunos transistores Todo funciona, pero se que quizás podría hacer algo mejor.

Volviendo al código, no se encienden leds, porque nunca escribí los digitalWrite.... HIGH o LOW simplemente puse las salidas Serial.

Simplemente sería agregar esas lineas. Hacia el final del código dónde dice:

Code:
  // ACA EL CODIGO PARA ENCENDER ESTA ATRACCION
 
  // LLENAR en este y en los demás casos.

habría que poner

Code:
digitalWrite(pinAtraccUNO, HIGH);

Y así en las 5. Y para apagarlas, abajo de donde dice

Code:
//Vemos que atracciones están ON para ver cuando es hora de apagarlas

...
...

//CODIGO QUE APAGA LA ATRACCION

Ahí pondríamos

Code:
digitalWrite(pinAtraccUNO, LOW);

En el adjunto te dejo el código con esas modificaciones. Acordate que ya luego de los testeos y ver que todo funciona, todas las salidas por el Serial podrían sacarse ya que no serían necesarias, podrías o borrarlas o dejarles un // delante de cada una para que queden como comentarios.

* Aleatorio.ino (9.5 KB - downloaded 15 times.)
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

 Te voy a tratar de amigo o de benefactor... Estimado amigo American 2020 te agradezco cada uno de tus post que me estan llevando a montar una ciudad en mi tren miniatura. Te quiero comentar que para poder manejar 64 leds de una manera bastante comoda existe un chip llamado Max 7219 que maneja matrices de 8x8. Ademas de tener la posibilidad de poder ponerlos en serie. Hay una cosa que se ha de tener en cuenta con ese chip. Si mantienes encendidos muchos leds continuamente el chip llega a quemarse. Pero hacer efectos en los que van brillando de manera alternativa es su funcion. Tienes informacion para hacer la circuiteria para este chip en el siguiente post.
http://www.wayoda.org/arduino/ledcontrol/index.html tambien en:
http://playground.arduino.cc/Main/LEDMatrix. Con la libreria correspondiente para trabajar con el.
http://playground.arduino.cc/LEDMatrix/Max7219
http://modelrail.otenko.com/arduino/controlling-lots-of-leds-with-your-arduino
 Este ultimo es el que yo he montado. Espero que por primera vez te haya ayudado yo. Tambien te puedo decir donde conseguir ese chip. Yo he encontrado una tienda en polonia que lo tiene por unos 4,5€ eso serian aproximadamente unos 6 $ usa.
Si en algo mas puedo ayudarte, cuenta con nosotros.
Ficus y chispillas
Logged

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

Querido amigo American 2020. he probado el programa nuevo y no consigo que los leds funcionen. Solo se ha encendido debilmente el de la pin 11.
 Gracias amigo
Logged

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

vuelvo a intentarlo, veo si estan bien puestos los leds ... salidas de la 12 a la 8 .... pesta a ground... pero no... y sin embargo en el serial en teoria funciona genial... Cachis
Rafa y Chispillas
Logged

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

Hola, perdón que no respondí antes, estuve sin internet un par de días smiley-razz

Si, me pasó lo mismo, me había olvidado de poner a los pines como "OUTPUT" sino me pasaba como dices, encendían pero muy débiles.

Te paso el código con esas correcciones, y otra corrección de un error que había, que si se prendía una atracción que ya estaba encendida, el código pensaba que habían 2 ON cuando en realidad era sólo 1. También había un error en cómo se apagaban las atracciones, estaba fallando un poco como había escrito los IF y los ELSE IF

Te paso el código, este ya lo probé con los leds y todo y ahora al parecer va perfecto.

Va como adjunto. Recuerda el día que lo implementes que deberían removerse todas las salidas Serial, para no hacer más lento el loop, cuando ya no monitoriemos nada.


* Aleatorio.ino (11.74 KB - downloaded 15 times.)
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

leido y comprobado. Funcionaaaaaaaaa. Vuelvo a agradecerte todo el esfuerzo y codigo que me has pasado. Te dejo otra pagina en el que hay diferentes esquemas electronicos para arduino. De esta pagina he sacado los relés de control y varias cosillas más. Repito las gracias a American 2020 por toda tu ayuda.
http://txapuzas.blogspot.com.es/
 Ficus y Chispillas
Logged

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

Buenísimo ese blog, tiene muchas cosas muy interesantes.
Logged

My 3x3x3 Led Cube

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

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

¡Hola a todos!

Tengo una dudilla con un código muy parecido al de este tema y que también uso para manejar leds con IR. El código es el siguiente:

Code:
#include <NECIRrcv.h>
#define IRpin 4

long power = 0xBA45FF00;
long num1 =  0xF30CFF00;
long num2 =  0xE718FF00;
long num3 =  0xA15EFF00;
long num4 =  0xF708FF00;

  int pin8=-1;
  int pin9=-1;
  int pin10=-1;


NECIRrcv ir(IRpin);

void setup(){
ir.begin();
Serial.begin(9600);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
}

void loop(){
  int i;
unsigned long ircode;
while (ir.available()){
ircode=ir.read();
 if (ircode == power) //Si el boton de power... apagamos el led
     {
       digitalWrite(8, LOW);
       digitalWrite(9, LOW);
       digitalWrite(10, LOW);
     }
 if (ircode == num1) {
pin8=-1*pin8;
     if(pin8==1){
     digitalWrite(8,HIGH);}
     else if (pin8==-1) digitalWrite(8,LOW);
   }
     
 if (ircode == num2) {
pin9=-1*pin9;
     if(pin9==1){
     digitalWrite(9,HIGH);}
     else if (pin9==-1) digitalWrite(9,LOW);
   }

 if (ircode == num3) {
pin10=-1*pin10;
     if(pin10==1){
     digitalWrite(10,HIGH);}
     else if (pin10==-1) digitalWrite(10,LOW);
   }
 
 if (ircode == num4)
     for(i=8;i<=10;i++){digitalWrite(i,HIGH);}
  }
  ircode=0;
}



El asunto es que tal como está funciona perfectamente, pero si quito la línea de inicialización de la comunicación en serie dejan de funcionarme los tres bucles "if" del medio (los de num1, num2 y num3), aunque el primero y el último siguen funcionando.

¿Por qué es necesaria la línea Serial.begin(9600); si no lo utilizo para nada después?

¡Gracias y un saludo!
Logged

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

He visto tu código, y la verdad que no se a que se debería.

Prueba usar el código, de la forma que vimos que era la más "efectiva" en este post, de escribir el estado del pin, invirtiendo la lectura actual que este devuelva.

¿El método que usas de -1 y luego -1*pinX te está dando resultados?

Creo interpretar que funciona al hacer -1*-1 (que sería en el caso de estar apagado previamente, entonces te devuelve 1, en consecuencia lo prendes.

Logged

My 3x3x3 Led Cube

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

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si, lo de -1*pinX me funciona bien y hace justo lo que dices.

Un saludo

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola chicos ya que veo este hilo tan activo aprovecho para recibir ayuda.yo tengo arduino uno.y el problema viene cuando cargo las librerias que uais.me da error en compilacion:        NECIRrcv ir(IRpin); aqui dice que no sabe quien es.No subo bien las librerias o soy mas novato de lo que pensaba.Estoy liado con un robot para los chavales y funciona autonomo  y por cable,pero ahora quiero probar con un mando para mas posibilidades.....estoy con las fotos y el video.PD gracias.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bueno despues de mucho "rastreator" encontre un codigo que no me da errores de compilacion,lo probe y funcionaaaaa.Pero era demasiado para encender un led e ir probando,asi que lo he reducido por vosotros,pa quien le sirva.



#include <IRremote.h>

int led1 = 7;
unsigned long command = 0;
int RECV_PIN = 9;

IRrecv irrecv(RECV_PIN);

decode_results results;

// the setup routine runs once when you press reset:
void setup()  {
  Serial.begin(9600);
  irrecv.enableIRIn();
  // declare pin 5, 6, 7 to be an output:
  for(int i=0;i<3;i++){
    pinMode(led1, OUTPUT);
  }
}
void loop()  {   
  if (irrecv.decode(&results)) {

    if(results.value!=0xFFFFFFFF)
      command = results.value;

    Serial.println(command, HEX);

    irrecv.resume(); // Receive the next value
  }

  switch(command){

  case 0x9A491E3:
  digitalWrite(led1, HIGH);
    break;

  case 0x989D243A:
   digitalWrite(led1, LOW);
    break;

  default:
    break;
  }
}
 
 
Logged

Pages: 1 [2]   Go Up
Jump to: