// JLed dynamic sequence demo
//
// Toggles between sequences using a push button.
// After a sequence is finished, leds are turned off by calling
// Stop() on the sequence object.
//
// (c) Copyright 2022 by Jan Delgado
// see https://github.com/jandelgado/jled
//
// -----------------------------------------------------------------
// setup:
// LEDs are connected to GPIO 22 and 23 and GPIO 2 (builtin).
// Button is connected to GPIO 5 and GND.
//
#include <JC_Button.h> // https://github.com/JChristensen/JC_Button
/*KEYWORDS
JC_Button KEYWORD1
Button KEYWORD1
ToggleButton KEYWORD1
begin KEYWORD2
read KEYWORD2
isPressed KEYWORD2
isReleased KEYWORD2
These functions check the button state from the last call to read() and return false or true accordingly.
These functions do not cause the button to be read.
wasPressed KEYWORD2
wasReleased KEYWORD2
these functions check the button state to see if it changed between the last two calls to read() and return false or true accordingly.
These functions do not cause the button to be read. Note that these functions may be more useful than isPressed() and isReleased()
since they actually detect a change in the state of the button, which is usually what we want in order to cause some action
pressedFor KEYWORD2
releasedFor KEYWORD2
These functions check to see if the button is pressed (or released), and has been in that state for the specified time in milliseconds.
Returns false or true accordingly. These functions are useful to detect "long presses". Note that these functions do not cause the button to be read.
lastChange KEYWORD2
Under certain circumstances, it may be useful to know when a button last changed state. lastChange() returns the time the button last changed state,
in milliseconds (the value is derived from the Arduino millis() function).
changed KEYWORD2
Returns a boolean value (true or false) to indicate whether the toggle button changed state the last time read() was called.
toggleState KEYWORD2
Returns a boolean value (true or false) to indicate the toggle button state as of the last time read() was called.
*/
#include <jled.h>
/*
#######################################
# Datatypes (KEYWORD1)
#######################################
JLed KEYWORD1
JLedSequence KEYWORD1
BlinkBrightnessEvaluator KEYWORD1
BrightnessEvaluator KEYWORD1
BreatheBrightnessEvaluator KEYWORD1
CandleBrightnessEvaluator KEYWORD1
ConstantBrightnessEvaluator KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
On KEYWORD2
Off KEYWORD2
Set KEYWORD2
Blink KEYWORD2
Breathe KEYWORD2
Candle KEYWORD2
FadeOn KEYWORD2
FadeOff KEYWORD2
Repeat KEYWORD2
Forever KEYWORD2
DelayBefore KEYWORD2
DelayAfter KEYWORD2
Forever KEYWORD2
Hal KEYWORD2
IsForever KEYWORD2
IsRunning KEYWORD2
LowActive KEYWORD2
IsLowActive KEYWORD2
Stop KEYWORD2
Update KEYWORD2
UserFunc KEYWORD2
Reset KEYWORD2
MinBrightness KEYWORD2
MaxBrightness KEYWORD2
#######################################
# Instances (KEYWORD2)
#######################################
#######################################
# Constants (LITERAL1)
#######################################
SEQUENCE LITERAL1
PARALLEL LITERAL1
*/
int pwm;
int *duty;
//-----------------------------------------------------------------------------------------------
JLed leds1[] = {
JLed(13).Blink(250, 1).Repeat(1).MaxBrightness(&pwm),
// JLed(13).Off(),
// JLed(12).Off(),
JLed(12).Blink(250, 1).Repeat(1).MaxBrightness(&pwm),
// JLed(12).Off(),
// JLed(13).Off(),
JLed(11).Blink(250, 1).Repeat(1).MaxBrightness(&pwm),
// JLed(12).Off(),
// JLed(11).Off(),
};
JLed leds2[] = {
JLed(13).Off(),
JLed(12).Blink(60, 120).Repeat(10).MaxBrightness(&pwm),
JLed(11).Off(),
};
JLed leds3[] = {
JLed(13).Off(),
JLed(12).Off(),
JLed(11).Breathe(1000).Repeat(10).MaxBrightness(&pwm),
};
JLed leds4[] = {
JLed(13).FadeOn(500).DelayAfter(1000).Repeat(10).MaxBrightness(&pwm),
JLed(12).DelayBefore(500).FadeOn(500).DelayAfter(1000).Repeat(10).MaxBrightness(&pwm),
JLed(11).DelayBefore(1000).FadeOn(500).DelayAfter(1000).Repeat(10).MaxBrightness(&pwm),
};
JLed leds5[] = {
JLed(13).Off(),
JLed(12).Off(),
JLed(11).Off(),
};
//-----------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------
JLed leds6[] = {
JLed(13).Blink(250, 1).Repeat(1).MaxBrightness(&pwm),
JLed(13).Off(),
JLed(12).Off(),
};
JLed leds7[] = {
JLed(13).Off(),
JLed(12).Off(),
JLed(11).Blink(120, 120).Repeat(10).MaxBrightness(&pwm),
};
JLed leds8[] = {
JLed(13).Breathe(1000).Repeat(10).MaxBrightness(&pwm),
JLed(12).Breathe(1000).Repeat(10).MaxBrightness(&pwm),
JLed(11).Breathe(1000).Repeat(10).MaxBrightness(&pwm),
};
JLed leds9[] = {
JLed(13).FadeOn(500).DelayAfter(1000).Repeat(10).MaxBrightness(&pwm),
JLed(12).DelayBefore(100).FadeOn(600).DelayAfter(1000).Repeat(10).MaxBrightness(&pwm),
JLed(11).DelayBefore(1000).FadeOn(600).DelayAfter(1000).Repeat(10).MaxBrightness(&pwm),
};
JLed leds10[] = {
JLed(13).On(),
JLed(12).On(),
JLed(11).On(),
};
//-----------------------------------------------------------------------------------------------
auto seq = JLedSequence(JLedSequence::eMode::SEQUENCE,leds1);
auto button = Button(7, 25, true /*pull-up*/, true /*inverted*/);
auto button2 = Button(5, 25, true /*pull-up*/, true /*inverted*/);
//-----------------------------------------------------------------------------------------------
void setup()
{
Serial.begin(9600);
Serial.println("press button to cycle through effects");
button.begin();
button2.begin();
duty = &pwm;
pwm = 255; // initialize pwm value
Serial.print("Initialized PWM Value = ");
Serial.println(pwm);
}
//-----------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------
void loop()
{
static auto count = 0;
static auto count2 = 0;
button.read();
button2.read();
if (!seq.Update()) {
// turn leds off after sequence is done
// seq.Stop();
seq.Reset();
}
//-----------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------
// if (button.wasPressed()) {
if (button.wasPressed() && button2.isPressed()) {
switch (count) {
case 0:
Serial.print("Pattern 1: Road Runner, PWM= ");
*duty = 10; // low power
Serial.println(pwm);
seq = JLedSequence(JLedSequence::eMode::SEQUENCE, leds1);
seq.Reset();
break;
case 1:
Serial.print("Pattern 2: Strobe , PWM= ");
*duty = 240;
Serial.println(pwm);
seq = JLedSequence(JLedSequence::eMode::PARALLEL, leds2);
seq.Reset();
break;
case 2:
Serial.print("Pattern 3: Breathe, PWM= ");
*duty = 200;
Serial.println(pwm);
seq = JLedSequence(JLedSequence::eMode::PARALLEL, leds3);
seq.Reset();
break;
case 3:
Serial.print("Pattern 4: Fades ,PWM= ");
*duty = 100;
Serial.println(pwm);
seq = JLedSequence(JLedSequence::eMode::PARALLEL, leds4);
seq.Reset();
break;
case 4:
Serial.println("Leds Off");
seq = JLedSequence(JLedSequence::eMode::SEQUENCE, leds5);
seq.Reset();
break;
}
count = (count + 1) % 5;
}
//-----------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------
// while (button2.pressedFor(1000) && button.pressedFor(300)) { // not working the way i want it to.
if (button2.wasPressed()) {
switch (count2) {
case 0:
Serial.print("Pattern 5: Road Runner, PWM= ");
*duty = 10; // low power
Serial.println(pwm);
seq = JLedSequence(JLedSequence::eMode::SEQUENCE, leds6);
seq.Reset();
break;
case 1:
Serial.print("Pattern 6: Strobe , PWM= ");
*duty = 240;
Serial.println(pwm);
seq = JLedSequence(JLedSequence::eMode::PARALLEL, leds7);
seq.Reset();
break;
case 2:
Serial.print("Pattern 7: Breathe, PWM= ");
*duty = 200;
Serial.println(pwm);
seq = JLedSequence(JLedSequence::eMode::PARALLEL, leds8);
seq.Reset();
break;
case 3:
Serial.print("Pattern 8: Fades ,PWM= ");
*duty = 100;
Serial.println(pwm);
seq = JLedSequence(JLedSequence::eMode::PARALLEL, leds9);
seq.Reset();
break;
case 4:
Serial.println("Leds On");
seq = JLedSequence(JLedSequence::eMode::SEQUENCE, leds10);
seq.Reset();
break;
}
count2 = (count2 + 1) % 5;
}
//-----------------------------------------------------------------------------------------------
}