Llevo más de una hora tratando de resolver el error de mi código pero sigo sin poder resolverlo si alguien me puede ayudar se lo agradecería mucho
boolean x = false;
//SE CONFIGURA SALIDA RELE Y ENTRADA PUSH
int rele1 = 2;
int rele2 = 4;
int rele3 = 6;
int rele4 = 8;
int pushBoton1 = 3;
int pushBoton2 = 5;
int pushBoton3 = 7;
int pushBoton4 = 9;
void setup() {
pinMode(2, OUTPUT);
pinMode(3, INPUT);
Serial.begin(9600);
pinMode(4, OUTPUT);
pinMode(5, INPUT);
Serial.begin(9600);
pinMode(6, OUTPUT);
pinMode(7, INPUT);
Serial.begin(9600);
pinMode(8, OUTPUT);
pinMode(9, INPUT);
Serial.begin(9600);
}
void loop() {
int valor = digitalRead(3); //SE LEE VALOR DE PUSH 0/1
Serial.print("Push:"); //SE IMPRIME VALOR DE PUSH
Serial.println(valor);
delay(1);
//SI EL VALOR ES 1 SE CAMBIA VARIABLE BOOLEANA
if (valor == 1) {
x = !x;
}
//SI ES TRUE SE PRENDE FOCO
//SI ES FLASE SE APAGA FOCO
if (x) {
digitalWrite(2, HIGH);
} else {
digitalWrite(2, LOW);
}
delay(200); //RETARDO
}
{
int valor = digitalRead(5); //SE LEE VALOR DE PUSH 0/1
Serial.print("Push:"); //SE IMPRIME VALOR DE PUSH
Serial.println(valor);
delay(1);
//SI EL VALOR ES 1 SE CAMBIA VARIABLE BOOLEANA
if (valor == 1)
;
{
x = !x;
}
//SI ES TRUE SE PRENDE FOCO
//SI ES FLASE SE APAGA FOCO
if (x) {
digitalWrite(4, HIGH);
} else {
digitalWrite(4, LOW);
}
}
{
int valor = digitalRead(7); //SE LEE VALOR DE PUSH 0/1
Serial.print("Push:"); //SE IMPRIME VALOR DE PUSH
Serial.println(valor);
delay(1);
//SI EL VALOR ES 1 SE CAMBIA VARIABLE BOOLEANA
if (valor == 1)
;
{
x = !x;
}
//SI ES TRUE SE PRENDE FOCO
//SI ES FLASE SE APAGA FOCO
if (x) {
digitalWrite(6, HIGH);
} else {
digitalWrite(6, LOW);
}
}
{
int valor = digitalRead(9); //SE LEE VALOR DE PUSH 0/1
Serial.print("Push:"); //SE IMPRIME VALOR DE PUSH
Serial.println(valor);
delay(1);
//SI EL VALOR ES 1 SE CAMBIA VARIABLE BOOLEANA
if (valor == 1)
;
{
x = !x;
}
//SI ES TRUE SE PRENDE FOCO
//SI ES FLASE SE APAGA FOCO
if (x) {
digitalWrite(8, HIGH);
} else {
digitalWrite(8, LOW);
}
}
Bienvenido al foro. Muy bien por publicar tu código correctamente. Así es mucho más fácil revisarlo. Faltga que nos digas qué debe hacer tu programa y qué tipo de placa estás usando.
Tienes un "}" de más en la línea 44. Bórralo de aquí y agrega uno al final del programa para tener contento al compilador.
Este punto y coma hace que la instrucción entre llaves siempre se ejecute. Seguramente está de más.
Hay otros cambios que yo sugeriría, pero por lo pronto cambia esto y coméntanos los resultados.
Hola @braya281 ,
varios observaciones en tu código pero nada grave solo enredo y problema de tiempo de reacción a los botones de parte del procesador.
prueba eso...
boolean x = false;
//SE CONFIGURA SALIDA RELE Y ENTRADA PUSH
int rele1 = 2;
int rele2 = 4;
int rele3 = 6;
int rele4 = 8;
int pushBoton1 = 3;
int pushBoton2 = 5;
int pushBoton3 = 7;
int pushBoton4 = 9;
void setup() {
pinMode(rele1, OUTPUT);
pinMode(pushBoton1, INPUT);
pinMode(rele2, OUTPUT);
pinMode(pushBoton2, INPUT);
pinMode(rele3, OUTPUT);
pinMode(pushBoton3, INPUT);
pinMode(rele4, OUTPUT);
pinMode(pushBoton4, INPUT);
Serial.begin(9600);
}
void loop()
{
if(digitalRead(pushBoton1 && x==false)
{
x=true;
digitalWrite(rele1, HIGH);
Serial.println("Foco encendido ");
}
if(digitalRead(pushBoton1 && x==true)
{
x=false;
digitalWrite(rele1, LOW);
Serial.println("Foco apagado ");
}
delay(300); // depende cuanto tiempo quieres dejar apretado el boton
// sigue lo mismo con los otros focos...
}
tengo que agregar que el delay(300) debe estar solo una vez al final después de chequear los 4 botones y focos sino vas a tener un largo retraso al apretar los botones 2,3 y 4
unos consejos generales:
usa los nombres que defines con los variables
no enredes con variables como x y valor, se puede hacer solo con una que es x
importante: cuando apretas un boton el procesador lo lee unos miles veces en el loop si no tienes un freno como el delay(300)
el inicio del Serial necesitas una sola vez "Serial.begin(9600)"
Mi código debe activar el relevador con una sola pulsación y desactivarlo con otra pulsación del mismo push botton y que realice el mismo proceso con cada uno de los relevadores con un push botton independiente para cada uno y estoy usando una placa de Arduino uno muchas gracias por la ayuda
esta operación consulta si el boton 1 está apretado y al mismo tiempo la variable x tiene el estado "0", "falso" o digital "LOW". Con esta operación y la otra opuesta con x="1", "verdadero" o digital "HIGH" puedo encender y apagar el foco con un solo boton.
De hecho falta un parentesis. correcto será: if (digitalRead(pushBoton1) && x==false)
Hay que corregir las expresiones de los if. Y todavía no sabemos como están conectados los relevadores y los botones: publica el diagrama de conexiones.
Considera lo siguiente:
Si al ejecutar el primer if la variable x es false y estás oprimiendo el botón, el relevador se activa y x ahora es true.
Menos de 1 milisegundo después, se ejecuta el segundo if. Seguramente en este momento el botón está todavía oprimido y como ahora x es true, ahora el relevador se desactiva y x vuelve a ser false.
Es decir, que el relevador se activó solamente durante una pequeña fracción de segundo.
O sea que esto no te va a funcionar. Intenta un enfoque de maquina de estados. Hay mucha información sobre esto en el foro y en Internet.
Aquí hay un tutorial sobre el tema, en inglés, que de hecho resuelve tu problema:
caballeros,
estamos hablando de cuatro botones independientes que se van a chequear en el loop. Claro que se van a usar cuatro variables como "x" que pueden ser x1, x2, x3 y x4 para salvar cada estado de los rele1 a 4. El ejemplo que presenté es para un boton, pensé que pueden copiar y adaptar lo mismo para los otros botones.
Lo que pasa, no importa si el boton1 está apretado todavía cuando chequea el boton2 o 3 o 4. Al final se pone el delay(300) o un poco mas para bloquear el chequeo multiple