Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Multi tasking and non blocking sketch
- * Loop uses a single mullis() timer statement and create a non-blocking loop
- * 4 x LEDS, 1 x button and 5 x blink rates
- * Each button push changes the LEDs blink rates
- * loop resets on 5th button press
- * Pins used should work on Uno and ESP32.
- */
- // LED Pins
- const int greenLed = 2;
- const int orangeLed = 3;
- const int redLed = 4;
- const int blueLed = 5;
- // Button Pin
- const int buttonPin = 12;
- // Variables
- uint8_t greenState = LOW, orangeState = LOW, redState = LOW, blueState = LOW,
- greenRate, orangeRate, redRate, blueRate,
- greenCount = 0, orangeCount = 0, redCount = 0, blueCount = 0,
- buttonState, lastBtnState = HIGH, pressCount = 0;
- bool buttonPress = false, blink = false, print = false,
- updateGreen = false, updateOrange = false, updateRed = false, updateBlue = false;
- long currentTime;
- // Constants
- #define DUTY 50
- #define X_FAST 2
- #define FAST 5
- #define MEDIUM 10
- #define SLOW 20
- #define X_SLOW 30
- // Setup our Inputs and Outputs
- void setup(){
- Serial.begin(115200);
- while(!Serial);
- pinMode(buttonPin, INPUT_PULLUP);
- pinMode(greenLed, OUTPUT);
- pinMode(orangeLed, OUTPUT);
- pinMode(redLed, OUTPUT);
- pinMode(blueLed, OUTPUT);
- digitalWrite(greenLed, greenState);
- digitalWrite(orangeLed, orangeState);
- digitalWrite(redLed, redState);
- digitalWrite(blueLed, blueState);
- }
- void loop(){
- buttonState = digitalRead(buttonPin); // Watch for button press
- if ( buttonState != lastBtnState ){
- buttonPress = true;
- }
- if ( millis() - currentTime >= DUTY ){
- currentTime = millis(); // You must reset currentTime for next update
- greenCount++; // Increment counters each millis() loop
- orangeCount++;
- redCount++;
- blueCount++;
- if ( buttonPress ){ // True when the button is pressed
- if ( buttonState == LOW ){
- pressCount++;
- if ( pressCount == 4){ // Assign blink rates based on button press count
- greenRate = MEDIUM;
- orangeRate = SLOW;
- redRate = X_FAST;
- blueRate = X_SLOW;
- Serial.println("Green @ 500mS, Orange @ 1000mS, Red @ 100mS and Blue @ 1500mS\n");
- }
- if ( pressCount == 3){
- greenRate = X_SLOW;
- orangeRate = X_FAST;
- redRate = SLOW;
- blueRate = FAST;
- Serial.println("Green @ 1500mS, Orange @ 100mS, Red @ 1000mS and Blue @ 250mS\n");
- }
- if ( pressCount == 2){
- greenRate = MEDIUM;
- orangeRate = X_SLOW;
- redRate = X_FAST;
- blueRate = MEDIUM;
- Serial.println("Green @ 500mS, Orange @ 1500mS, Red @ 100mS and Blue @ 500mS\n");
- }
- if ( pressCount == 1){
- greenRate = SLOW;
- orangeRate = FAST;
- redRate = MEDIUM;
- blueRate = X_FAST;
- Serial.println("Green @ 1000mS, Orange @ 250mS, Red @ 500mS and Blue @ 100mS\n");
- }
- if ( pressCount > 4 ){ // Reset button press counter when MAX is reached
- pressCount = 0;
- Serial.println("***** ALL LEDS OFF *****\n");
- }
- if ( pressCount > 0 ){ // Enable LEDS when true
- blink = true;
- } else {
- blink = false; // LEDS All "OFF" when the is true ( pressCount == 0 )
- }
- }
- buttonPress = false; // So we don't keep repeating the button press actions
- }
- if ( blink ){ // When true LEDS blink at assigned rate
- if ( greenCount >= greenRate){
- greenCount = 0;
- greenState = !greenState;
- updateGreen = true; // So we only write a LED state change
- }
- if ( orangeCount >= orangeRate){
- orangeCount = 0;
- orangeState = !orangeState;
- updateOrange = true;
- }
- if ( redCount >= redRate){
- redCount = 0;
- redState = !redState;
- updateRed = true;
- }
- if ( blueCount >= blueRate){
- blueCount = 0;
- blueState = !blueState;
- updateBlue = true;
- }
- } else { // When ( blink == false ) All LEDS are "OFF"
- greenState = LOW;
- orangeState = LOW;
- redState = LOW;
- blueState = LOW;
- updateGreen = true;
- updateOrange = true;
- updateRed = true;
- updateBlue = true;
- }
- if (updateGreen){ // We only need to write to the outputs when a state changes
- digitalWrite(greenLed, greenState);
- updateGreen = false;
- }
- if (updateOrange){
- digitalWrite(orangeLed, orangeState);
- updateOrange = false;
- }
- if (updateRed){
- digitalWrite(redLed, redState);
- updateRed = false;
- }
- if (updateBlue){
- digitalWrite(blueLed, blueState);
- updateBlue = false;
- }
- } // End millis() loop
- lastBtnState = buttonState; // To enable button de-bounce we assign current button to last button state every loop
- } // End main loop
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement