Skip to content

Instantly share code, notes, and snippets.

@Youz13

Youz13/FADing.ino

Last active Jan 21, 2018
Embed
What would you like to do?
FADing (Fall Asleep Device)
/*
FADing : version 1.0
Made by : Youz
1- Push ON button to power up until you see 1 flash.
2- To add more minutes to the process, you have 5 seconds to add 2 more minutes for each push on the "mode" button.
3- To switch betwin top light or inside light, quick push the "mode" button.
4- To shutdown, long push the "mode" button.
*/
// for change time of default process
int initTime = 8; // initial time of process in minutes. YOU CAN MODIFY IT
// Pin
int led = 9; // the PWM pin the LED is attached to (light for celing)
int mode = A5; // the input pin for the mode button
int pwr = 4; // the power pin to set relay ON through the MOSFET
// Var
int button_delay = 0; // used to check long or short push on mode button
int brightness = 10; // how initial bright the LED is
int fadeAmount = 1; // how many points to fade the LED by
int start = 1; // used for startup
float delayM = 20; // delay between brigtness change for the first 10 seconds
unsigned long temps; // for compare with millis()
int cyclecompt = 1; // for both 'while'
int buttonCounter = 0; // used for the number of push of the mode button
int lastButtonState = 0; // the last state of mode button
int buttonState = 0; // the current state of mode button
float intervaL = 0; // the interval for slow down fade in/fade out
int md2 = 0; // use for minutes added by push mode button and for fulltime run of the EasySleep
void setup() {
temps = millis();
pinMode(led, OUTPUT); pinMode(pwr, OUTPUT); pinMode(mode, INPUT); pinMode(10, OUTPUT);
digitalWrite(pwr, HIGH);
}
void loop() {
if (start == 1) { // Run startup loop
StarT();
}
if ( millis() >= temps + 10000 ) { // every 10 seconds, fade in/fade out slow down
delayM = delayM + intervaL;
temps = temps + 10000;
}
if ( temps > md2 * 60000 ) { // check if the selected number of minutes is reach
EnD();
}
cycle(); // run 1 fade in and 1 fade out step
}
void StarT() {
analogWrite(10, 30); delay(200); analogWrite(10, 0); delay(300); analogWrite(10, 30); delay(200); analogWrite(10, 0); delay(1000); // blink 2 times when arduino boot finish
while (cyclecompt < 500) { // check for 5 seconds the number of time mode button is pushed
buttonState = digitalRead(mode);
if (buttonState != lastButtonState) {
if (buttonState == HIGH) {
buttonCounter++;
delay(200);
}
}
lastButtonState = buttonState;
delay(10);
cyclecompt++;
}
if (buttonCounter == 0) {
md2 = initTime;
}
else {
md2 = initTime + ( buttonCounter * 2 ); // Add 2 minutes per push of the mode button
}
intervaL = 21.0 / ( (float)md2 * 6.0 ); //21 is the interval between brightness change from starting 11 breath per minute (20 ms) to ending 6 breath per minute (41 ms)
start = 0;
if ( md2 != initTime ) { // blink the number of time mode button is pushed
cyclecompt = 1;
while (cyclecompt < buttonCounter + 1) {
analogWrite(10, 50); delay(200); analogWrite(10, 0); delay(300);
cyclecompt++;
}
delay(800);
}
}
void cycle() { // 1 cycle of fade in/fade out
cyclecompt = 0;
while (cyclecompt < 220) {
analogWrite(led, brightness);
brightness = brightness + fadeAmount;
if ( brightness <= 10 ) { // On ending invert fadeAmount for next fade in
fadeAmount = -fadeAmount;
delay(1000);
}
if ( brightness >= 115 ) { // If led is full bright, invert fadeAmount to fade out
fadeAmount = -fadeAmount;
}
delay(delayM);
cyclecompt++;
if (digitalRead(mode) == HIGH) {
button_delay = 0;
while (digitalRead(mode) == HIGH) {
button_delay++;
delay(100);
if (button_delay > 10) { //no need to wait for user to release
digitalWrite(9, LOW);
digitalWrite(10, LOW);
EnD();
break;
}
}
if (button_delay < 10) { //short press
if (led == 9) {
for (int fadeValue = brightness ; fadeValue >= 0; fadeValue -= 5) {
analogWrite(9, fadeValue);
delay(30);
}
digitalWrite(9, LOW);
led = 10; button_delay = 0;
}
else {
for (int fadeValue = brightness ; fadeValue >= 0; fadeValue -= 5) {
analogWrite(10, fadeValue);
delay(30);
}
digitalWrite(10, LOW);
led = 9; button_delay = 0;
}
}
}
}
}
void EnD() {
digitalWrite(pwr, LOW); delay(3000);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment