Created
November 16, 2023 19:47
-
-
Save caffo/b2cfb47c1326578fdfa612ff9b5f05ee to your computer and use it in GitHub Desktop.
a calming blinking light — https://caffo.link/led
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const int ledPin = 13; | |
unsigned long startTime; | |
float currentDelay; | |
float initialBPM; | |
float finalBPM; | |
unsigned long interval; // Duration of BPM change | |
unsigned long holdInterval; // Duration to hold at final BPM | |
unsigned long fadeInterval; // Duration of fade to off | |
unsigned long totalTime; // Total time until LED turns off | |
// Function to convert minutes to milliseconds | |
unsigned long minutesToInterval(float minutes) { | |
return minutes * 60 * 1000; | |
} | |
void setup() { | |
pinMode(ledPin, OUTPUT); | |
startTime = millis(); // Record the start time | |
// Set your desired BPM and intervals here | |
initialBPM = 220.0; // Starting BPM | |
finalBPM = 60.0; // Final BPM | |
interval = minutesToInterval(20); // Duration of BPM change (20 minutes) | |
holdInterval = minutesToInterval(20); // Hold at final BPM (20 minutes) | |
fadeInterval = minutesToInterval(30); // Fade duration (30 minutes) | |
totalTime = interval + holdInterval + fadeInterval; // Total duration | |
// Calculate the initial delay in milliseconds | |
currentDelay = 60000.0 / initialBPM; // 60,000 milliseconds in a minute | |
} | |
void loop() { | |
unsigned long currentTime = millis(); | |
unsigned long elapsedTime = currentTime - startTime; | |
if (elapsedTime < interval) { | |
// Gradually change BPM | |
float intervalFraction = (float)elapsedTime / interval; | |
float bpm = initialBPM + (finalBPM - initialBPM) * intervalFraction; | |
currentDelay = 60000.0 / bpm; | |
} else if (elapsedTime < interval + holdInterval) { | |
// Hold at final BPM | |
currentDelay = 60000.0 / finalBPM; | |
} else if (elapsedTime < totalTime) { | |
// Fading logic will be added here later | |
} else { | |
// Turn off LED after total duration | |
digitalWrite(ledPin, LOW); | |
return; // Stop the loop | |
} | |
// Blink the LED | |
digitalWrite(ledPin, HIGH); | |
delay((int)currentDelay); | |
digitalWrite(ledPin, LOW); | |
delay((int)currentDelay); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment