buona sera, sto aggiungendo al mio piccolo progettino la capacità di gestire suoni mediante pulsanti.
non sono ancora in grado di eseguire tale operazione premendo consecutivamente un solo pulsante per cambiare suono, ecco perchè per cambiare suoni, avendo una serie di 6 pulsanti a leve, li ho collegati sfruttando le pull-up interne. Inserendo un serial.println su ogni pulsante, ho potuto constatare(cosa che già avevo letto sul seguente forum) che le pull-up interne funzionano "al contrario"(risolto facendo funzionare al contrario le leve). Il vero problema è che non avviene il cambio di stato.
Mi potreste dare una mano? Grazie
#define knockSensor A1
#define pinPiezo 11
byte statoPiezo = LOW;
byte sensorestato = LOW;
byte sensStat = 0;
unsigned long sensTime;
byte soundStat = 0;
unsigned long soundTime;
const int threshold = 5;
byte sensorReading = 0;
int pulsante1 = 4;
int pulsante2 = 5;
int pulsante3 = 6;
int pulsante4 = 7;
int pulsante5 = 8;
int pulsante6 = 9;
//-----------------------------------------------------------------------------
void setup()
{
delay(1000);
Serial.begin(9600);
Serial.println("avvio programma");
pinMode(pinPiezo, OUTPUT);
pinMode(pulsante1, INPUT_PULLUP);
pinMode(pulsante2, INPUT_PULLUP);
pinMode(pulsante3, INPUT_PULLUP);
pinMode(pulsante4, INPUT_PULLUP);
pinMode(pulsante5, INPUT_PULLUP);
pinMode(pulsante6, INPUT_PULLUP);
}
//-----------------------------------------------------------------------------
void loop()
{
gestKnock();
gestSens();
gestSound();
}
//-----------------------------------------------------------------------------
void gestKnock()
{ sensorReading = analogRead(knockSensor);
// Serial.println(sensorReading);interrotto per visualizzare stato pulsanti
if (sensorReading >= threshold) {
sensorestato = HIGH;
}else { sensorestato = LOW;
}
}
void gestSens()
{
byte sens = digitalRead(sensorestato);
switch (sensStat)
{
case 0: // attende sensore HIGH
if (sens)
{
sensTime = millis(); // memorizza tempo attuale
sensStat = 1; // passa a stato 1
}
break;
case 1: // conteggio 5 sec, torna a stato zero se sens LOW
if (!sens)
sensStat = 0;
else if (millis() - sensTime >= 5000) // se timeout 5 secondi
{
statoPiezo = HIGH;
Serial.println("Stato high");
sensStat = 3;
}
break;
case 3: // attende sensore LOW, poi torna a stato zero
if (!sens)
{
statoPiezo = LOW;
Serial.println("Stato low");
sensStat = 0;
}
}
}
//-----------------------------------------------------------------------------
void gestSound()
{
switch (soundStat)
{
case 0://traccia
if (statoPiezo) { soundStat = 3; break; }
{int buttonState1 = digitalRead(pulsante1);
Serial.println(buttonState1);
int buttonState2 = digitalRead(pulsante2);
Serial.println(buttonState2);
int buttonState3 = digitalRead(pulsante3);
Serial.println(buttonState3);
{if (buttonState1 == LOW){
tone(pinPiezo, 1397, 600);
delay(600);
tone(pinPiezo, 1175, 600);}}
{if (buttonState2 == LOW){
tone(pinPiezo,1047,50);
delay(50);
tone(pinPiezo,1245,50);
delay(50);
tone(pinPiezo,1047,50);
delay(50);
tone(pinPiezo,1245,50);
delay(50);
tone(pinPiezo,1047,50);
delay(50);
tone(pinPiezo,1245,50);
delay(50);
tone(pinPiezo,1047,50);
delay(50);
tone(pinPiezo,1245,50);
delay(50);
tone(pinPiezo,1047,50);
delay(50);}}
{if (buttonState3 == LOW){
tone(pinPiezo, 987.8, 300);
delay(300);
tone(pinPiezo, 1140, 600);}}}
soundTime = millis();
soundStat = 2;
break;
case 2:
if (statoPiezo) { soundStat = 3; break; }
if (millis() - soundTime >= 18000) soundStat = 0;//tempo traccia
break;
case 3:
if (!statoPiezo) { soundStat = 0; break; }
{int buttonState1 = digitalRead(pulsante1);
Serial.println(buttonState1);
int buttonState2 = digitalRead(pulsante2);
Serial.println(buttonState2);
int buttonState3 = digitalRead(pulsante3);
Serial.println(buttonState3);
{if (buttonState1 == LOW){
tone(pinPiezo, 1397, 600);
delay(600);
tone(pinPiezo, 1175, 600);}}
{if (buttonState2 == LOW){
tone(pinPiezo,1047,50);
delay(50);
tone(pinPiezo,1245,50);
delay(50);
tone(pinPiezo,1047,50);
delay(50);
tone(pinPiezo,1245,50);
delay(50);
tone(pinPiezo,1047,50);
delay(50);
tone(pinPiezo,1245,50);
delay(50);
tone(pinPiezo,1047,50);
delay(50);
tone(pinPiezo,1245,50);
delay(50);
tone(pinPiezo,1047,50);
delay(50);}}
{if (buttonState3 == LOW){
tone(pinPiezo, 987.8, 300);
delay(300);
tone(pinPiezo, 1140, 600);}}}
soundTime = millis();
soundStat = 5;
break;
case 5:
if (!statoPiezo) { soundStat = 0; break; }
if (millis() - soundTime >= 3000) soundStat = 3;//tempo ferma
}
}