Buttons and Switches on the Y-Board
There are 5 buttons, 4 switches, and 6 DIP switches we can use to control lights and sound on the Y-Board. There is also a switch for powering the board.
Functions
The function to determine if a button is pressed is:
Yboard.get_button(<button_number>);
And the function to determine if a switch is ON is:
Yboard.get_switch(<switch_number>);
Each of these functions returns true
if the button/switch is pressed or ON, and false
otherwise. <button_number>
or <switch_number>
should be the number of the button or switch whose position you want to check as an int
(eg. 1, 2, or 3).
What are Conditionals?
We use if statements to evaluate conditionals that are true
or false
:
if (Yboard.get_button(1)) {
Yboard.set_led_color(1, 255, 0, 0);
}
More Details
This block of code tells our board to turn on LED 1 if button 1 is pressed. The function Yboard.get_button()
can be used as a conditional because it returns a true
or false
value.
Notice that in an if statement the conditional is placed in parenthesis and the commands to execute if it is true are placed in curly braces.
Additionally, we can chain conditionals together using &&
or ||
. The &&
symbol is called a “logical AND”, and the ||
symbol is called “logical OR”. Here’s an example of using each:
if(Yboard.get_button(1) && Yboard.get_button(2)) {
Yboard.set_led_color(1, 255, 0, 0);
}
if(Yboard.get_switch(1) || Yboard.get_switch(2)) {
Yboard.set_led_color(1, 0, 0, 255);
}
More Details
The first if
statement tells the board “if button 1 AND button 2 are pressed, turn led 1 red”. The second if
statement tells the board “if switch 1 OR switch 2 is on, turn led 1 blue”.
There are several other important logical operators. For example, we can compare numbers or values using ==
. For example, if (1 == 3)...
will always be false
and if (1 < 3)...
will always be true
. On the other hand, if (Yboard.get_button(1) == true)...
will be true
if button 1 is pressed and false
if it is not. Because Yboard.get_button(1)
already tells us this without comparing it, the == true
part in this condition is not necessary.
If you want to learn about the other logical operators, google “cpp logical operators”.
Examples
We can use an else
block to make the board do something else when the if
block is false
:
while(true) {
if (Yboard.get_button(1)) {
Yboard.set_led_color(1, 255, 0, 0);
} else {
Yboard.set_led_color(1, 0, 0, 0);
}
}
Why The Infinite Loop?
If you copy one of the above examples into your program, and then try to upload it to your board and press the buttons, LED 1 won’t turn on! The reason why is that the if statement is run immediately when you upload your code and it is only run once. In order to get the board to continuously check the state of Button 1 and turn LED 1 on if it is pressed, we need to wrap our if
statement in a while
loop.
Let’s try combining more loops and if statements!
We could get the board to only check the state of our button for the first 10 seconds after we program it, and then light up LED 15 after those 10 seconds, like this:
for(int count = 0; count < 100; count++) {
if (Yboard.get_button(1)) {
Yboard.set_led_color(1, 255, 0, 0);
} else {
Yboard.set_led_color(1, 255, 0, 0);
}
delay(100);
}
Yboard.set_led_color(15, 255, 0, 0);
More Details
This code block only checks if Button 1 is pressed in 0.1 second increments for 10 seconds. 0.1 seconds is faster than the average person can press the button, so it will work just fine, and once the for
loop is done, you can continue writing your code as normal.
We can chain as many conditionals together as we want by using else if
blocks:
while (true) {
if (Yboard.get_button(1) && Yboard.get_button(2)) {
Yboard.set_led_color(1, 255, 0, 0);
} else if (Yboard.get_button(2) && Yboard.get_button(3)) {
Yboard.set_led_color(1, 255, 255, 0);
} else if (Yboard.get_button(1) && Yboard.get_button(3)) {
Yboard.set_led_color(1, 0, 255, 0);
} else {
Yboard.set_led_color(1, 0, 0, 0);
}
}
More Details
Chaining conditionals gives us a lot of freedom to make our code do exactly what we want it to. The above example turns LED1 red, yellow, or green depending on which two buttons we press.
Let’s try one final example using a switch instead of a button:
while (true) {
if(Yboard.get_switch(2)) {
while(Yboard.get_switch(2)) {
Yboard.set_led_color(1, 255, 0, 0);
}
} else {
while(Yboard.get_switch(2) == false) {
Yboard.set_led_color(1, 0, 0, 0);
}
}
}
More Details
Woah! That looks a little scary! We have if
statements inside of infinite loops, and more while
loops inside of them. However, this code does exactly the same thing as our first example with a while
loop above. If switch 2 on our board is ON, LED 1 will turn on. And if switch 2 is OFF, LED 2 will turn off.
There are a few important things to notice in this example:
- The second conditional checks if switch 2 is NOT on using
Yboard.get_switch(2) == false
- There is almost always more than one way to write code that works. Be creative, and try to find a solution that is simple, clear, and fast.
Exploration
Remember to change main.cpp
before continuing…
📝 NOTE: You will need to go to
main.cpp
and change the comments to call the correct activity function:// loop_activity(); conditionals_activity();
-
Reuse your code from the last module to make a single light circle around the board, but only if switch 1 is turned on.
-
Make the light circle around in the opposite direction if switch 2 is on but if both switches are on or off, do nothing.
Challenges
Remember to comment/uncomment the correct function calls…
Remember to comment out the conditionals_exploration();
call in the conditionals_activity
function and uncomment the correct challenge function:
conditionals_exploration();
// conditionals_challenge1();
// conditionals_challenge2();
Challenge 1: Make your board play a C note if button 1 is pressed, D note if button 2 is pressed, and E note if button 3 is pressed.
Hint
You can use a while
loop inside your if
statements to play the note for as long as you are holding the button. Use the same condition for both your if
statements and your nested while
loop. Set the duration on speaker_play_note
to something small like 20ms.
Challenge 2: Use &&
and ||
to chain conditions together so that if any one button is pressed LED 1 turns red, if any two are pressed, LED 1 turns yellow, and if all three are pressed LED 1 turns green. Can you make all of the lights do this instead of just LED 1?
Hint
Use a for
loop inside of your if
statements.