Hola a todos!.
Queria controlar la salida de varios relés independientemente unos de otros mediante Arduino pero no lo consigo.
Se activan a través de un emisor 433 Mhz que tiene cuatro pulsadores, que funciona por pulsaciones ( la salida se activa mientras el pulsador este ON).
Es para controlar unas luces, asi que cuando pulsas el relé se debe de quedar enclavado hasta que vuelvas a pulsar el botón.
He probado haciendo lo siguiente:
// VARIABLES:
int buttonA = 2;
int buttonB = 3;
int buttonC = 4;
int buttonD = 5;
int releuno = 6;
int reledos = 7;
int reletres = 8;
int relecuatro = 9;
int estado_ReleUno;
int estado_ReleDos;
int estado_ReleTres;
int estado_ReleCuatro;
void setup() {
// reles como salida:
pinMode(releuno, OUTPUT);
pinMode(reledos, OUTPUT);
pinMode(reletres, OUTPUT);
pinMode(relecuatro, OUTPUT);
// botones como entrada:
pinMode(buttonA, INPUT);
pinMode(buttonB, INPUT);
pinMode(buttonC, INPUT);
pinMode(buttonD, INPUT);
{
if(digitalRead(releuno)==HIGH)estado_ReleUno=1;
else(estado_ReleUno=2);
}
{
if(digitalRead(reledos)==HIGH)estado_ReleDos=1;
else(estado_ReleDos=2);
}
{
if(digitalRead(reletres)==HIGH)estado_ReleTres=1;
else(estado_ReleTres=2);
}
{
if(digitalRead(relecuatro)==HIGH)estado_ReleCuatro=1;
else(estado_ReleCuatro=2);
}
}
void loop(){
if(estado_ReleUno==1) estado1(1);
if(estado_ReleUno==2) estado2(1);
if(estado_ReleDos==1) estado1(2);
if(estado_ReleDos==2) estado2(2);
if(estado_ReleTres==1) estado1(3);
if(estado_ReleTres==2) estado2(3);
if(estado_ReleCuatro==1) estado1(4);
if(estado_ReleCuatro==2) estado2(4);
}
void estado1(int boton){
switch(boton)
{
case 1:
digitalWrite(releuno, LOW);
while(digitalRead(buttonA)==LOW){}
estado_ReleUno=2;
break;
case 2:
digitalWrite(reledos, LOW);
while(digitalRead(buttonB)==LOW){}
estado_ReleDos=2;
break;
case 3:
digitalWrite(reletres, LOW);
while(digitalRead(buttonC)==LOW){}
estado_ReleTres=2;
break;
case 4:
digitalWrite(relecuatro, LOW);
while(digitalRead(buttonD)==LOW){}
estado_ReleCuatro=2;
break;
default:
break;
}
delay(500);
}
void estado2(int boton){
switch(boton)
{
case 1:
digitalWrite(releuno, HIGH);
while(digitalRead(buttonA)==LOW){}
estado_ReleUno=1;
break;
case 2:
digitalWrite(reledos, HIGH);
while(digitalRead(buttonB)==LOW){}
estado_ReleDos=1;
break;
case 3:
digitalWrite(reletres, HIGH);
while(digitalRead(buttonC)==LOW){}
estado_ReleTres=1;
break;
case 4:
digitalWrite(relecuatro, HIGH);
while(digitalRead(buttonD)==LOW){}
estado_ReleCuatro=1;
break;
default:
break;
}
delay(500);
}
Pero me encuentro que al accionar un botón no avanza hacia las siguientes funciones, ya que se queda dentro de ese estado y deja de escuchar a los demás estados.
Hay alguna función o forma para poder hacer lo que quiero?.
Muchas gracias a todos.
Un saludo!
Hola a todos!, después de varios dias, mucha lectura y un poco de ayuda lo he conseguido.
Copio el código por si le sirve a alguien alguna vez.
La idea es controlar 4 salidas I/O mediante 4 entradas I/0
// Controlar 4 salidas a rele segun estado 4 entradas.
// http://israelcasado.com
// VARIABLES:
int buttonA = 2;
int buttonB = 3;
int buttonC = 4;
int buttonD = 5;
int releuno = 6;
int reledos = 7;
int reletres = 8;
int relecuatro = 9;
int estado_ReleUno;
int estado_ReleDos;
int estado_ReleTres;
int estado_ReleCuatro;
char evento_ReleUno;
char evento_ReleDos;
char evento_ReleTres;
char evento_ReleCuatro;
boolean inicio=true;
void setup() {
Serial.begin(9600);
// reles como salida:
pinMode(releuno, OUTPUT);
pinMode(reledos, OUTPUT);
pinMode(reletres, OUTPUT);
pinMode(relecuatro, OUTPUT);
// botones como entrada:
pinMode(buttonA, INPUT);
pinMode(buttonB, INPUT);
pinMode(buttonC, INPUT);
pinMode(buttonD, INPUT);
inicio=true;
{
if(digitalRead(releuno)==HIGH) evento_ReleUno='E';
else evento_ReleUno='A';
if(digitalRead(reledos)==HIGH) evento_ReleDos='E';
else evento_ReleDos='A';
if(digitalRead(reletres)==HIGH) evento_ReleTres='E';
else evento_ReleTres='A';
if(digitalRead(relecuatro)==HIGH) evento_ReleCuatro='E';
else evento_ReleCuatro='A';
}
}
void loop(){
if(!inicio)
{
comprobarEstado();
}
else
delay(5000);
//boton A
if(evento_ReleUno=='E') estadoEncender(1);
if(evento_ReleUno=='A') estadoApagar(1);
//boton B
if(evento_ReleDos=='E') estadoEncender(2);
if(evento_ReleDos=='A') estadoApagar(2);
//boton C
if(evento_ReleTres=='E') estadoEncender(3);
if(evento_ReleTres=='A') estadoApagar(3);
//boton D
if(evento_ReleCuatro=='E') estadoEncender(4);
if(evento_ReleCuatro=='A') estadoApagar(4);
inicio=false;
}
void comprobarEstado()
{
if(digitalRead(buttonA)==HIGH)
{
if(estado_ReleUno==1)
{
Serial.println("Salida 1 encendida");
evento_ReleUno='E';
}
else
{
Serial.println("Salida 1 apagada");
evento_ReleUno='A';
}
}
else
{
//ponemos el evento en StandBy pues no se ha producido cambio alguno
evento_ReleUno='S';
}
if(digitalRead(buttonB)==HIGH)
{
if(estado_ReleDos==1)
{
Serial.println("Salida 2 encendida");
evento_ReleDos='E';
}
else
{
Serial.println("Salida 2 apagada");
evento_ReleDos='A';
}
}
else
{
//ponemos el evento en StandBy pues no se ha producido cambio alguno
evento_ReleDos='S';
}
if(digitalRead(buttonC)==HIGH)
{
if(estado_ReleTres==1)
{
Serial.println("Salida 3 encendida");
evento_ReleTres='E';
}
else
{
Serial.println("Salida 3 apagada");
evento_ReleTres='A';
}
}
else
{
//ponemos el evento en StandBy pues no se ha producido cambio alguno
evento_ReleTres='S';
}
if(digitalRead(buttonD)==HIGH)
{
if(estado_ReleCuatro==1)
{
Serial.println("Salida 4 encendida");
evento_ReleCuatro='E';
}
else
{
Serial.println("Salida 4 apagada");
evento_ReleCuatro='A';
}
}
else
{
//ponemos el evento en StandBy pues no se ha producido cambio alguno
evento_ReleCuatro='S';
}
}
void estadoEncender(int boton){
//0 encendido
//1 apagado
switch(boton)
{
case 1:
digitalWrite(releuno, LOW);
estado_ReleUno=0;
break;
case 2:
digitalWrite(reledos, LOW);
estado_ReleDos=0;
break;
case 3:
digitalWrite(reletres, LOW);
estado_ReleTres=0;
break;
case 4:
digitalWrite(relecuatro, LOW);
estado_ReleCuatro=0;
break;
default:
break;
}
if(!inicio) delay(500);
}
void estadoApagar(int boton){
switch(boton)
{
case 1:
digitalWrite(releuno, HIGH);
estado_ReleUno=1;
break;
case 2:
digitalWrite(reledos, HIGH);
estado_ReleDos=1;
break;
case 3:
digitalWrite(reletres, HIGH);
estado_ReleTres=1;
break;
case 4:
digitalWrite(relecuatro, HIGH);
estado_ReleCuatro=1;
break;
default:
break;
}
if(!inicio) delay(500);
}
Nota: No soy programador, estoy aprendiendo en este mundillo, así que el código seguramente tendrá basura a rebosar y se podrá depurar infinitamente mejor.
Saludos compañeros!