Unit 16 – One-Button-Piano
Do you want to build a real musical instrument? Then let’s go!
Now, we will create a piano with only one button. The piano should always play a tone when the button is pressed. If it is released the tone should mute.
int speakerPin = 9; int buttonPin = 11; void setup() { pinMode(buttonPin, INPUT); } void loop() { if (digitalRead(buttonPin)==HIGH){ tone(speakerPin, 440); } else { noTone(speakerPin); } }
But how can we play a melody with it? In the last unit we almost had a solution. Do you remember? We used the for-loop to play sounds out of an array. What if the button would do the counting, not the for-loop? But we need to use a trick to do it. It is not enough to ask:
if (digitalRead(buttonPin)==HIGH){ ton = ton + 1; }
If we would do that, the if statement would be true as long as the button is pressed. It would count much to fast. So we need a construction to detect if the button is pressed and just count up by one.
Boolean
Variables of the boolean type only know two conditions: true and false. If we would have a variable named buttonPressed, it could store the current state of the button.
- With the programming start the button is not pressed. The variable buttonPressed is set to false.
- Now, we don’t just ask if digitalRead(buttonPin) == HIGH, but even if buttonPressed == false. This can be done with the double et-character (&&).
- If both conditions are true, buttonPressed is set to true.
- If the button is not pressed, buttonPressed is set to false.
Our program looks like that:
boolean buttonPressed = false; int speakerPin = 9; int buttonPin = 11; void setup() { pinMode(buttonPin, INPUT); } void loop() { if ((digitalRead(buttonPin)==HIGH)&&(buttonPressed==false)){ buttonPressed=true; } if (digitalRead(buttonPin)==LOW){ buttonPressed=false; } }
Great! Now we can use the counter variable, too. If it get’s to large, we have to reset it back to 0. This is done by the third if-statement:
int tonesTotal = 27; int theTone = 0; boolean buttonPressed = false; int speakerPin = 9; int buttonPin = 11; void setup() { pinMode(buttonPin, INPUT); } void loop() { if ((digitalRead(buttonPin)==HIGH)&&(buttonPressed==false)){ buttonPressed=true; theTone = theTone +1; } if (digitalRead(buttonPin)==LOW){ buttonPressed=false; } if (theTone>= tonesTotal){ ton=0; } }
Und nun brauchen wir nur noch die Tonausgabe hinzuzufügen:
int frequencies[] = { 262, 294, 330, 349, 392, 392, 440, 440, 440, 440, 392, 440, 440, 440, 440, 392, 349, 349, 349, 349, 330, 330, 392, 392, 392, 392, 262}; int tonesTotal = 27; int theTone = 0; boolean buttonPressed = false; int speakerPin = 9; int buttonPin = 11; void setup() { pinMode(buttonPin, INPUT); } void loop() { if ((digitalRead(buttonPin)==HIGH)&&(buttonPressed==false)){ buttonPressed=true; tone(speakerPin, frequencies[theTone]); theTone = theTone +1; } if (digitalRead(buttonPin)==LOW){ buttonPressed=false; noTone(speakerPin); } if (theTone >= tonesTotal){ theTone = 0; } }