Firstly, in the 'setup' function, there are three new lines on the end:
void setup() { pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); updateShiftRegister(); Serial.begin(9600); while (! Serial); // Wait until Serial is ready - Leonardo Serial.println("Enter LED Number 0 to 7 or 'x' to clear"); }
The line beginning with 'while' ensures that there is something at the other end of the USB connection for the Arduino to talk to before it starts sending messages. Otherwise, the message might be sent, but not displayed. This line is actually only necessary if you are using an Arduino Leonardo, because the Arduino Uno automatically resets the Arduino board when you open the Serial Monitor, whereas this does not happen with the Leonardo.
The last of the new lines in 'setup' sends out the message that we see at the top of the serial monitor.
The 'loop' function is where all the action happens:
void loop() { if (Serial.available()) { char ch = Serial.read(); if (ch >= '0' && ch <= '7') { int led = ch - '0'; bitSet(leds, led); updateShiftRegister(); Serial.print("Turned on LED "); Serial.println(led); } if (ch == 'x') { leds = 0; updateShiftRegister(); Serial.println("Cleared"); } } }
Everything that happens inside the loop is contained within an 'if' statement. So unless the call to the built-in Arduino function 'Serial.available()' is 'true' then nothing else will happen.
Serial.available() will return 'true' if data has been sent to the Arduino and is there ready to be processed. Incoming messages are held in what is called a buffer and Serial.available() returns true if that buffer is Not empty.
If a message has been received, then its on to the next line of code:
char ch = Serial.read();
If you have followed the instructions in the prompt at the top of the Serial Monitor, then this character will either be a single digit number between 0 and 7 or the letter 'x'.
The 'if' statement on the next line checks to see if it is a single digit by seeing if 'ch' is greater than or equal to the character '0' and less than or equal to the character '7'. It looks a little strange comparing characters in this way, but is perfectly acceptable.
Each character is represented by a unique number, called its ASCII value. This means that when we compare characters using <= and >= it is actually the ASCII values that were being compared.
If the test passes, then we come to the next line:
int led = ch – '0';
Since that we know the number of the LED that we want to turn on, we just need to set that bit in the variable 'leds' and update the shift register.
bitSet(leds, led); updateShiftRegister();
Serial.print("Turned on LED "); Serial.println(led);
The number of the LED is held in an 'int' variable rather than being a text string. Serial.print can take either a text string enclosed in double-quotes, or an 'int' or for that matter pretty much any type of variable.
After the 'if' statement that handles the case, when a single digit has been handled, there is a second 'if' statement that checks to see if 'ch' is the letter 'x'.
if (ch == 'x') { leds = 0; updateShiftRegister(); Serial.println("Cleared"); }