Skip to content

Instantly share code, notes, and snippets.

@microtherion
Created February 18, 2013 17:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save microtherion/4979149 to your computer and use it in GitHub Desktop.
Save microtherion/4979149 to your computer and use it in GitHub Desktop.
/*
* FacyFlashlight - control an RGB LED with an ATtiny85.
* Matthias Neeracher 2013
*
* Needs Arduino-tiny core http://code.google.com/p/arduino-tiny/
* (The attiny core only supports 2 PWM outputs for the ATtiny85)
*
* This code is in the public domain.
*/
int redLed = 0;
int greenLed = 4;
int blueLed = 1; // the pin that the LED is attached to
int gLastRed;
int gLastGreen;
int gLastBlue;
//
// Lighting routines
//
void plainWhite()
{
digitalWrite(redLed, LOW);
digitalWrite(greenLed, LOW);
digitalWrite(blueLed, LOW);
delay(3000);
gLastRed = 0;
gLastGreen = 0;
gLastBlue = 0;
}
void flicker(int off, int on, int reps)
{
while (reps-- > 0) {
digitalWrite(redLed, HIGH);
digitalWrite(greenLed, HIGH);
digitalWrite(blueLed, HIGH);
delay(off);
analogWrite(redLed, gLastRed);
analogWrite(greenLed, gLastGreen);
analogWrite(blueLed, gLastBlue);
delay(on);
}
}
void fade(int minRed, int maxRed, int minGreen, int maxGreen, int minBlue, int maxBlue, int steps, int duration)
{
for (; steps > 0; --steps) {
analogWrite(redLed, minRed);
analogWrite(greenLed, minGreen);
analogWrite(blueLed, minBlue);
int sleep = duration / steps;
delay(sleep);
duration -= sleep;
minRed += (maxRed-minRed) / steps;
minGreen += (maxGreen-minGreen) / steps;
minBlue += (maxBlue-minBlue) / steps;
}
analogWrite(redLed, gLastRed = minRed);
analogWrite(greenLed, gLastGreen = minGreen);
analogWrite(blueLed, gLastBlue = minBlue);
}
// the setup routine runs once when you press reset:
void setup() {
pinMode(redLed, OUTPUT);
pinMode(greenLed, OUTPUT);
pinMode(blueLed, OUTPUT);
digitalWrite(redLed, HIGH);
digitalWrite(greenLed, HIGH);
digitalWrite(blueLed, HIGH);
/* Start out by pretending to be a regular flashlight */
plainWhite();
/* Simulate damage */
flicker(50, 950, 2);
flicker(50, 450, 4);
/* Disco time! */
flicker(50, 200, 8);
flicker(50, 50, 8);
}
// the loop routine runs over and over again forever:
void loop()
{
int kFadeSteps = 50;
int kFadeDuration = 5000;
switch (random(10)) {
case 0:
fade(gLastRed, 0, gLastGreen, 255, gLastBlue, 255, kFadeSteps, kFadeDuration);
break;
case 1:
fade(gLastRed, 255, gLastGreen, 0, gLastBlue, 255, kFadeSteps, kFadeDuration);
break;
case 2:
fade(gLastRed, 255, gLastGreen, 255, gLastBlue, 0, kFadeSteps, kFadeDuration);
break;
case 3:
fade(gLastRed, 0, gLastGreen, 0, gLastBlue, 255, kFadeSteps, kFadeDuration);
break;
case 4:
fade(gLastRed, 0, gLastGreen, 255, gLastBlue, 0, kFadeSteps, kFadeDuration);
break;
case 5:
fade(gLastRed, 255, gLastGreen, 0, gLastBlue, 0, kFadeSteps, kFadeDuration);
break;
case 6:
fade(gLastRed, 0, gLastGreen, 0, gLastBlue, 0, kFadeSteps, kFadeDuration);
break;
case 7:
flicker(200, 200, 5);
break;
case 8:
flicker(100, 100, 10);
break;
case 9:
flicker(50, 50, 20);
break;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment