Problema con botonera

hola a todos, consulta para activar un relar siempre y cuando se active un botón previo

const int boton1=2; 
const int boton2=3;

const int relA=6;
const int relB=7;
const int relC=8;

void setup() {
  pinMode(2, INPUT);
  pinMode(3, INPUT);
   
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
}
void loop(){
//boton 1
   if (digitalRead(2)== HIGH){digitalWrite(6, HIGH);}
   else {digitalWrite(6, LOW);}

   //aca no me sale bien el codigo quisiera que se active el relay (relB) al mantener presionado el boton3

   {if (digitalRead(2&&3)== HIGH){digitalWrite(7, HIGH);}
   else {digitalWrite(7, LOW);}
   }}

Primero, edita tu post (no hagas otro nuevo) y presenta el código correctamente. Seleccion todo el código y pulsa </> en la barra del editor.

Al margen de que tu código está lleno de errores,

if(digitalRead(2&&3) == HIGH)

no es algo permitido por el lenguaje, estarías leyendo un número de pin que fuera resultado de un and lógico entre dos números. :roll_eyes:

Debes hacer 2 comparaciones

if(digitalRead(2) == HIGH && digitalRead(3) == HIGH)

Pero tienes más errores, luego que presentes bien el código te los indico.

Saludos

corregido, la parte del error lo deje asi por que no sabia que variable poner. en si lo que quiero lograr con el codigo es:
al presionar el boton1 active el relA y el relB a la vez, suelto el boton1 se desactiva todo. pero al mantener presionado el boton2 luego presiono el boton1 se activara el relA y el relC (ya no el relB).
agradeceria su ayuda. :smiley:

Te corrijo el código, ojo con las llaves, no van en cualquier lado

const int boton1=2; 
const int boton2=3;

const int relA=6;
const int relB=7;
const int relC=8;

void setup() {
// si asocias pines a constantes úsalas!
// así se entiende mejor

  pinMode(boton1, INPUT);
  pinMode(boton2, INPUT);
  pinMode(relA, OUTPUT);
  pinMode(relB, OUTPUT);
  pinMode(relC, OUTPUT);
}
void loop(){
//boton 1
   if(digitalRead(boton1) == HIGH) {
     digitalWrite(relA, HIGH);
   }
   else {
     digitalWrite(relA, LOW);
   }

   //aca no me sale bien el codigo quisiera que se active el relay (relB) al mantener presionado el boton3

   if (digitalRead(boton1) == HIGH && digitalRead(boton2) == HIGH) {
     digitalWrite(relB, HIGH);
   }
   else {
     digitalWrite(relB, LOW);
   }
}

Obviamente esto no hace lo que quieres, solo lo corregí para que veas las diferencias.

Te pongo una solución muy básica

const int boton1 = 2; 
const int boton2 = 3;

const int relA = 6;
const int relB = 7;
const int relC = 8;

bool pulsado1 = false;
bool pulsado2 = false;

void setup() {
  pinMode(boton1, INPUT);
  pinMode(boton2, INPUT);
  pinMode(relA, OUTPUT);
  pinMode(relB, OUTPUT);
  pinMode(relC, OUTPUT);
}

void loop() {
//boton 1 solamente
   if(digitalRead(boton1) == HIGH && pulsado2 == false) {
     if(digitalRead(boton2) == LOW) {
       digitalWrite(relA, HIGH);
       digitalWrite(relB, HIGH); 
       pulsado1 = true;
     }
   }
   else {
     if(pulsado1 == true) {
       digitalWrite(relA, LOW);
       digitalWrite(relB, LOW);
       pulsado1 = false;
     }
   }
// boton1 y boton2 pulsados
   if (digitalRead(boton2) == HIGH && pulsado1 == false) {
     if(digitalRead(boton1) == HIGH) {
       digitalWrite(relA, HIGH);
       digitalWrite(relC, HIGH);
       pulsado2 = true;
     }
   }
   else if(digitalRead(boton2) == LOW) {
     if(digitalRead(boton1) == LOW) {
       digitalWrite(relA, LOW);
       digitalWrite(relC, LOW); 
       pulsado2 = false;
     }
   }
}

No tiene antirrebote ni nada parecido.

Te repito, el código es muy básico y muuuy mejorable, pero cumple (creo...).

Saludos

al subir el codigo me enciende automaticamente el relB
presiono en boton1 y no activa nada.
presiono el boton2 luego el boton1 se activa el relA relB relC, suelto el boton1 y se queda encendido el relC.
suelto el boton2 sique encendido el relC , presiono el boton1 se prenden los 3 rel A,B y C . suelto el boton1 y vuelve al inicio con el relB encendido.
no cumple el proposito.

Vamos por partes.

El código está probado y funciona como lo pediste.

Los pulsadores tienen que estar conectados entre el pin y 5V, con una resistencia entre el pin y masa.
Las salidas activan por HIGH.
Esto según se deduce de tu código original.
¿Y por qué deduje eso?
Porque la lógica indica que si quieres que algo actúe en determinada condición (en este caso botón pulsado) no vas a verificar la condición contraria (botón no pulsado).
Si leo en tu código que testeas un botón así
if (digitalRead(2)== HIGH)
y además las entradas están definidas como INPUT, entiendo que tus botones están conectados a 5V.

Si no lo tienes conectado así, invierte las comparaciones de los botones y los niveles de los relés. Eso puedes deducirlo solo.

Si los botones los tienes entre pin y masa sin una resistencia a 5V entonces desde el vamos tu código estaba mal porque las entradas deberían definirse INPUT_PULLUP.

Como "no cumple el propósito" (según tú), yo no soy el evaluado y el que sí tiene que cumplir el propósito eres tú... :wave:

Saludos

Una crítica constructiva, no lo tomes a mal : creo que deberías esforzarte un poco, no pedir que te hagan cada cosa.
Presentaste un código con errores, que @anon90500195 gentilmente te corrigió y explicó.
En el post#3 vuelves a pedir que te hagan algo.
Te da la solución y de nuevo llegamos al post#5 y una vez mas pones

suelto el boton2 sique encendido el relC , presiono el boton1 se prenden los 3 rel A,B y C . suelto el boton1 y vuelve al inicio con el relB encendido.
no cumple el proposito.

De este modo no vas a aprender jamás.

al subir el codigo me enciende automaticamente el relB presiono en boton1 y no activa nada.

Las salidas de relA,B y C al definirlas en el setup deben inicializarse a algun estado deseado.
digitalWrite(rel1A, HIGH); // hace que la salida del rel1a se apague porque habitualmente los reles funciona con lógica inversa. Los que compramos para Arduino. No todos, la gran mayoría.
Usa esta instrucción para establecer como debe estar relB
El resto del código por lo que veo debería funcionar.

Es verdad, me olvidé iniciar las salidas en bajo (según mi lógica), gracias @Surbyte

Saludos

Imagen

Este es el esquema e las entradas

Creo que las resistencias pull down de 220Ω que has puesto, son de un valor demasiado bajo. Consumen mucha corriente sin necesidad. Se debería de poner unas con un valor más alto, de al menos 10KΩ. De todas formas, te recomiendo que, si puedes, cambies la lógica de las entradas y utilices las resistencias pull up internas del Arduino. Así te ahorras poner resistencias y la elección de sus valores. Busca en internet cómo se activan las resistencias internas (INPUT_PULLUP), cómo se conectan los pulsadores y cómo se leen.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.