// **********************************************************************
// letzte Änderungen:
// 13.07. Bewegungsmelder, Standby neu
// 12.07. Modi schaltbar
// 11.07. Patchmodus gefixt
// 10.07. const Variablenumbennung
// 18.06. Weiterleitung kaputt? Abgleich mit 08.06., dort funzts
// 08.05.2015: Patch Panel fix
// 06.05.2015: Patch Panel aktiviert TO DO: aber irgendwie verschoben
// 05.05.2015: Anpassung an Mega 2560 wg. Speicherproblemen beim Uno
// 04.05.2015: rudimentäre Dimmfunktion
// KONSTANTEN
// Pinning Arduino:
// Arduino-Pin 2 mit IR-Sensor verbunden:
const byte IR_PIN = 2;
// Arduino-Pin 3 als "Dimmer" verbunden mit OE des 74HC595 (dort Pin 13, Output Enable):
const byte OUTPUT_ENABLE_PIN = 3;
// Arduino-Pin 7 mit Bewegungsmelder verbunden (dort Pin 2, Out):const byte BEWEGUNGSMELDER_PIN = 7;// Arduino-Pin 8 als SHIFT_PIN verbunden mit SH_CP des 74HC595 (dort Pin 11, shift register clock input):
const byte SHIFT_PIN = 8;
// Arduino-Pin 9 verbunden mit ST_CP des 74HC595 (dort Pin 12, storage register clock input = latch pin):
const byte STORE_PIN = 9;
// Arduino-Pin 10 verbunden mit DS des 74HC595 (dort Pin 14, serial data input):
const byte DATA_PIN = 10;
// ----------------------------------------------------------------------
// Internet:
byte mac[6] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical physikalische mac address-Adresse
byte ip[4] = { 192, 168, 178, 104 }; // ip in lan (that's what you need to use in your browser. ("192.168.178.104")
// Aufruf dann z. B. über http://192.168.178.104/?z=4
// Aufruf dann z. B. über http://192.168.178.104/?z=222
// "Arduino an IP 192..., zeige Auswahl an!"
byte gateway[4] = { 192, 168, 1, 1 }; // internet access Internetaccess via routerRouterbyte subnet[4] = { 255, 255, 255, 0 }; //subnet maskEthernetServer server(80); //server Server port
String readString;
// String URL = "http://www.bs-wiki.de/mediawiki/index.php?title=";
// Ausbaustufe 144 LEDs
const byte Ausbaustufe = 144; // 144
byte legende_anfang Anzahl_Legenden_LEDs = 0;byte Legende_anfang = 121;byte legende_ende Legende_ende = 139;byte Legenden_LEDs = 1 + legende_ende - legende_anfangboolean Patchmodus;// TO DOAuswahlmenü: vorerst ohne Patchenboolean patchmodus = 1;
// 0 = existiert nicht
// 1 = Wasserstoff, 2 = Helium ...118 = Uuo
// 131...137 = 1. - 7. Periode
// 141...148 = 1. - 8. Hauptgruppe
// 202 = Programm_y
// 203 = Programm_z
// 207 = Patchmodus
// 208 = Debugging-Modus
// 209 = Reset
// 210...215 = Helligkeit
// 254 = alles_aus
// 255 = alles_an
// Compilerfehler erforderdert Vergrößerung der Arrays um ein Feld, andernfalls Überlauf in andere Variablenboolean led[144Ausbaustufe + 1]= {0};unsigned int led_aus[144Ausbaustufe + 1];
// virtuelles Patchpanel: Zuordnung Ordungszahl/Pin, z. B. Natrium mit OZ 11 an *Pin 3*:
byte Pin_von_Element[145Ausbaustufe + 1] = { 0, 1, 137 , 2, 9, 97, 105, 113, 121, 129, 138 , 3, 10, 98, 106, 114, 122, 130, 139 , 4, 11, 19, 27, 35, 43, 51, 59, 67, 75, 83, 91, 99, 107, 115, 123, 131, 140 , 5, 12, 20, 28, 36, 44, 52, 60, 68, 76, 84, 92, 100, 108, 116, 124, 132, 141 , 6, 13, 23, 31, 39, 47, 55, 63, 71, 79, 87, 95, 103, 111, 119, 127, 21, 29, 37, 45, 53, 61, 69, 77, 85, 93, 101, 109, 117, 125, 133, 142 , 7, 14, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 22, 30, 38, 46, 54, 62, 70, 78, 86, 94, 102, 110, 118, 126, 134, 143, 15, 16, 17, 18, 25, 26, 33, 34, 41, 42, 49, 50, 57, 58, 65, 66, 73, 74, 81, 82, 89, 90, 135, 136, 144 , 8 };byte Element_an_Pin[145Ausbaustufe + 1] = { 0, 1, 3, 11, 19, 37, 55 // Pinning ohne eine "Led #0" //p1p2*p3*p4 p5 p6 p7 p8 - p9 p10 p11 p12 p13 p14 p15 p16 -p17 p18 p19 p20 p21 p22 p23 p24- , 87, 144, 4, 12, 20, 38, 56, 88, 119, 120, 121, 122, 21, 39, 71, 103, 57, 89 // // p25 p26 p27 p28 p29 p30 p31 p32-p33 p34 p35 p36 p37 p38 p39 p40-p41 p42 p43 p44 p45 p46 p47 p48 , 123, 124, 22, 40, 72, 104, 58, 90, 125, 126, 23, 41, 73, 105, 59, 91, 127, 128, 24, 42, 74, 106, 60, 92 // // p49 p50 p51 p52 p53 p54 p55 p56-p57 p58 p59 p60 p61 p62 p63 p64-p65 p66 p67 p68 p69 p70 p71 p72 , 129, 130, 25, 43, 75, 107, 61, 93, 131, 132, 26, 44, 76, 108, 62, 94, 133, 134, 27, 45, 77, 109, 63, 95 // // p73 p74 p75 p76 p77 p78 p79 p80-p81 p82 p83 p84 p85 p86 p87 p88-p89 p90 p91 p92 p93 p94 p95 p96 , 135, 136, 28, 46, 78, 110, 64, 96, 137, 138, 29, 47, 79, 111, 65, 97, 139, 140, 30, 48, 80, 112, 66, 98 // // p97p98 p99 p100p101p102 p103p104-p105p106p107p108p109p110p111p112-p113p114p115p116p117p118p119p120 , 5, 13, 31, 49, 81, 113, 67, 99, 6, 14, 32, 50, 82, 114, 68, 100, 7, 15, 33, 51, 83, 115, 69, 101 // //p121p122p123p124p125p126p127p128-p129p130p131p132p133p134p135 p136-p137p138p139p140p141p142p143p144 , 8, 16, 34, 52, 84, 116, 70, 102, 9, 17, 35, 53, 85, 117, 141, 142, 2, 10, 18, 36, 54, 86, 118, 143 };
// ----------------------------------------------------------------------
// Auswahl im laufenden Programm:
int Auswahl = 0; // 254
boolean neue_Auswahl;
boolean Bewegungsstatus = HIGH; // bei Systemstart Bewegung simulieren
byte Anzahl_angeschaltete_LEDs = 0;
// TO DO: über Poti einstellen und von Pin einlesen oder über Auswahl (180)
unsigned int Eieruhr = 20; // Vorgabe der Einschaltdauer einer LED in Sekunden
unsigned int Standby_Timer = 180; // Zeit in Sekunden bis zum Standby
const byte Standardhelligkeit = 127;
byte Helligkeit = Standardhelligkeit; // beliebiger Wert für Dimmer
byte Wunschhelligkeit = Standardhelligkeit; // durch Menüauswahl bestimmt
byte last_Element = 0;
int zyklus = 0; // loop-Zyklen
int serial_a = 0;
int serial_nr = 0;
// ----------------------------------------------------------------------
// Debugging
boolean Debug_Modus = 1; // mit Zusatzinfos über seriellen Monitor, kann über 208 umgeschaltet werden
int bremse = 0; // 1 ... 60000 Standardwert für Entschleunigung in ms zwischen einigen Befehlen zwecks Debugging
// ----------------------------------------------------------------------
// TODO: mehrstellige Zahlen abfragen
// const byte IR_PIN = 2;
// volatile damit es auch in INT funktioniert
volatile boolean bounced = 0;
const byte CODE_LEN = 40;
// **********************************************************************
void setup() {
pinMode(OUTPUT_ENABLE_PIN, OUTPUT); // Dimmer
analogWrite(OUTPUT_ENABLE_PIN, 255); // entspricht 5 Volt an OE und damit LEDs aus
Serial.begin(115200); // Kontrollausgabe über seriellen Monitor
Serial.flush(); // löscht den Inhalt des seriellen Puffers
// CHECK Fenster: es kommt Müll, wenn nicht 'kein Zeilenende' eingestellt ist!
// Pin 5 abfragen (analog, EMK) für Zufallszahl // randomSeed(analogRead(5)); // Ausgabe-Pins : 3, 8,9,10 auf Ausgabe: // pinMode(OUTPUT_ENABLE_PIN, OUTPUT); // Dimmer analogWrite(OUTPUT_ENABLE_PIN, 255); // entspricht 5 Volt an OE und damit LEDs aus
pinMode(STORE_PIN, OUTPUT);
pinMode(SHIFT_PIN, OUTPUT);
pinMode(DATA_PIN, OUTPUT);
// Eingabe-Pins: 2, 7: pinMode(BEWEGUNGSMELDER_PIN, INPUT);
// IR-Fernbedienung
pinMode(IR_PIN, INPUT);
Serial.print("Server ist an IP ");
Serial.println(Ethernet.localIP());
Anzahl_Legenden_LEDs = 1 + Legende_ende - Legende_anfang; Serial.print("Patchmodus ist Anzahl Legenden-LEDs: "); if (patchmodus) { Serial.println("eingeschaltet."Anzahl_Legenden_LEDs); } else { Serial.println("ausgeschaltet."); }
// TO DO: löschen:
// Element_an_Pin[] nach steigender Ordungszahl notieren:
// // // // Ordnungszahl
// }
 
// for (byte z = 1; z < 144 + 1; z++) {
// // Serial.print("Pin: ");
// }
// Serial.println();
reset();
// ***********************
// Kontrolle
Led_an(7, 1);
delay(bremse);
Legende_anPatchmodus_umschalten(); // kann über 207 umgeschaltet werden debugging(); // kann über 208 umgeschaltet werden
Serial.println("Jetzt startet die Loop-Schleife ......");
Serial.println("--------------------------------------");
delay(bremse);
}
// **********************************************************************
// Serial.print(zyklus);
// Serial.println(". Loop");
 
// vergesse die bisherige Auswahl, LED nicht erneut anschalten:
// Auswahl = 0;
// neue_Auswahl = 0;
// horche an IR-FB (Interrupt), der seriellen Schnittstelle und am Ethernet-Shield
// erfrage Element; nach Ordnungszahl o. ä. auswählen:
// z.B. Nr. OZ 1 - Wasserstoff: serielleserielle_Schnittstelle_abfragen(); wwwwww_abfragen(); Bewegungsmelder_abfragen();
if (neue_Auswahl) {
zyklus = 0; // Schlafmodus beenden neue_Auswahl = 0; last_call = Laufzeit_in_sekAuswahl_auswerten(); Serial.print("neue Auswahl von "); Serial.println(Input); // delay(4000); Serial.println(Auswahl); Serial.println(); switch (Auswahl) { case 1 ... 118: Led_an(Auswahl, 1); break; case 131 ... 139: Auswahl_Periode(); break; // = 1. - 7. Periode, Lanthanoide, A. case 141 ... 148: Auswahl_Hauptgruppe(); break; // = 1. - 8. Hauptgruppe case 160: Auswahl_Metalle(); break; case 161: Auswahl_Halbmetalle(); break; case 162: Auswahl_Nichtmetalle(); break; case 180: Eieruhr_switchen(); break; // auf 180 oder 20 Sekunden case 190: Auswahl_fest(); break; case 191: Auswahl_liquid(); break; case 192: Auswahl_gas(); break; case 193: Auswahl_radioaktiv(); break; case 194: Auswahl_biatomar(); break; case 200: Auswahl_Bingo(); break; case 201: Auswahl_Programm_x(); break; case 202: Auswahl_Programm_y(); break; case 203: Auswahl_Programm_z(); break; case 209: reset(); break; case 210 ... 215: Auswahl_Helligkeit(); break; // case 222: www(); break; case 254: Auswahl_alles_aus(); break; case 255: Auswahl_alles_an(); break; default: // unbelegte Zahlen sind unsinnig und werden genullt: Serial.println("keine neue Auswahl"); // Auswahl = 0; } Auswahl = 0; // delay(3000);
}
if (Anzahl_angeschaltete_LEDs > Legenden_LEDsAnzahl_Legenden_LEDs) {
Treppenlicht();
}
// **********************************************************************
// ############### Funktionen nach ABC ##############################
// **********************************************************************
void Auswahl_auswerten()
{
Bewegungsstatus = HIGH;
zyklus = 0; // Schlafmodus beenden
neue_Auswahl = 0;
last_call = Laufzeit_in_sek();
if (Debug_Modus) {
Serial.print("neue Auswahl von ");
Serial.println(Input);
Serial.println(Auswahl);
Serial.println();
}
switch (Auswahl) {
case 1 ... 118: Led_an(Auswahl, 1); break;
case 131 ... 139: Auswahl_Periode(); break; // = 1. - 7. Periode, Lanthanoide, A.
case 141 ... 148: Auswahl_Hauptgruppe(); break; // = 1. - 8. Hauptgruppe
case 160: Auswahl_Metalle(); break;
case 161: Auswahl_Halbmetalle(); break;
case 162: Auswahl_Nichtmetalle(); break;
case 180: Eieruhr_switchen(); break; // auf 180 oder 20 Sekunden
case 190: Auswahl_fest(); break;
case 191: Auswahl_liquid(); break;
case 192: Auswahl_gas(); break;
case 193: Auswahl_radioaktiv(); break;
case 194: Auswahl_biatomar(); break;
case 200: Auswahl_Bingo(); break;
case 201: Auswahl_Programm_x(); break;
case 202: Auswahl_Programm_y(); break;
case 203: Auswahl_Programm_z(); break;
case 207: Patchmodus_umschalten(); break;
case 208: debugging(); break;
case 209: reset(); break;
case 210 ... 215: Auswahl_Helligkeit(); break;
// case 222: www_abfragen(); break;
case 254: Auswahl_alles_aus(); break;
case 255: Auswahl_alles_an(); break;
default: // unbelegte Zahlen sind unsinnig und werden genullt:
Serial.println("keine neue Auswahl");
// Auswahl = 0;
}
// vergesse die bisherige Auswahl, LED nicht erneut anschalten:
Auswahl = 0;
}
// **********************************************************************
void Auswahl_alles_an() { // 255
// **********************************************************************
void Auswahl_alles_aus() {
Helligkeit = 0;
Dimmer();
// schaltet alle LEDs außer die für die Legende aus
Serial.println("alle_Elemente_aus");
Serial.println("alle_Elemente sind aus");
Legende_an();
Helligkeit = Standardhelligkeit;
Dimmer();
}
// **********************************************************************
Serial.println(zufall);
Led_an(zufall, 1);
delay(bremse);
}
// **********************************************************************
void Auswahl_Helligkeit() {
// 210 ... 215
byte Helligkeit Wunschhelligkeit = 5 + 50 * (Auswahl - 210);
// 210 -> 5, 211 -> 55, ... 215 -> 255
Helligkeit = Wunschhelligkeit; Dimmer(Helligkeit);
}
// **********************************************************************
void Auswahl_Metalle() { // 160
for (byte z = 1; z < Ausbaustufe + 1; z++) {
if ((z == 3) || (z == 4) || (z == 11) || (z == 12) || (z == 13) || ((z >= 19) && (z <= 31))
// **********************************************************************
void Auswahl_Programm_x() { // 201
// z. Zt. -TestPSE schwellend aufleuchten lassen // delayAuswahl_alles_an(5000); for (int b byte a = 0; b a <= 2555; b a = b a + 151)
{
for (byte b = 5; b <= 255; b = b + 1) { Helligkeit = b; Dimmer(b); delay(10); } Led_anfor (byte b = 255; b >= 5; b = b - 1, 1) { Helligkeit = b; Dimmer(); delay(30010); }
}
Led_anHelligkeit = Wunschhelligkeit; Dimmer(1, 0);
}
// **********************************************************************
void Auswahl_Programm_y() { // 202
unsigned int Eieruhr_2 = Eieruhr; // Standardwert merken und neu festlegen
Eieruhr = 13;
Serial.println("Flackermann");
for (byte z = 1; z < Ausbaustufe + 1; z++) {
Led_an(zufall, 1);
Treppenlicht();
delay(100);
}
Eieruhr = Eieruhr_2; // Standardwert zurückschreiben
}
// **********************************************************************
void Bewegungsmelder_abfragen() { // Falls längere Zeit keine Auswahl getroffen wurde oder keine Bewegung messbar war, // wird der Bewegungsmelder abgefragt. // Bei Bewegung bleiben die LEDs an. if (((Laufzeit_in_sek() > (last_call + Standby_Timer)) || (Bewegungsstatus == LOW))) { Bewegungsstatus = digitalRead(BEWEGUNGSMELDER_PIN); if ((Bewegungsstatus == LOW) && (neue_Auswahl == 0)) { Helligkeit = 0; last_call = 0; // wenn Helligkeit auf 0 gesetzt wurde } else { last_call = Laufzeit_in_sek(); Helligkeit = Wunschhelligkeit; } Dimmer(); }}// **********************************************************************void debugging() { // 208 Debug_Modus = -(Debug_Modus - 1); Serial.print("Debugging ist "); if (Debug_Modus) { Serial.print("ein"); } else { Serial.print("aus"); } Serial.println("geschaltet. Umschalten: 208");}// **********************************************************************void Dimmer(byte Helligkeit) // 0 to 255// Funktion merkt sich Helligkeitswert für LEDs, ausbaubedingt z. Zt. nur Einheitswert für alle SchieberisterSchieberegister
// 0 = dunkel, weil 0% Einschaltdauer, 255 = volle Leistung, weil 100% ED
{
return t_gesamt_in_sek;
}
 
// void Laufzeit_hhmmss() {
// t_gesamt_in_sek = millis() / 1000;
// die 27. Led (physikalisch) schalten. Zuordnung Pin/Element:
byte Pin = Element; // Probebetrieb ohne Patchmodus: OZ 22 = Pin 22
if (patchmodusPatchmodus) { // Normalfall: OZ 22 = Pin 27
Pin = Pin_von_Element[Element];
}
 
// mitzählen, wieviel LEDs insgesamt an sind:
// nur ausführen, wenn (an -> aus) oder (aus -> an), nicht bei (bleibt an) oder (bleibt aus)
}
led[Pin] = an;
// Zwischenbilanz für Kontrolle
// Serial.print(Anzahl_angeschaltete_LEDs);
// Serial.print(" LEDs sind an: ");
// for (byte z = 1; z < Ausbaustufe + 1; z++) {
// if (led[z]) {
// }
// }
// Serial.println();
// // nur für Fehlerabfrage
// if (Anzahl_angeschaltete_LEDs > Ausbaustufe) {
led_aus[Element] = Laufzeit_in_sek() + Eieruhr; // vormerken: LED nach (Eieruhr) Sek. wieder ausschalten
last_Element = Element; // welches Element wurde zuletzt angeschaltet?
if (Debug_Modus) { Serial.print("Element "); Serial.print(Element); Serial.print(" -> Pin "); Serial.println(Pin); }
}
resetPins();
// digitalWrite(STORE_PIN, LOW);
for (byte i = 1; i < Ausbaustufe + 1; i++) {
// Aktion passiert bei Wechsel von LOW auf HIGH
// Jetzt den Wert der aktuellen Stelle ans Datenpin DS anlegen
digitalWrite(DATA_PIN, led[i]);
// Dann ShiftPin SHIFT_PIN SHCP von LOW auf HIGH, damit wird der Wert
// am Datenpin ins Register geschoben.
digitalWrite(SHIFT_PIN, HIGH);
}
// Wenn alle Stellen im Register sind, jetzt das StorePin STORE_PIN STCP
// von LOW auf HIGH, damit wird Registerinhalt an Ausgabepins
// kopiert und der Zustand an den LEDs sichtbar
 
//analogWrite(STORE_PIN, 254);
// neues Muster einschalten:
digitalWrite(STORE_PIN, HIGH);
// TO DO: bei Sondergruppe die anderen ausblenden, z. B. Metalle an,
// dann Halb- u. Nichtmetalle aus
for (byte z = legende_anfangLegende_anfang; z < legende_ende Legende_ende + 1; z++) {
Led_an(z, 1);
}
}
// **********************************************************************
void Patchmodus_umschalten() { // 207 Patchmodus = -(Patchmodus - 1); reset(); Serial.print("Patchmodus ist "); if (Patchmodus) { Serial.print("ein"); } else { Serial.print("aus"); } Serial.println("geschaltet. Umschalten: 207");}// **********************************************************************void reset() {// 209 Serial.println("********* Reset *********");
resetPins();
Helligkeit = 0; Dimmer(0);
Eieruhr = 20;
Anzahl_angeschaltete_LEDs = 0;
for (byte i = 1; i < Ausbaustufe + 1; i++) {
Led_an(i, 0); // led[i] = 0; // digitalWrite(DATA_PIN, led[i]); // digitalWrite(SHIFT_PIN, HIGH);
}
Anzahl_angeschaltete_LEDs = 0; Helligkeit = Standardhelligkeit; Dimmer(127); // digitalWrite(STORE_PIN, HIGH);
Legende_an();
Auswahl = 0;
}
// **********************************************************************
void Treppenlicht() { // Serial.println("Treppenlicht"); // schaltet die LED nach (Eieruhr) Sek. wieder aus // t_gesamt_in_sek = Laufzeit_in_Sek(); for (byte z = 1; z < Ausbaustufe + 1; z++) { byte Element = z; if (patchmodus) { // Normalfall: OZ 22 = Pin 27 Element = Element_an_Pin[z]; } if (led[z]) { // max. Einschaltzeit überschritten? if (Laufzeit_in_sek() > led_aus[Element]) { // Legenden-LEDs immer an lassen: if (Element < legende_anfang || Element > legende_ende) { Led_an(Element, 0); } } } } delay(bremse); // Legende_an();}// **********************************************************************void serielleserielle_Schnittstelle_abfragen() {
if (Serial.available()) {
Serial.println("Ich bin www-taub!");
}
}
 
// **********************************************************************
void wwwTreppenlicht() { // schaltet eine LED nach [Eieruhr] Sek. wieder aus if (Debug_Modus) { Serial.println("Treppenlicht"); Serial.print("Laufzeit in s = "); Serial.println(Laufzeit_in_sek()); // Zwischenbilanz für Kontrolle Serial.print(Anzahl_angeschaltete_LEDs); Serial.print(" LEDs sind an, davon "); Serial.print(Anzahl_Legenden_LEDs); Serial.println(" anzahl_legenden_leds"); Serial.println(); } for (byte z = 1; z < Ausbaustufe + 1; z++) { byte Element = z; if (Patchmodus) { // Normalfall: OZ 22 = Pin 27 Element = Element_an_Pin[z]; } if (led[z]) { // falls an: max. Einschaltzeit überschritten? if (Laufzeit_in_sek() > led_aus[Element]) { // Legenden-LEDs immer an lassen, sonst Ausschalten: if (Element < Legende_anfang || Element > Legende_ende) { Led_an(Element, 0); // Ausschalten } } } }}// **********************************************************************void www_abfragen() {
// Create a client connection
// Serial.print("Ich horche, ob www ...");
}
if (Debug_Modus) { Serial.print("IR-Code: "); Serial.println(code); }
// Serial.print(" = ");
byte i_code = B00000000;
}
if (mehrstellig == 0) {
if (Debug_Modus) { Serial.print("IR-Auswahl: "); Serial.println(Auswahl); Serial.println(); }
Auswahl = IR_Auswahl;
// IR_Auswahl = 0;
Serial.println(Auswahl);
Serial.println();
neue_Auswahl = 1;
Input = "Fernbedienung";
Änderungen – BS-Wiki: Wissen teilen

Änderungen