Tres pulsadores y un led

Hola a todos, necesito un poco de ayuda.

El programa consiste en que tenemos tres pulsadores y un led. El led se enciende si y solo si hay dos pulsadores pulsados. Es decir, si hay uno o tres, el led permanece apagado.

Os dejo el programa que tengo. De esta forma me "medio funciona". Cuando pulso un pulsador se medio enciende el led, cuando pulso dos se enciende y cuando pulso tres se apaga.

Gracias de antemano.

/*
Suponer que tenemos una lámpara que queremos encender o apagar desde tres puntos.
Realizar un programa que la encienda si y solo si hay dos interruptores activados.

Tenemos 3 interruptores en RB0, RB1 y RB2.
La lámpara se encuentra en RB3.
*/

// configuro los números de los pines. Como son valores que no van a cambiar utilizo el const int

const int pulsador1 = 2; //introduzco una variable para identificar cada uno de los pulsadores
const int pulsador2 = 3;
const int pulsador3 = 4;
const int led = 12; // esta variable almacena el pin

// variables que sí van a cambiar.

int contador = 0; // variable for reading the pushbutton status

void setup() {

Serial.begin(9600);

// Declaro el led como salida
pinMode(led, OUTPUT);
// Declaro los pulsadores como entradas
pinMode(pulsador1, INPUT);
pinMode(pulsador2, INPUT);
pinMode(pulsador3, INPUT);
}

void loop() {

//con cada ciclo de reloj reseteamos el valor del contador.

contador = 1;

// comprobamos si los pulsadores están activados
// si es así, se incrementa en uno la variable contador.

if (digitalRead(pulsador1) == HIGH) {
// turn LED on:
contador ++;

}

if (digitalRead(pulsador2) == HIGH) {
// turn LED on:
contador ++;

}

if (digitalRead(pulsador3) == HIGH) {
// turn LED on:
contador ++;

}

//ahora, si la variable contador nos da 2, deduciremos que se han activado los dos interruptores
//condición indispensable para el funcionamiento del micro.

if (contador == 2){

digitalWrite(led, HIGH);

}
else {
// turn LED off:
digitalWrite(led, LOW);
}
Serial.print(contador);
}

Espero y no te molestes pero, no le veo ni pies ni cabeza a tu código, te estas confundiendo mucho amigo, vamos a empezar desde 0. Tambien te recomiendo leer las normas del foro para que veas como postear adecuadamente.

Veamos que quieres...

El programa consiste en que tenemos tres pulsadores y un led. El led se enciende si y solo si hay dos pulsadores pulsados. Es decir, si hay uno o tres, el led permanece apagado.

No veo mucho nivel de dificultad en lo que necesitas.

//////////// Pines y variables para los botones ///////////
const byte boton1 = 4;
const byte boton2 = 5;
const byte boton3 = 6;

int estado1, estado2, estado3;

///////////////////////////////////////////////

const byte led = 13;   //Uso el 13 porque es el pin que por default ya incluye un led.

void setup() {
  // put your setup code here, to run once:
  
  pinMode(boton1, INPUT);
  pinMode(boton2, INPUT);
  pinMode(boton3, INPUT);
  pinMode(led, OUTPUT);
  
}

void loop() {
  // put your main code here, to run repeatedly:
  estado1 = digitalRead(boton1);
  estado2 = digitalRead(boton2);
  estado3 = digitalRead(boton3);
  
  
 if(estado1 == HIGH){
 
  if(estado2 == HIGH){
   
   if (estado3 == LOW){
     
     digitalWrite(led, HIGH);
   }
  }
 }
 
 
 if(estado1 == HIGH){
 
  if(estado2 == LOW){
   
   if (estado3 == HIGH){
     
     digitalWrite(led, HIGH);
   }
  }
 }
 
 if(estado1 == LOW){
 
  if(estado2 == HIGH){
   
   if (estado3 == HIGH){
     
     digitalWrite(led, HIGH);
   }
  }
 }
  
  if(estado1 == HIGH){
 
  if(estado2 == HIGH){
   
   if (estado3 == HIGH){
     
     digitalWrite(led, LOW);
   }
  }
 }
  
  delay(30);
}

Tal vez algunos lo consideren un poco rustico pero funciona xD

El circuito va por tu cuenta.

Suerte.

Creo que te complicas muchísimo la vida. Es mucho más fácil de hacer. Se me ocurren 2 formas de hacerlo, una larga y una más corta, pero más complicada de entender.

Primero, y común a ambas formas, guardaría los valores de los pulsadores en 3 variables, que yo las llamaré:

int val1;
int val2;
int val3;

Por cierto, esto me recuerda que tienes un error de concepto ya que esto:

