// Programm auf dem MEGA2560 vom 12.01.2017
// Einstellungen Zimmerbeleuchtung
// LED
const byte WHITE = 5; // Weiße LED an Pin 5
const byte RED = 2; // Rote LED an Pin 2
const byte GREEN = 3; // Grüne LED an Pin 3
const byte BLUE = 4; // Blaue LED an Pin 4
int FadeZeit = 150; // höherer Wert verlangsamt den Farbwechsel
byte w,r,g,b; // Variablen für Weiß, Rot, Grün, Blau
// Relais
const byte REL1 = 31; // Relais1 an Pin 31
const byte REL2 = 33; // Relais2 an Pin 33
const byte REL3 = 35; // Relais3 an Pin 35
const byte REL4 = 37; // Relais4 an Pin 37
byte c,d,e,f; // Variablen für die Relais der Zimmerbeleuchtung
// Taster
const byte pin1 = 25; // Taster Tag
const byte pin2 = 23; // Taster Nacht
const byte pin3 = 27; // Taster Mond
// eventuell weitere
byte Schalter1;
byte Schalter2;
byte Schalter3;
// eventuell weitere
unsigned long FadeMillis;
byte wSoll,rSoll,gSoll,bSoll;
byte cSoll,dSoll,eSoll,fSoll;
byte state;
// Einstellungen für Fernsehen und acht zeitgesteuerte Relais
// Relais
byte rels[] = {22, 24, 26, 28, 30, 32, 34, 36}; // Pins der Relais festlegen
// Zeiten für die Relais in Millisekunden festlegen
long reltakt[] = {360000, 420000, 300000, 360000, 480000, 460000, 720000, 540000}; // Minuten eingestellt
// merken der Schaltzeiten
long reltime[sizeof(rels)];
// Pins der LED für die Fernsehprogramme festlegen
byte pwmLED1 = 6; // Rot 1
byte pwmLED2 = 7; // Grün 1
byte pwmLED3 = 8; // Blau 1
byte pwmLED4 = 9; // Rot 2
byte pwmLED5 = 10; // Grün 2
byte pwmLED6 = 11; // Blau 2
byte pwmLED7 = 44; // Rot 3
byte pwmLED8 = 45; // Grün 3
byte pwmLED9 = 46; // Blau 3
//*************************************************************************************
void setup() {
// Zimmerbeleuchtung einstellen
// LEDs an
w = 255;
r = 255;
g = 255;
b = 255;
wSoll = 255;
rSoll = 255;
gSoll = 255;
bSoll = 255;
// Taster und Relais einstellen
pinMode(pin1, INPUT_PULLUP);
pinMode(pin2, INPUT_PULLUP);
pinMode(pin3, INPUT_PULLUP);
pinMode(REL1, OUTPUT);
digitalWrite(REL1, LOW);
pinMode(REL2, OUTPUT);
digitalWrite(REL2, LOW);
pinMode(REL3, OUTPUT);
digitalWrite(REL3, LOW);
pinMode(REL4, OUTPUT);
digitalWrite(REL4, LOW);
// alle Pins für Fernsehen und acht Relais auf Ausgang setzen
pinMode(pwmLED1, OUTPUT);
pinMode(pwmLED2, OUTPUT);
pinMode(pwmLED3, OUTPUT);
pinMode(pwmLED4, OUTPUT);
pinMode(pwmLED5, OUTPUT);
pinMode(pwmLED6, OUTPUT);
pinMode(pwmLED7, OUTPUT);
pinMode(pwmLED8, OUTPUT);
pinMode(pwmLED9, OUTPUT);
for (long i=0;i<sizeof(rels);i++)
{ pinMode(rels[i], OUTPUT);
digitalWrite(rels[i], HIGH);
}
}
// Berechnen der verwendeten Zeiten
boolean milliSekundenTakt(long dauer, long &alterWert){
// Parameter "dauer": Dauer einer Einschaltphase
// Parameter "alterWert": speichert die Variale millis() Timer
// Rückgabewert: true wenn die Zeit bis zum nächsten Umschalten abgelaufen ist, sonstfalse
if (millis() - alterWert < dauer) return false;
while (millis() - alterWert >= dauer) alterWert+=dauer;
return true;
}
// Relais nach Zeit schalten
void Ablaufplan() {
// Alle Relais folgen ihrem Ablaufplan
for (long i=0;i<sizeof(rels);i++) // Relais in Schleife durchgehen
{
if (milliSekundenTakt(reltakt[i],reltime[i])) // Takt für dieses Relais abgelaufen?
{
if (b<65) digitalWrite(rels[i],!digitalRead(rels[i])); // Relais schalten
else digitalWrite(rels[i],HIGH);
}
}
}
// Berechnen des flackern der Fernsehprogramme
void flimmernPwmPin() {
static long alterWert;
static int flimmerDauer = 200;
static byte flimmerHelligkeit1;
static byte flimmerHelligkeit2;
static byte flimmerHelligkeit3;
static byte flimmerHelligkeit4;
static byte flimmerHelligkeit5;
static byte flimmerHelligkeit6;
static byte flimmerHelligkeit7;
static byte flimmerHelligkeit8;
static byte flimmerHelligkeit9;
if (milliSekundenTakt(flimmerDauer,alterWert))
{
flimmerDauer = 1+random(5000); // Flimmerdauer als Zufallswert
flimmerHelligkeit1=random(65); // Rot
flimmerHelligkeit2=random(76); // Grün
flimmerHelligkeit3=random(56); // Blau
flimmerHelligkeit4=random(26); // Rot
flimmerHelligkeit5=random(36); // Grün
flimmerHelligkeit6=random(66); // Blau
flimmerHelligkeit7=random(46); // Rot
flimmerHelligkeit8=random(26); // Grün
flimmerHelligkeit9=random(56); // Blau
analogWrite(pwmLED1, flimmerHelligkeit1);
analogWrite(pwmLED2, flimmerHelligkeit2);
analogWrite(pwmLED3, flimmerHelligkeit3);
analogWrite(pwmLED4, flimmerHelligkeit4);
analogWrite(pwmLED5, flimmerHelligkeit5);
analogWrite(pwmLED6, flimmerHelligkeit6);
analogWrite(pwmLED7, flimmerHelligkeit7);
analogWrite(pwmLED8, flimmerHelligkeit8);
analogWrite(pwmLED9, flimmerHelligkeit9);
}
}
void dimmen(){
if(millis()-FadeMillis>FadeZeit){
FadeMillis=millis();
if(wSoll<w) w--;
if(wSoll>w) w++;
analogWrite(WHITE,w);
if(bSoll<b) b--;
if(bSoll>b) b++;
analogWrite(BLUE,b);
if(gSoll<g) g--;
if(gSoll>g) g++;
analogWrite(GREEN,g);
if(rSoll<r) r--;
if(rSoll>r) r++;
analogWrite(RED,r);
}
}
void schalten(){
if(cSoll>0) c=LOW;
else c=HIGH;
digitalWrite(REL1,c);
if(dSoll>0) d=LOW;
else d=HIGH;
digitalWrite(REL2,d);
if(eSoll>0) e=LOW;
else e=HIGH;
digitalWrite(REL3,e);
if(fSoll>0) f=LOW;
else f=HIGH;
digitalWrite(REL4,f);
}
//*************************************************************
void loop() {
// Programmaufrufe in der Dauerschleife
Schalter1 = digitalRead(pin1); // wertet Zustand des Tasters aus
Schalter2 = digitalRead(pin2);
Schalter3 = digitalRead(pin3);
if(Schalter1==LOW) state=1;
if(Schalter2==LOW) state=2;
if(Schalter3==LOW) state=3;
switch(state){
case 1:
//"Dunkelheit"
wSoll=0; //weiß wird dunkler
if(w<64) bSoll=0; //Blau beginnt abzudimmen wenn weiß bei 25%
if(b<128) gSoll=0; //Grün beginnt abzudimmen wenn Blau bei 50%
if(g<196) rSoll=0; //Rot beginnt abzudimmen wenn grün bei 75%
if(b<50) cSoll=1;
if(b<20) dSoll=1;
if(g<20) eSoll=1;
if(r<50) fSoll=1;
break;
case 2:
//"Tag"
rSoll=255; //Rot beginnt heller zu werden
if(r>50) fSoll=0;
if(r>64) gSoll=255, eSoll=0; //wenn rot bei 25% beginnt Grün heller zu werden
if(r>80) bSoll=255, dSoll=0; //kurz darauf wird auch Blau heller
if(b>150) cSoll=0;
if(r>150) wSoll=255; // und jetzt startet auch Weiß
break;
case 3:
//"Mondschein"
bSoll=64; //Blau auf 25% stellen
break;
}
//wenn am Analogport A0 ein Poti angeschlossen ist, folgende beiden Zeilen aktivieren
//FadeZeit = analogRead(A0);
//FadeZeit = map(FadeZeit,0,1023,20,300);
//Die Werte 20 und 300 geben den Regelbereich an und müssen dem eigenen Geschmack angepasst werden.
dimmen();
schalten();
Ablaufplan();
flimmernPwmPin();
}