1
0
mirror of https://github.com/taigrr/arduinolibs synced 2025-01-18 04:33:12 -08:00

Sketch to blink leds for the Enterprise

This commit is contained in:
Rhys Weatherley 2012-04-09 15:01:04 +10:00
parent 086596724f
commit c27a375f5e

125
StarTrek/StarTrek.pde Normal file
View File

@ -0,0 +1,125 @@
/*
Sketch that manipulates Arduino outputs to create Star Trek Enterprise style
running lights and LED chasers. There are 4 types of lights on the Enterprise:
* Static lights in windows, engines, and the deflector dish.
* Navigation lights on the left and right of the saucer with a 1 second period.
* Strobe light that comes on briefly every second.
* Nacelle lights that perform a LED chase in the front of the nacelle.
There is provision for a chase of between 1 and 6 LED's. A typical configuration
is 5 LED's in sequence (clockwise in one nacelle, counter-clockwise in the other).
Another configuration uses a 3 LED sequence, driving 6 LED's organised in
opposite pairs.
The static lights are not handled by this sketch. They are assumed to be
connected directly to the Vcc and GND supply lines.
The nacelle lights use the Arduino's PWM outputs, so that the previous LED in the
chase can be dimmed slightly rather than completely turned off, to give a trailing
flame effect. NACELLE_DIM_VALUE can be used to set the amount of dimming
(0 = completely off, 255 = completely on).
All outputs should be connected to the base of an NPN transistor (e.g. BC548)
via a 10K resistor to drive the actual LED's, as there will typically be multiple
LED's on each output. For example, there are typically 4 navigation lights:
red/green on the top of the saucer and red/green on the bottom of the saucer.
Nacelle lights with a 3 LED chase will have 4 LED's on each output - two in
each nacelle.
*/
#define NAV_LIGHTS A2 // Red/green navigational lights
#define STROBE_LIGHT A3 // Strobe light
#define NACELLE_1 3 // Nacelle twirl chase LED 1
#define NACELLE_2 5 // Nacelle twirl chase LED 2
#define NACELLE_3 6 // Nacelle twirl chase LED 3
#define NACELLE_4 9 // Nacelle twirl chase LED 4
#define NACELLE_5 10 // Nacelle twirl chase LED 5
#define NACELLE_6 11 // Nacelle twirl chase LED 6
#define NACELLE_RATE A0 // Analog input that defines the rate of the nacelle chase
#define NAV_LIGHTS_PERIOD 2000
#define NAV_LIGHTS_OFF 1000
#define STROBE_LIGHT_PERIOD 900
#define STROBE_LIGHT_OFF 830
#define NACELLE_PERIOD 500
#define NACELLE_MIN_PERIOD 25
#define NACELLE_MAX_PERIOD 250
#define NACELLE_DIM_VALUE 32 // Value for dimming previous LED in chase, 0..255
byte nacelleChase[6] = {
NACELLE_1,
NACELLE_2,
NACELLE_3,
NACELLE_4,
NACELLE_5,
NACELLE_6
};
byte nacelleChaseLen = 6; // Select the length of the nacelle chase: 1 to 6.
unsigned long startTime;
unsigned long lastNacelleTime = 0;
unsigned long nacellePeriod = 0;
byte index = 0;
void setup() {
// Configure the outputs and set them to be initially LOW.
pinMode(NAV_LIGHTS, OUTPUT);
digitalWrite(NAV_LIGHTS, LOW);
pinMode(STROBE_LIGHT, OUTPUT);
digitalWrite(STROBE_LIGHT, LOW);
for (int index = 0; index < nacelleChaseLen; ++index) {
byte pin = nacelleChase[index];
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
}
// Turn off the status LED on the Arduino board (we don't need it).
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
// Initialize the analog input for the nacelle chaser rate.
pinMode(NACELLE_RATE, INPUT);
digitalWrite(NACELLE_RATE, LOW);
// Record the starting time, for controlling the chase and blinks.
startTime = millis();
index = nacelleChaseLen - 1;
}
// Note: there will be discontinuity in the chase/blink rate when millis()
// wraps around after 49 days. Should automatically resync after a second or two.
void loop() {
// How long since the application started?
unsigned long sinceStart = millis() - startTime;
// Update the navigation lights.
if ((sinceStart % NAV_LIGHTS_PERIOD) >= NAV_LIGHTS_OFF)
digitalWrite(NAV_LIGHTS, HIGH);
else
digitalWrite(NAV_LIGHTS, LOW);
// Update the strobe light.
if ((sinceStart % STROBE_LIGHT_PERIOD) >= STROBE_LIGHT_OFF)
digitalWrite(STROBE_LIGHT, HIGH);
else
digitalWrite(STROBE_LIGHT, LOW);
// Update the nacelle lights - uniform LED chase of length 1 to 6.
if ((sinceStart - lastNacelleTime) >= nacellePeriod) {
// Advance to the next pin in sequence.
index = (index + 1) % nacelleChaseLen;
int currentPin = nacelleChase[index];
int prevPin1 = nacelleChase[(index + nacelleChaseLen - 1) % nacelleChaseLen];
int prevPin2 = nacelleChase[(index + nacelleChaseLen - 2) % nacelleChaseLen];
digitalWrite(prevPin2, LOW);
analogWrite(prevPin1, NACELLE_DIM_VALUE);
digitalWrite(currentPin, HIGH);
// Read the chase rate from the trimpot on A0 and determine the next timeout period.
lastNacelleTime = sinceStart;
int val = analogRead(NACELLE_RATE);
nacellePeriod = map(val, 0, 1023, NACELLE_MIN_PERIOD, NACELLE_MAX_PERIOD);
}
}