#include "FadeLed.h"
#include <Wire.h> // I2C
// PINS
#define PIR1_PIN 2
#define PIR2_PIN 3
#define POT_MIN_PIN A0
#define POT_MAX_PIN A1
// States
#define RESTING 0
// #define ILLUMINATE 1
#define FADING 1
#define WAITING 2
// CONFIGURATION
#define CHANNELS 15 // number of stairs
#define FADE_TIME 1000
#define FADE_SPEED_STEP 100
#define FADE_PAUSE 500
#define FADE_CONSTANT true
#define TIME_ON 4000
#define UPWARDS true
#define DOWNWARDS false
// Settings
byte power_min_set = 0; // 0-100
byte power_max_set = 0; // 0-100
byte state = RESTING;
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
FadeLed leds[CHANNELS] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
bool is_fading_in = false;
bool fade_direction = UPWARDS;
byte fade_power_target, fade_channel, fade_channel_max, fade_step, fade_speed;
unsigned long fade_pause_time = 0;
unsigned long waiting_previous_ms = 0;
void setup()
{
Serial.begin(9600);
pwm.begin();
pwm.setPWMFreq(1000);
FadeLed::linkPwm(pwm);
// initDisplay();
updateSettings(); // get min/max values
// delay(4000);
Serial.println("Hello Arduino\n");
state = RESTING;
}
void startFade(bool power_up) {
Serial.print("Starting fade. Powering up? ");
Serial.println(power_up);
is_fading_in = power_up;
fade_power_target = power_up ? power_max_set : power_min_set;
fade_channel = fade_direction ? 0 : CHANNELS-1;
fade_channel_max = fade_direction ? CHANNELS-1 : 0;
fade_step = fade_direction ? 1 : -1;
fade_speed = FADE_TIME;
state = FADING;
}
void loop()
{
// FadeLed::update();
// drawScreen(power_min_set, power_max_set);
if(state == RESTING) {
// Serial.println("Resting..");
// drawScreen(power_min_set, power_max_set);
updateSettings();
// Check sensors
byte pir_lower = digitalRead(PIR1_PIN);
byte pir_upper = digitalRead(PIR2_PIN);
// No trigger
if(pir_lower == LOW && pir_upper == LOW) return;
Serial.println("Trigger!");
Serial.print(pir_lower);
Serial.print(" - ");
Serial.println(pir_upper);
// TRIGGER - Set direction based on trigger location and start fade
fade_direction = (pir_lower == HIGH) ? UPWARDS : DOWNWARDS;
Serial.print("Fade direction: ");
Serial.println(fade_direction);
startFade(true);
}
else if (state == FADING) {
// Check if pause is needed
Serial.print("Fading channel: ");
Serial.println(fade_channel);
if(fade_pause_time > 0) {
bool isPauseComplete = ((millis() - fade_pause_time) >= FADE_PAUSE);
if(!isPauseComplete) return;
fade_pause_time = 0; // Reset pause time
}
// Fade lights
leds[fade_channel].setTime(fade_speed, FADE_CONSTANT);
leds[fade_channel].set(fade_power_target);
if(fade_channel == fade_channel_max) {
// If fading is done, start waiting OR go to rest if fading out
waiting_previous_ms = millis();
fade_pause_time = 0;
state = is_fading_in ? WAITING : RESTING;
return;
}
// Move to next channel
fade_channel += fade_step;
fade_speed += FADE_SPEED_STEP;
fade_pause_time = millis();
return;
}
else if (state == WAITING) {
Serial.println("Waiting");
unsigned long currentMs = millis();
bool isWaitComplete = ((currentMs - waiting_previous_ms) >= TIME_ON);
if(!isWaitComplete) return;
// If wait period is completed
startFade(false);
}
}
void updateSettings()
{
// brightness values
power_min_set = map(analogRead(POT_MIN_PIN), 10, 1023, 0, 100);
power_max_set = map(analogRead(POT_MAX_PIN), 10, 1023, 0, 100);
}
// boolean hasTimePassed(int howLong, int startMs)
// {
// unsigned long currentMs = millis();
// return ((currentMs - startMs) >= howLong);
// }