Activar un piezo pulsando botones

Buenas! Alguien me puede ayudar con un problema de programación debido a mi falta de conocimientos?

He montado 4 botones y un piezoelectrico, con la intención de que al pulsar los 4 botones SIMULTANEAMENTE, se active el piezo emitiendo un tono de 5 notas y luego se detenga. El tono solo debería sonar si se mantienen pulsados los 4 botones a la vez, y de ninguna otra forma. Lo he montado del siguiente modo (los leds son puramente decorativos):

y este es el sketch:

#include "pitches.h"

//MELODIA A TOCAR:

int melody[] = {
  NOTE_C3, NOTE_DS3, NOTE_G3, NOTE_A3, NOTE_C4
};

//VELOCIDAD NOTAS

int noteDurations[] = {
  2, 2, 2, 2, 2,
};

int buttonPin1 = 2;
int buttonPin2 = 3;
int buttonPin3 = 4;
int buttonPin4 = 5;

int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;

void setup() {

  //DEFINO PINS COMO ENTRADA

  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin3, INPUT);
  pinMode(buttonPin4, INPUT);
}

void loop() {

  buttonState1 = digitalRead(buttonPin1);
  buttonState2 = digitalRead(buttonPin2);
  buttonState3 = digitalRead(buttonPin3);
  buttonState4 = digitalRead(buttonPin4);
  
  if (buttonState1 && buttonState2 && buttonState3 && buttonState4 == LOW) {

    //ACTIVAR MELODIA:

    for (int thisNote = 0; thisNote < 5; thisNote++) {

      int noteDuration = 1000 / noteDurations[thisNote];
      tone(8, melody[thisNote], noteDuration);

      int pauseBetweenNotes = noteDuration * 1.30;
      delay(pauseBetweenNotes);

      noTone(8);
    }
  }
}

Imagino que el fallo está en la función IF, creo que la condición con los “&&” no es correcta… pero no se de que otra forma se podría hacer. Tal y como está ahora, si pulso botones simultáneamente no ocurre nada pero si pulso el boton 4 al final, tenga o no pulsados otros botones la melodía sí suena. Al pulsar solamente el botón 4 la melodía también suena, pero al pulsar los botones 1, 2 o 3 no ocurre nada…

¿Alguna idea? :confused:

Gracias!

No se te ocurrió pensar que los botones/pulsadores estan mal conectados?
Veo un esquema donde mezclas pulsador y led con resistencia. De donde sacaste ese esquema?
Luego los pulsadores que muestras tienen una forma de conectarse, si los pones mal ocurre que el led estará siempre prendido.
Puedes asegurar que los 4 pulsadores al presionarse encienden los leds?
Si lo hacen al menos eso esta bien, pero no se para que pusiste leds en los pulsadores.

La conexion de un pulsador o botón es asi.


Tu tienes la conexión de arriba, pero en lugar de usar una R de 10k usas una menor para encender el led, lo que esta mal.
Cambia a 10k y luego nos dices si ahora funciona.
Revisa pulsador por pulsador asegurándote que trabaje.
Copia el código y muestra solo cada pulsador y cuando estes seguro, vuelve a este programa.

Hola surbyte, gracias por tu respuesta.

El esquema que ves lo he hecho yo con Fritzing. Los leds los he puesto como indicadores para saber si el pulsador esta pulsado o no. Claro que con este esquema de prueba ya sabes si estas pulsando o no, porque lo notas, pero todo esto tiene que ir montado en un panel con unos botones de silicona que no hacen "clic" y la única forma de saber si lo estas pulsando bien o no seria con el led que yo quiero poner.

He montado todo el esquema y los leds se encienden correctamente cuando pulso los botones. Lo único que no consigo es que suene el tono al presionar los 4 pulsadores a la vez. Cambiando por resistencias de 10k debería funcionar? Uso resistencias de 150ohms porque para leds blancos conectados a 5V y con 20mA es suficiente, no? o está mal? Si es así mañana lo intentaré y te digo.

Gracias!

No me comprendes. Los botones deben ir con R de 10k. Los leds montalos en otro pin y si el boton se presiona, lo primero que haces es accionar el led pero no simultáneo porque algo no va a funcionar y en tu caso no funciona el botón.

Como suponías el error esta en : (buttonState1 && buttonState2 && buttonState3 && buttonState4 == LOW) Es decir si los tres primeros botones están en alto y el ultimo en bajo se cumple.

La expresión correcta a evaluar es:

(buttonState1==LOW && buttonState2==LOW && buttonState3==LOW && buttonState4 == LOW)


Buen consejo de TFT pero conecta asi los botones

Surbyte, me parece que estás errado, el diagrama que pusiste no funcionaria. El pin 4 siempre estaría en bajo. El pulsador es simple, tiene dos pares de patas que siempre están conectadas, no son dos contactos independientes.

Ok.

PeterKantTropus: Como suponías el error esta en : (buttonState1 && buttonState2 && buttonState3 && buttonState4 == LOW) Es decir si los tres primeros botones están en alto y el ultimo en bajo se cumple.

La expresión correcta a evaluar es:

(buttonState1==LOW && buttonState2==LOW && buttonState3==LOW && buttonState4 == LOW)

Mil gracias! con esta modificación funciona perfectamente!