Encender y apagar leds con el mando a distancia.

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

     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 :stuck_out_tongue: 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 :stuck_out_tongue:

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

:slight_smile: 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.

American2020:
:slight_smile: 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?)

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

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 :stuck_out_tongue:

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

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 :stuck_out_tongue: 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

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.

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.

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 :slight_smile:

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

ficusrex:
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 :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.

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");
}

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

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í :stuck_out_tongue:

Está en el archivo adjunto

Aleatorio.ino (9.22 KB)

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

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:

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

habría que poner

digitalWrite(pinAtraccUNO, HIGH);

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

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

...
...

//CODIGO QUE APAGA LA ATRACCION

Ahí pondríamos

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)

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.
LedControl tambien en:
Arduino Playground - LEDMatrix. Con la libreria correspondiente para trabajar con el.
Arduino Playground - 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

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

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

Hola, perdón que no respondí antes, estuve sin internet un par de días :stuck_out_tongue:

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.7 KB)

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.

Ficus y Chispillas

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

¡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:

#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!

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.