// EPOCH PROJECT#4 "INPUTS AND OUTPUTS 3 WITH WHILE LOOP" // THIS PROJECT BUILDS OFF OF PROJECT#3. WE'RE GOING TO USE THE SAME CODE USED IN PROJECT#3, BUT WE'LL ADD IN A "WHILE" LOOP. // CONNECT THE RLED (RED LED) PIN TO GPIO PIN#2 ON CHIP(A) // CONNECT THE YLED (YELLOW LED) PIN TO GPIO PIN#4 ON CHIP(A) // CONNECT THE GLED(GREEN LED) PIN TO GPIO PIN#5 ON CHIP(A) // CONNECT THE NL "NORMALLY LOW" BUTTON OUTPUT PIN TO GPIO PIN 3 ON CHIP(A). THE VOLTAGE ON THIS PIN IS 0V (LOW) WHEN NOT PRESSED. WHEN THE BUTTON IS PRESSED AND HELD DOWN, THE VOLTAGE ON THIS PIN WILL BE 5V(HIGH) #define REDLED 2 // LET'S CALL GPIO#2 BY THE NAME "REDLED". #define YELLOWLED 4 // LET'S CALL GPIO#4 BY THE NAME "YELLOWLED". #define GREENLED 5 // LET'S CALL GPIO#5 BY THE NAME "GREENLED". #define NL 3 // LET'S CALL GPIO#3 BY THE NAME "NL" FOR "NORMALLY LOW BUTTON" void setup() { pinMode(REDLED,OUTPUT); // SET "REDLED" AS AN OUTPUT pinMode(YELLOWLED,OUTPUT); // SET "YELLOWLED" AS AN OUTPUT pinMode(GREENLED,OUTPUT); // SET "GREENLED" AS AN OUTPUT pinMode(NL,INPUT); // SET "NL" AS AN INPUT. WE CAN NOW INSTRUCT THE CODE TO LOOK AT THE HIGH (5 VOLT) OR LOW (0 VOLT) LOGIC ON THIS INPUT. } void loop() // WHEN THE NL BUTTON IS PRESSED, A "FOR LOOP" WILL BE EXECUTED. WE'LL TALK ABOUT THAT MORE DOWN BELOW. { if(digitalRead(NL) == HIGH) // THIS IS AN "if" STATEMENT. IF THE CONDITIONS IN THIS STATEMENT ARE MET, THEN THE FOLLOWING CODE WILL BE EXECUTED. THE DIGITALREAD COMMAND READS THE STATE OF THE NL PIN. IF PRESSED (HIGH), FLASH THE LED FOR ONE SECOND. { // THIS WHILE LOOP IS THE ONLY THING THAT WE'RE ADDING TO THE CODE. NO OTHER CHANGES WILL BE MADE delay(50); // 50ms DELAY to compensate for button debounce. while(digitalRead(NL) == HIGH){ // LET'S SAY THAT WE WANT TO MAKE IT SO THAT YOU NEED TO PRESS THE BUTTON, AND THEN LET GO IN ORDER FOR THE CODE TO PROGRESS. THIS WHILE LOOP MAKES IT SO THAT THE CODE CANNOT PROGRESS UNTIL YOU LET GO OF THE BUTTON. SEE NOTES. {} } // THIS IS THE END OF THE WHILE LOOP for (int i = 0; i < 5; i++) // SEE THE NOTES SECTION BELOW FOR A MORE IN DEPTH DECRIPTION OF A "FOR LOOP" { digitalWrite(REDLED,HIGH); // THOS FOLLOWING SECTION WILL EXEUTE 5X TIMES BASED ON THE SETTINGS IN THE ABOVE FOR LOOP. TURN THE RED LED ON FOR 200ms. delay(200); digitalWrite(YELLOWLED,HIGH); // AFTER 200ms, TURN ON THE YELLOW LED delay(200); digitalWrite(GREENLED,HIGH); // AFTER ANOTHER 200ms, TURN ON THE GREEN LED delay(200); digitalWrite(GREENLED,LOW); // THEN TURN OFF ALL OF THE LEDS WITH 200ms DELAYS IN BEWEEN EACH STEP delay(200); digitalWrite(YELLOWLED,LOW); delay(200); digitalWrite(REDLED,LOW); delay(200); } } } // THIS IS THE END OF THE LOOP. THE CODE NOW GOES BACK TO THE TOP OF VOID LOOP() // NOTES: // WHILE LOOPs are my favourite. The while loop above literally stops the program dead in its tracks until you let go of the button. Because the middle parenthases have no code inside, the loop does nothing until the conditions are met. // The while loop ends when NL is low. // The code works like this. The IF statement (if(digitalRead(NL) == HIGH) waits for the user to press the button. Once the button is pressed, there is a 50ms delay to compensate for switch bounce. More on that later. From there, the software // waits for you to let go of the button with the while loop. Once you let go, the FOR LOOP loops the LED sequence 5 times, and then the software starts over. // Here is another example of a while loop: /* while(digitalRead(NL) == HIGH){ { digitalWrite(GREENLED,HIGH); // AFTER ANOTHER 200ms, TURN ON THE GREEN LED delay(50); digitalWrite(GREENLED,LOW); // THEN TURN OFF ALL OF THE LEDS WITH 200ms DELAYS IN BEWEEN EACH STEP delay(50); } } */ // If you replace the while loop in the code with the example above, the green LED will flash on and off very quickly while the button is pressed. When the user lets go of the button, the code progresses.