// Webserver aus wg. Speicherproblemen// 04.05.2015: rudimentäre Dimmfunktion// 03.05.2015: Ausbaustufe = 32, LED #0 gibt es nicht mehr, automatisches Abschalten nach 500 Leerzyklen// 02.05.2015: Aufruf auch von bs-wiki möglich// 01.05.2015: Schalten über HTTP GET// 29.04.2015: Arduino als HTTP-Client
// 28.04.2015: Abfrage der seriellen Schnittstelle
// globale VariablenPinning Arduino & Schieberegister:// Arduino-Pin 3 als "Dimmer" verbunden mit OE des 74HC595 (dort Pin 13, Output Enable)byte outputEnablePin = 3;// Arduino-Pin 8 als shiftPin verbunden mit SH_CP des 74HC595(dort Pin 11, shift register clock input)
byte shiftPin = 8;
// Arduino-Pin 9 verbunden mit ST_CP des 74HC595(dort Pin 12, storage register clock input = latch pin)
byte storePin = 9;
// Arduino-Pin 10 verbunden mit DS des 74HC595(dort Pin 14, serial data input)
byte dataPin = 10;
// Elemente und LEDs:
// 24 32 ist die derzeitige Ausbaustufe, am Ende 120 144 LEDs// Hardware-Info: 12m²-PSE aus 6 Teildisplays, 144/6 = 24 LEDs/Teildisplay,// ... jedes Teildisplay angesteuert durch 3x8 Datenleitungen (3 Spalten, 8 Zeilen),// ... pro Spalte ein 8-bit-Schieberegister = 18 SR insgesamtbyte Ausbaustufe = 2432;
// Auswahl
// Ordnungszahl definiert Element 1...118
byte Auswahl = 0;
// 0 = Legende,existiert nicht
// 1 = Wasserstoff, 2 = Helium ...
// 131...137 = 1. - 7. Periode
// 141...148 = 1. - 8. Hauptgruppe
// 160 = Metalle
// 170 161 = Halbmetalle// 180 162 = Nichtmetalle
// 190 = fest
// 191 = flüssig
// 202 = Programm_y
// 203 = Programm_z
// 222 = Browserfenster umschalten auf Arduino-Auswahlmenü
// 254 = alles_aus
// 255 = alles_an
unsigned int led_aus[145];
// virtuelles Patchpanel: Zuordnung Ordungszahl/Pin, z. B. Natrium mit OZ 11 an *Pin 3*:
// Element_an_Pin[] nach steigender Ordungszahl notieren:
// TO DO wg. Speicherproblemen vorerst aus:
byte Anzahl_angeschaltete_LEDs = 0;
unsigned int t_gesamt_in_sek = millis() / 1000;
// TO DO: über Poti einstellenund von Pin einlesen oder über Webinterface
byte Eieruhr = 20; // Vorgabe der Einschaltdauer einer LED in Sekunden
int zyklus = 0; // loop-Zyklen// Debuggingint bremse = 0; // 1 ... 60000 Standardwert für Entschleunigung in ms zwischen einigen Befehlen zwecks Debugging
case 170161: Auswahl_Halbmetalle(); break; case 180162: Auswahl_Nichtmetalle(); break;
case 190: Auswahl_fest(); break;
case 191: Auswahl_liquid(); break;
case 202: Auswahl_Programm_y(); break;
case 203: Auswahl_Programm_z(); break;
// case 222: www(); break;
case 254: Auswahl_alles_aus(); break;
case 255: Auswahl_alles_an(); break;
case 131default: Auswahl_Periode // unbelegte Zahlen sind unsinnig und werden genullt: Serial.print(1, 2"KOMISCHE Auswahl: "); break Serial.println(Auswahl); default: Auswahl = 0; Led_andelay(Auswahl, 1bremse);
}
// vergesse die bisherige Auswahl, also nicht erneut schaltenTO DO: // Auswahl = 0; // for (int z = 1; z < Ausbaustufe; z++) { // delay(1000); // Led_an(zwenn Legende mit mehreren LED hinterleuchtet wird, diese Anzahl statt der "1); // delay(100); // // Led_an(z, 0);" einsetzen:
if (Anzahl_angeschaltete_LEDs > 1) {
Treppenlicht();
}
if (zyklus > 500) { // 999 // 1000-mal is nichts passiert, daher: Auswahl_alles_aus(); //TO DO: ggf. Sleep-Modus mit Bewegungsmelder zum Reaktivieren } Serial.println("------------------------------------"); delay(1000bremse);
void Auswahl_radioaktivAuswahl_Periode() { for byte anfang; byte ende; switch (byte z Auswahl) { case 131: anfang = 1; ende = 2; break; // 1. Periode: 1-H, 2-He case 132: anfang = 3; ende = 10; z < Ausbaustufebreak; case 133: anfang = 11; ende = 18; break; case 134: anfang = 19; ende = 36; break; z++) {if ((z case 135: anfang =37; ende = 43) || (z 54; break; case 136: anfang =55; ende = 61) || ((z >86; break; case 137: anfang = 84) && (z <87; ende = 118)) || (z ; break; // 7. Periode: Fr-Uuo case 138: anfang = 57; ende = 71; break; // Lanthanoide case 139: anfang =89; ende = 134) || 103; break; // Actinoide } for (byte z == 136)anfang; z < ende + 1; z++) { Led_an(z, 1); }
void Auswahl_biatomarAuswahl_Programm_x() {// 201 // z. Zt. Dimmer-Test for (byte z b = 10; z b < Ausbaustufe255; z+b = b +5) { if ((z == 1) || Dimmer(z == 7b) || (z == 8) || (z == 9) || (z == 17) || (z == 35) || (z == 53) || (z == 138) ) {; Led_an(z1, 1); }delay(1000);
// to doFunktion schaltet eine durch (Element) bestimmte LEDs an oder aus, // plant einen Ausschaltpunkt (led_aus[Element]) und merkt sich die Anzahl_angeschaltete_LEDs. // TO DO: switch Element/LED, z. B. bei Element 11 (Natrium) die 3. Led schalten
// patch it:
// Element=patch[Element];
zyklus = 0; // Schlafmodus beenden
Laufzeit_hhmmss();
Serial.print(Element);
Serial.print(" -> ");
Serial.println(an);
// TO DO: wenn Ausbaustufe 144 erreicht, diese LEDs immer anlassen:
// solange Ausbaustufe 144 noch nicht erreicht, ersatzweise Led #9:
// nur ausführen, wenn (an -> aus) oder (aus -> an), nicht bei (bleibt an) oder (bleibt aus)
Anzahl_angeschaltete_LEDs = Anzahl_angeschaltete_LEDs + an * 2 - 1; // Anz. = Anz. -1 oder +1
}
//}
led[Element] = an;
Serial.print(Anzahl_angeschaltete_LEDs);
Serial.print(" LEDs sind an: ");
for (byte z = 01; z < Ausbaustufe+ 1; z++) {
if (led[z]) {
Serial.print(z);
}
}
Serial.println("");
// nur für Fehlerabfrage
if (Anzahl_angeschaltete_LEDs > Ausbaustufe) {
Serial.println("F E H L E R : zuviele LEDs geschaltet!"); delay(30000bremse);
}
// spart Speicher: unsigned long led_Start zu byte einkürzen:
if (an) {
// led_Startzeit[Element] = t_gesamt_in_sek;
led_aus[Element] = t_gesamt_in_sek + Eieruhr; // vormerken: LED nach (Eieruhr) Sek. wieder ausschalten
}
resetPins();
// digitalWrite(storePin, LOW); for (byte i = 01; i < Ausbaustufe+ 1; i++) {
// Aktion passiert bei Wechsel von LOW auf HIGH
digitalWrite(shiftPin, LOW);
digitalWrite(shiftPin, HIGH);
}
// Wenn alle 8 Stellen im Register sind, jetzt das StorePin STCP
// von LOW auf HIGH, damit wird Registerinhalt an Ausgabepins
// kopiert und der Zustand an den LEDs sichtbar
// neues Muster einschalten:
digitalWrite(storePin, HIGH);
delay(100bremse);
// Serial.print(Element);
// Serial.print(". LED ist ");
// Serial.println(an);
Serial.println("--------------------");
delay(10bremse);}// **********************************************************************void Legende_an() { // TO DO: solange Ausbaustufe 144 noch nicht erreicht, ersatzweise Led #9: Led_an(9, 1); // wenn Ausbaustufe 144 erreicht, diese LEDs immer anlassen: // for (byte z = 121; z < 139; z++) { // Led_an(z, 1); // }