commit f01ba5e01a1512b37c0b8925a7d3424baff2ae11 Author: Andrew Kesterson Date: Wed May 27 09:09:55 2026 -0400 Add project files for flowing light with button diff --git a/flowing_light_with_button/.theia/launch.json b/flowing_light_with_button/.theia/launch.json new file mode 100644 index 0000000..7e4253b --- /dev/null +++ b/flowing_light_with_button/.theia/launch.json @@ -0,0 +1,8 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + "version": "0.2.0", + "configurations": [ + + ] +} diff --git a/flowing_light_with_button/breadboard.png b/flowing_light_with_button/breadboard.png new file mode 100644 index 0000000..d9621b1 Binary files /dev/null and b/flowing_light_with_button/breadboard.png differ diff --git a/flowing_light_with_button/flowing_light_with_button.ino b/flowing_light_with_button/flowing_light_with_button.ino new file mode 100644 index 0000000..4f136f0 --- /dev/null +++ b/flowing_light_with_button/flowing_light_with_button.ino @@ -0,0 +1,73 @@ + +#define LED_COUNT 8 +#define UP 1 +#define DOWN 2 +#define PWM_PRECISION 8 +#define PWM_VALUE_MAX 1 << PWM_PRECISION +#define PIN_BUTTON 13 +#define BUTTON_UP 1 +#define BUTTON_BOUNCING 2 +#define BUTTON_DOWN 3 +#define BUTTON_HELD 4 + +const byte ledPins[] = {21, 47, 38, 39, 40, 41, 42, 2}; //define led pins +const byte chns[] = {0, 1, 2, 3, 4, 5, 6, 7}; //define the pwm channels +int pwmvalues[] = {1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7}; +char velocities[] = {DOWN, DOWN, DOWN, DOWN, DOWN, DOWN, DOWN, DOWN}; +int delayTimes = 100; //flowing speed ,the smaller, the faster +unsigned long button_bounce_millis = 0; +char buttonState = BUTTON_UP; + +void setup() { + for (int i = 0; i < LED_COUNT; i++) { //setup the pwm channels + ledcAttachChannel(ledPins[i], 1000, PWM_PRECISION, chns[i]); + } + pinMode(PIN_BUTTON, INPUT); +} + +void checkButtonPressed(void) { + unsigned long curmillis = millis(); + if ( digitalRead(PIN_BUTTON) == LOW ) { + if ( buttonState == BUTTON_UP ) { + button_bounce_millis = millis(); + buttonState = BUTTON_BOUNCING; + return; + } else if ( buttonState == BUTTON_BOUNCING && curmillis - button_bounce_millis > 20 ) { + if ( digitalRead(PIN_BUTTON) == LOW ) { + buttonState = BUTTON_DOWN; + } + } + } else if ( digitalRead(PIN_BUTTON) == HIGH ) { + buttonState = BUTTON_UP; + } +} + +void loop() { + checkButtonPressed(); + if ( buttonState == BUTTON_DOWN ) { + for ( int i = 0; i < LED_COUNT ; i++ ) { + if ( velocities[i] == UP) { + velocities[i] = DOWN; + } else { + velocities[i] = UP; + } + } + buttonState = BUTTON_HELD; + } + + for ( int i = 0; i < LED_COUNT ; i++ ) { + if ( pwmvalues[i] == 0 ) { + velocities[i] = UP; + pwmvalues[i] = 1; + } else if ( pwmvalues[i] == PWM_VALUE_MAX ) { + velocities[i] = DOWN; + } + if ( velocities[i] == UP ) { + pwmvalues[i] = pwmvalues[i] << 1; + } else if ( velocities[i] == DOWN ) { + pwmvalues[i] = pwmvalues[i] >> 1; + } + ledcWrite(ledPins[i], pwmvalues[i]); + } + delay(delayTimes); +}