/* Beleuchtung Ladenlokal und zwei Raeume */
static byte flackerHelligkeit;
const byte leds[] = {2, 4}; // LED-Ports definieren
long ledTakt[2][5] = {{17000, 45000, 10000, 30000, 80000},
{15000, 30000, 20000, 90000, 20000}}; // Takt der LEDs definieren
static byte ledStatus[] = {0, 0}; // Status (an/aus) der LEDs definieren
const long initTakt[] = {ledTakt[0][0], ledTakt[1][0]}; // Erste Schaltzeit definieren
const byte neonLeds[] = {0, 1}; // LED-Ports definieren: Neonroehren an 0 und 1
long neonLedTakt[] = {500, 900}; // Erste Schaltzeit definieren
static byte neonLedStatus[] = {0, 0}; // Status (an/aus) der Neon-LEDs definieren
const long neonInitTakt[] = {neonLedTakt[0], neonLedTakt[1]}; // Erste Schaltzeit definieren
const byte eingangsPin = 3; // Eingang definieren
boolean programmAbwStart = false; // Programm "Abwechslung" -> Ausgaenge werden wie im Takt angegeben abgearbeitet
boolean programmDauerStart = false; // Programm "Dauer" -> Alle Ausgaenge an
boolean programmEnde = false;
long startTimer; // Startzeit des Programms
long ledTime[sizeof(leds)];
long neonledTime[sizeof(neonLeds)];
void setup() {
// Alle LEDs als OUTPUT setzen
pinMode(leds[0],OUTPUT);
pinMode(leds[1],OUTPUT);
pinMode(neonLeds[0],OUTPUT);
pinMode(neonLeds[1],OUTPUT);
// Eingangspin als INPUT setzen
pinMode(eingangsPin,INPUT);
}
boolean milliSekundenTakt(long dauer, long &alterWert) {
// Parameter "dauer": Dauer einer Blinkphase (an bzw. aus)
// Parameter "alterWert": Variable zum Speichern des millis() Timers
// Rueckgabewert: true wenn die Zeit bis zum naechsten Umschalten abgelaufen ist, sonst false
if (millis() - alterWert < dauer) return false;
while (millis() - alterWert >= dauer) alterWert+=dauer;
return true;
}
void loop()
{
// Programm "Abwechslung" starten, sobald Pin 3 auf HIGH
if (digitalRead(eingangsPin) && programmAbwStart == false)
{
startTimer = millis();
for(int i = 0; i < sizeof(leds); i++)
{
ledTakt[i][0] = startTimer + initTakt[i];
ledTime[i] = 0;
neonLedTakt[i]= startTimer + neonInitTakt[i];
neonledTime[i] = 0;
ledStatus[i] = 0;
}
programmAbwStart = true;
}
//Programm "Dauer" starten, sobald Pin 3 innerhalb von 5 Sekunden nach Programmstart auf LOW
if ((!(digitalRead(eingangsPin))) && (programmAbwStart == true) && (millis() > startTimer + 50) && (millis() <= startTimer + 5000))
{
programmDauerStart = true;
programmAbwStart = false;
}
//Programm beenden, sobald Pin 3 innerhalb nach mehr als 5 Sekunden nach Programmstart auf LOW
if ((!(digitalRead(eingangsPin))) && (programmAbwStart == true) && (millis() > startTimer + 5000))
{
programmAbwStart = false;
programmDauerStart = false;
programmEnde = true;
}
// Programm "Dauer" einschalten
if (programmAbwStart == false && programmDauerStart == true)
{
delay(0);
digitalWrite(neonLeds[0], HIGH);
delay(0);
digitalWrite(neonLeds[1], HIGH);
delay(800);
digitalWrite(leds[0], HIGH);
delay(1500);
digitalWrite(leds[1], HIGH);
}
// Programm "Abwechslung" einschalten
if (programmAbwStart == true && programmDauerStart == false)
{
// Neonroehren im Reisebuero
if ((millis() <= startTimer + 3000) || (millis() > startTimer + 4500 && millis() < startTimer + 5000)) // Flackern während der ersten 2 Sekunden nach Einschalten und noch einmal danach
{
for(int i = 0; i < sizeof(neonLeds); i++)
{
if (milliSekundenTakt(neonLedTakt[i], neonledTime[i])) // Takt abgelaufen?
{
// Umschalten jeder LED zwischen An und Aus
switch (neonLedStatus[i])
{
case 0: // Wenn LED aus, dann einschalten
neonLedTakt[i] = 2*random(100, 250); // neue An-Zeit als Zufallswert
neonLedStatus[i] = 1; // Status auf An setzen
flackerHelligkeit = random(100, 250); // Helligkeit auf Zufallswert zwischen 100 und 250 setzen
break;
case 1: // Wenn LED an, dann ausschalten
neonLedTakt[i] = random(20, 70); // neue Aus-Zeit als Zufallswert
neonLedStatus[i] = 0; // Status auf Aus setzen
flackerHelligkeit = LOW; // Helligkeit auf LOW setzen / LED ausschalten
break;
}
analogWrite(neonLeds[i], flackerHelligkeit); // Schreiben der Werte an den entsprechenden PIN
}
}
}
else // Nach 2 Sekunden dauerhaft einschalten
{
for (int i = 0; i < sizeof(neonLeds); i++)
digitalWrite(neonLeds[i], HIGH); // Alle LED mit voller Helligkeit einschalten
}
// Uebrige LEDs zu vorgegebenen Zeiten einschalten
for (int i=0;i<sizeof(leds);i++) // alle LEDs in einer Schleife durchgehen
{
if (milliSekundenTakt(ledTakt[i][ledStatus[i]],ledTime[i])) // Takt für diese LED abgelaufen?
{
digitalWrite(leds[i],!digitalRead(leds[i])); // wenn ja ==> Umschalten
ledStatus[i]++; // Status erhoehen
if (ledStatus[i] == ((sizeof(ledTakt[i]) / sizeof(long))))
ledStatus[i] = 1; // Status zuruecksetzen
}
}
}
// Ausschalten
if (programmEnde == true)
{
delay(4000);
digitalWrite(neonLeds[0], LOW);
delay(300);
digitalWrite(neonLeds[1], LOW);
delay(5000);
digitalWrite(leds[0], LOW);
delay(5000);
digitalWrite(leds[1], LOW);
programmEnde = false;
}
}