const int pulsador1 = 2;  //introduzco una variable para identificar cada uno de los pulsadores
const int pulsador2 = 3;
const int pulsador3 = 4;

no son variables, si no que son constantes.

La forma larga que se me ocurre, es hacer todos los if de todas las posibilidades posibles, es decir 8 if

Así pues sería del tipo:

 if (val1 == HIGH && val2 == HIGH && val3 == LOW) {
    digitalWrite(led, HIGH);
  }

Y así con todas las posibilidades, y cambiando el digitalWrite, dependiendo de si se tiene que encender o no. Básicamente, sería HIGH si dos de los val están a HIGH y uno en LOW y LOW si 2 de los val están en LOW y uno en HIGH, y si todos están en LOW.

La forma corta, sería usar un shift register y otra variable a la que yo llamo valt.

Si cogemos val1 y lo movemos 2 posiciones a la izquierda en binario, val2 lo movemos 1 posición y val3 lo dejamos tal cual, y los sumamos, tendremos un número en binario por cada combinación de pulsadores, de forma que solo tenemos que hacer un if y un else.

el if debe hacer un digitalWrite HIGH, si valt es igual a 3 (011), o a 5 (101) o a 6 (110). En el else ponemos el digitalWrite LOW, ya que si no se cumple ninguna de las condiciones anteriores, no debe encenderse el led.

Hola, Jenny_Gonzalo. Tu código me parece que está perfecto salvo porque el valor inicial de contador nada más entrar en el loop debería ser contador = 0 en lugar de contador=1.
Eso... y que deberías haber puesto tu código entre etiquetas code, tal que así:

const int pulsador1 = 2;     //introduzco una variable para identificar cada uno de los pulsadores
const int pulsador2 = 3;
const int pulsador3 = 4;
const int led =  12;      // esta variable almacena el pin

// variables que sí van a cambiar.

int contador = 0;         // variable for reading the pushbutton status

void setup() {
 
  Serial.begin(9600);
 
  // Declaro el led como salida
  pinMode(led, OUTPUT);
  // Declaro los pulsadores como entradas
  pinMode(pulsador1, INPUT);
  pinMode(pulsador2, INPUT);
  pinMode(pulsador3, INPUT);
}

void loop() {
   //con cada ciclo de reloj reseteamos el valor del contador.
  contador = 0;
  // comprobamos si los pulsadores están activados
  // si es así, se incrementa en uno la variable contador.
  if (digitalRead(pulsador1) == HIGH) {
    contador ++;
  }
  if (digitalRead(pulsador2) == HIGH) {
    contador ++;
  }
  if (digitalRead(pulsador3) == HIGH) {
    contador ++;
  }
 
  //ahora, si la variable contador nos da 2, deduciremos que se han activado los dos interruptores
  //condición indispensable para el funcionamiento del micro.
 
  if (contador == 2){
   
  digitalWrite(led, HIGH);
 
  }
  else {
    // turn LED off:
    digitalWrite(led, LOW);
  }
  Serial.print(contador);
}

Si con este código no te funciona correctamente, pon tu esquema de conexión, porque no veo a primera vista error.

Pues tienes toda la razón Noter, ni me había parado a pensar en el funcionamiento de su código, y es totalmente válido.

El problema que me surge es que al poner contador=0 dentro del loop, el led se me enciende cuando pulso un pulsador, y cuando pulso dos pulsadores se me apaga.

También he probado a sustituit contador++ por contador=contador+1 y sigue sin funcionar.

La idea de hacerlo con un contador es por si quieres añadir más pulsadores o si quieres cambiar las condiciones como que se encienda el led al pulsar tres pulsadores.

Aquí os dejo una imagen de la conexión: Dropbox - Error - Simplify your life

Mejor que te aconseje alguien que esté más ducho en electrónica, pero creo que el problema puede venir por la conexión de los interruptores.
¿Has puesto resistencias pulldown?
Echa un vistazo aquí, concretamente el esquema con título Pushbutton to 5V que es el que cambiaría de low a high al pulsar el botón. Justo antes verás otro llamado Pushbutton to GND que hace justo lo contrario, y tal vez sea similar a tu conexión actual, que al parecer funciona por lógica inversa (cuando tienes dos interruptores apagados)

Jenny_Gonzalo:
El problema que me surge es que al poner contador=0 dentro del loop, el led se me enciende cuando pulso un pulsador, y cuando pulso dos pulsadores se me apaga.

También he probado a sustituit contador++ por contador=contador+1 y sigue sin funcionar.

La idea de hacerlo con un contador es por si quieres añadir más pulsadores o si quieres cambiar las condiciones como que se encienda el led al pulsar tres pulsadores.

Aquí os dejo una imagen de la conexión: Dropbox - Error - Simplify your life

Haz probado el código que he puesto?