// 2017: to do / Idee Uhrenfunktion, Std. gemäß OZ 1-24, Minuten OZ 1-59 als Herzblinker, z.B. 7:45 als N:Rh, volle Stunden mit 1 und 59, bei h = m Herzblinker links und rechts von h// - DeT-Pause// 15.07. www-Schaltaufruf mittels Port Forwarding// 14.07. Code säubern// 13.07. Bewegungsmelder, Standby neu// 12.07. Modi schaltbar// 11.07. Patchmodus gefixt// 10.07. const Variablenumbennung// 08.07. serieller Input in Unterprogramm, www gekürzt// 07.07. Fernbedienung mit Interrupt// 05.07. Fernbedienung, Serial.begin(115200);// 23.06. Reset nach Standby// 21.06. Weiterleitung i. O.// 18.06. Weiterleitung kaputt? Abgleich mit 08.06., dort funzts// 08.05.2015: Patch Panel fix// 06.05.2015: Patch Panel aktiviert aber irgendwie verschoben// 05.05.2015: Anpassung an Mega 2560 wg. Speicherproblemen beim Uno// 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 Variablen:// 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// TO DO: vor Ort anzupassen:byte ip[4] = { 192, 168, 178, 104 }; // ip in lan IP im **lokalen** Netzwerk// Aufruf dann im Browser z. B. über http://192.168.178.104/?z=4// "Arduino an IP 192..., schalte Led Nr. 4 an!"// Falls ein "echter", also **globaler** www-Aufruf ermöglicht werden soll, muss im Router eine Portweiterleitung eingerichtet werden.// Bei meiner Fritzbox 7270 (that's what you need to use in your browserRouter-IP ist 31. ("19.122.16) über Internet:Freigaben:Portfreigabe mit den Einstellungen:// andere Anwendungen, TCP, Port 80, an IP-Adresse 192.168.178.104. Die lokale IP hier im Sketch bleibt unverändert,// allerdings kann dann der Schaltaufruf ebenso mit "http://31.19.122.16/?z=4")erfolgen.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;
// globale VariablenString URL = "http:// Arduinowww.bs-Pin verbunden mit SH_CP des 74HC595byte shiftPin wiki.de/mediawiki/index.php?title= 8";// Arduino-Pin verbunden mit ST_CP des 74HC595---------------------------------------------------------------------// LED-Wand:byte storePin // Hardware-Info: 12m²-PSE aus 6 Teildisplays, 144/6 = 9;24 LEDs/Teildisplay,// ... jedes Teildisplay angesteuert durch 3x8 Datenleitungen (3 Spalten, 8 Zeilen),// Arduino... pro Spalte ein 8-bit-Pin verbunden mit DS des 74HC595byte dataPin Schieberegister = 10;18 SR insgesamt// Pinning Schieberegister:
Serial.begin(9600115200); // 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! // Ausgabe-Pins: 3, 8, 9, 10: pinMode(OUTPUT_ENABLE_PIN, OUTPUT); // Pin Dimmer analogWrite(OUTPUT_ENABLE_PIN, 255); // entspricht 5 abfragen Volt an OE und damit LEDs aus pinMode(analogSTORE_PIN, EMKOUTPUT) für Zufallszahl; randomSeedpinMode(analogReadSHIFT_PIN, OUTPUT); pinMode(5)DATA_PIN, OUTPUT); // Eingabe-Pins 8,9: 2,10 auf Ausgabe7: pinMode(storePinBEWEGUNGSMELDER_PIN, OUTPUTINPUT); // IR-Fernbedienung pinMode(shiftPinIR_PIN, OUTPUTINPUT); pinModeattachInterrupt(dataPin0, OUTPUTdecodeIR, FALLING); //FALLING for when the Digitalpin 2 goes from high to low. Serial.println("PSE"); Serial.println("--------------------------------");
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip, gateway, subnet);
// give the Ethernet shield 3 seconds to initialize:
delay(3000);
server.begin();
Serial.print("server is at Server ist an IP ");
Serial.println(Ethernet.localIP());
Anzahl_Legenden_LEDs = 1 + Legende_ende - Legende_anfang; Serial.print("Anzahl Legenden-LEDs: "); Serial.println(Anzahl_Legenden_LEDs); resetPinsSerial.println(); // TO DO: löschen: // alle Pins auf LOWElement_an_Pin[] nach steigender Ordungszahl notieren:
// Switchen, Element_an_Pin[] nach steigender Ordungszahl merken:
// TO DO wg. Speicherproblemen vorerst aus: // for (byte z = 01; z < 144+ 1; z++) {
// delay(10000); // *********************** // LED Nr. 0 (Legende) immer an, ist gleichzeitig Kontrollleuchte für aktives Board: Led_an(0, 1); delay(1000); // für Testphase LEDs LED von Element = 7 im setup Setup einschalten, später in loop: // Element = 7; // blau
Led_an(7, 1);
delayPatchmodus_umschalten(1000); Serial.println("alle_Elemente_an"); Auswahl_alles_an(); Serial.println("alle_Elemente sind an"); delay(3000); Serial.println("alle_Elemente_aus"); // kann über 207 umgeschaltet werden Auswahl_alles_ausdebugging(); Serial.println("alle_Elemente sind aus"); delay(1000); // Serial.println("alle_Elemente Bingo");// Auswahl_Bingo();kann über 208 umgeschaltet werden Serial.println("Setup fertig, jetzt startet die loopLoop-Schleife ......"); Serial.println("----------------------------------------------------"); delay(3000);
case 170161: Auswahl_Halbmetalle(); break; case 162: Auswahl_Nichtmetalle(); break; case 180: Auswahl_NichtmetalleLED_Eieruhr_switchen(); break; // auf 180 Sekunden oder LED_Eieruhr_normal
case 190: Auswahl_fest(); break;
case 191: Auswahl_liquid(); break;
case 202: Auswahl_Programm_y(); break;
case 203: Auswahl_Programm_z(); break;
case 207: Patchmodus_umschalten(); break;
case 208: debugging(); break; // Debugging-Modus
case 209: reset(); break;
case 210 ... 215: Auswahl_Helligkeit(); break;
// 222 = Browserfenster umschalten auf Arduino-Auswahlmenü
// case 222: www_abfragen(); break;
case 254: Auswahl_alles_aus(); break;
case 255: Auswahl_alles_an(); break;
case 131default: // unbelegte Zahlen sind unsinnig und werden genullt: Serial.println("keine neue Auswahl"); } // vergesse die bisherige Auswahl, LED nicht erneut anschalten: Auswahl_Periode Auswahl = 0;}// **********************************************************************void Auswahl_alles_an() { // 255 Serial.println("alle_Elemente_an"); for (byte z = 1; z < Ausbaustufe + 1; z++) { Led_an(z, 1); } Serial.println("alle_Elemente sind an");}// **********************************************************************void Auswahl_alles_aus() { Helligkeit = 0; Dimmer(); // schaltet alle LEDs außer die für die Legende aus Serial.println("alle_Elemente_aus"); for (byte z = 1; z < Ausbaustufe + 1; z++) { Led_an(z, 20); } Serial.println("alle_Elemente sind aus"); Legende_an(); Helligkeit = Standardhelligkeit; Dimmer();}// **********************************************************************void Auswahl_biatomar() { Serial.println("Auswahl_biatomar"); break for (byte z = 1; z < Ausbaustufe + 1;z++) { default:if ((z == 1) || (z == 7) || (z == 8) || (z == 9) || (z == 17) || (z == 35) || (z == 53) || (z == 138) ) { Led_an(Auswahlz, 1); }
Serial.println("Halbmetalle"); for (byte z = 1; z < Ausbaustufe+ 1; z++) { if ((z == 5) || (z == 14) || (z == 32) || (z == 33) || (z == 34) || (z == 51) || (z == 52) || (z == 85) || (z == 135)) {
void Auswahl_biatomarBewegungsmelder_abfragen() { for (byte z = 1; z < Ausbaustufe; z++) {// Falls längere Zeit keine Auswahl getroffen wurde oder keine Bewegung messbar war, // wird der Bewegungsmelder abgefragt. // Bei Bewegung bleiben die LEDs an. if ((z == 1(Laufzeit_in_sek() || > (z == 7last_call + Standby_Timer)) || (z Bewegungsstatus == 8LOW) || )) { Bewegungsstatus = digitalRead(z == 9BEWEGUNGSMELDER_PIN) || ; if ((z Bewegungsstatus == 17LOW) || && (z neue_Auswahl == 350) || (z == 53) || (z { Helligkeit =0; last_call = 138) ) 0; // wenn Helligkeit auf 0 gesetzt wurde } else { Led_anlast_call = Laufzeit_in_sek(z, 1); Helligkeit = Wunschhelligkeit;
void Auswahl_Programm_yunsigned int Laufzeit_in_sek() { unsigned int t_gesamt_in_sek = millis() / 1000; // millis() gibt den Wert in Millisekunden als 'unsigned int' Datentyp zurück, berechnet seitdem das Arduino // Board das aktuelle Programm gestartet hat. return t_gesamt_in_sek;
void Auswahl_Programm_zLed_an(byte Element, boolean an) { // Funktion schaltet durch (Element) bestimmte Pins (= LEDs) an oder aus, // plant einen Ausschaltpunkt (led_aus[Element]) und merkt sich die Anzahl_angeschaltete_LEDs. // 'Element' ist die OZ, 'an' der Schaltzustand 0/1 // 'pin' ist der tatsächliche Anschlusspunkt der LED-Matrix, z. B. bei Element 22 (Titan, logisch) // die 27. Led (physikalisch) schalten. Zuordnung Pin/Element: byte Pin = Element; // Probebetrieb ohne Patchmodus: OZ 22 = Pin 22 if (Patchmodus) { // 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) if (an != led[Pin]) { Anzahl_angeschaltete_LEDs = Anzahl_angeschaltete_LEDs + an * 2 - 1; // Anz. = Anz. -1 oder +1 } led[Pin] = an; // for (byte z = 1; z < Ausbaustufe + 1; z++) { // if (led[z]) { //// Serial.print("p_"); //// Serial.print(z); //// Serial.print("-"); // } // } // // nur für Fehlerabfrage // if (Anzahl_angeschaltete_LEDs > Ausbaustufe) { // Serial.println("F E H L E R : zuviele LEDs geschaltet!"); // delay(bremse); // } // spart Speicher: unsigned long led_Start zu byte einkürzen: if (an) { led_aus[Element] = Laufzeit_in_sek() + LED_Eieruhr; // vormerken: LED nach (LED_Eieruhr) Sek. wieder ausschalten last_Element = Element; // welches Element wurde zuletzt angeschaltet? if (Debug_Modus) { Serial.print("LED von Element "); Serial.print(Element); Serial.print(" -> Pin "); Serial.print(Pin); Serial.println(" ist an."); Serial.println("--------------------"); } } resetPins(); // Schieberegister // serielles Einlesen, alle LEDs werden neu geschaltet for (byte i = 1; i < Ausbaustufe + 1; i++) { // Aktion passiert bei Wechsel von LOW auf HIGH digitalWrite(SHIFT_PIN, LOW); // Jetzt den Wert der aktuellen Stelle ans Datenpin DS anlegen digitalWrite(DATA_PIN, led[i]); // Dann 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 STORE_PIN STCP // von LOW auf HIGH, damit wird Registerinhalt an Ausgabepins // kopiert und der Zustand an den LEDs sichtbar // neues Muster einschalten: digitalWrite(STORE_PIN, HIGH);
void Auswahl_PeriodeLegende_an(byte anfang, byte ende) { // diese LEDs immer anlassen: // TO DO: bei Sondergruppe die anderen ausblenden, z. B. Metalle an, // dann Halb- u. Nichtmetalle aus for (byte z = anfangLegende_anfang; z < endeLegende_ende + 1; z++) {
void Auswahl_BingoTreppenlicht() { // TO DO: evtlschaltet eine LED nach [LED_Eieruhr] Sek. wieder aus if (Debug_Modus) { Serial.println("Treppenlicht"); Serial.print("Laufzeit in s = "); Serial.println(Laufzeit_in_sek()); Serial.print(Anzahl_angeschaltete_LEDs); Serial.print(" LEDs sind an, davon "); Serial.print(Anzahl_Legenden_LEDs); Serial.println(" Legenden-LEDs"); Serial. nur 1x ohne die Schleifeprintln(); } for (byte z = 1; z < Ausbaustufe+ 1; z++) { byte zufall Element = randomz; if (1, AusbaustufePatchmodus){ // Normalfall: OZ 22 = Pin 27 Element = Element_an_Pin[z]; } if (led[z]) { // setzt 'zufall' mit einer Zufallszahlfalls an: max. Einschaltzeit überschritten? if (Laufzeit_in_sek() > led_aus[Element]) { // zwischen 1 und Ausbaustufe gleichLegenden-LEDs immer an lassen, sonst Ausschalten: Serial.println if (zufallElement < Legende_anfang || Element > Legende_ende); { Led_an(zufallElement, 10); // Ausschalten } } delay(500);}
Serial.println(readString); //print to serial monitor for debugingdebugging // normalerweise kommt von Browser: "GET /z=[pos] HTTP/1.1" String stringOne = readString; int pos = 1 2 + readStringstringOne.indexOf('z=');
Serial.println(pos);
String zahl = readString.substring(pos);
Serial.println(zahl);
Auswahl = zahl.toInt();
neue_Auswahl = 1;
zahl = String(Auswahl);
Serial.print("Auswahl:");
Serial.println(Auswahl);
// delay(1000)Input = "www";
client.println("HTTP/1.1 200 OK"); //send new page
client.println("Content-Type: text/html");
client.println();
client.println("<HTML>");
client.println("<HEAD>"zahl); client.println("<TITLE>Periodensystem der Elemente</TITLEBR>"); client.printlnif ("</HEAD>"Auswahl == 0);{ client.println("<BODY>Auswahl unklar, Aufruf im Browser durch "); client.println("<H1>Periodensystem der Elemente<[IP]/H1>"); client?z=[Auswahl], z. B.println("<hr a href='http:/>"); client.println("<br />"); client192.println("<H2>Led auswählen</H2>"); client168.println("<br />"); client178.println("<a href=\"104/?z=4\"\"1'>[ 4 ]<http://a>"); client192.168.println("-"); client178.println("<a href=\"104/?z=7\"\">[ 7 ]1</a><br />"); client.println("<br /BR>"); client.println("<br />");} client.println("<a href=\"/?z=255\"\">[alle an]</a>"); clientCreated by Detlef Giesler.println("-"); client.println("Visit <a href=\"/?z=254\"\">[alle aus]</a><br />"); client.println("<p>Created by Detlef Giesler. Visit 'http://www.bs-wiki.de for more info!</p>"); clientmediawiki/index.println("<br php/222'>"); clientbs-wiki.println("de</BODYa>for more info!");
void Laufzeit_hhmmssdecodeIR() { t_gesamt_in_sek = millisif (bounced) / 1000{ return; // millis() gibt den Wert in Millisekunden als 'unsigned int' Datentyp zurück, berechnet seitdem das Arduino} // Board das aktuelle Programm gestartet hat.bounced = 1; // nullt bei ?? msstop all interrupts byte t_gesamt_in_h = millisnoInterrupts() / 3600000; byte t_gesamt_in_m = millis() / 60000 - t_gesamt_in_h * 60i; byte t_gesamt_in_s = millis() / 1000 - t_gesamt_in_m * 60; Serial.print(/for each "Laufzeit hh:mm:ss = bit");in the code Serial.printfor (t_gesamt_in_h)i = 0; Serial.print(":")i < CODE_LEN; Serial.print(t_gesamt_in_mi += 1);{ Serial.print //store the duration of the pulse (":"microseconds); Serial.print durations[i] = pulseIn(t_gesamt_in_sIR_PIN, HIGH, 20000); Serial.println();}// 100000 timeout // **********************************************************************void Led_anpulseIn(byte Elementpin, value, boolean antimeout) {liest einen Puls (HIGH oder LOW) auf einem Pin aus. // to do: switch Element/LEDZum Beispiel, wenn value gleich HIGH ist, z. B. bei Element 11 wartet pulseIn(Natrium) bis der Pin auf HIGH geht, startet die 3. Led schaltenZeit, // patch it:dann wird gewartet, bis der Pin auf LOW ist und die Zeit wird gestoppt. // Element=patch[Element]; Laufzeit_hhmmss(); SerialZurückgegeben wird die Länge des Puls in Mikrosekunden.print(Element); Serial.print(". LED Nach einer bestimmten Zeit wird geschaltet von "); Serial.print(led[Element]); Serial.print(" -> "); Serial.println(an); // mitzählen0 zurückgegeben, wieviel LEDs insgesamt an sind: // nur ausführen, wenn (an -> aus) oder (aus -> an), nicht bei (bleibt an) oder (bleibt aus) if (an != led[Element]) { Anzahl_angeschaltete_LEDs = Anzahl_angeschaltete_LEDs + an * 2 - 1; // Anz. = Anzkein Pulse kommt. -1 oder +1
}
led[Element] = an;//enable interrupts Serial.printinterrupts(Anzahl_angeschaltete_LEDs); Serial.printif (" LEDs sind anbounced) { bounced = 0; boolean sauberes_signal = 1; // optimistisch sein // 8 Adress-Bits + 8 invertierte Adress-Bits + 8 Kommando-Bits + 8 invertierte Kommando-Bits // erwartungsgemäß 8 Nullen: ") byte a_code = B00000000; for (byte z i = 01; z i < Ausbaustufe9; z+i += 1) { if switch (leddurations[zi]) { case 100 ... 840: bitSet(a_code, i - 1); break; // 560µs Pause ist 0-Bit default: sauberes_signal = 0; return; } } // Serial.printprintln(za_code); // erwartungsgemäß 8 Einsen: byte a_i_code = B00000000; for (i = 9; i < 17; i += 1) { Serialswitch (durations[i]) { case 1400 ...print2100: bitSet("a_i_code, i -"9);break; // 1690µs Pause ist 1-Bit default: sauberes_signal = 0; return; }
}
} // Serial.println(""a_i_code); // nur für Fehlerabfrage if (Anzahl_angeschaltete_LEDs > Ausbaustufe) {delay(30000); } // spart Speicher: unsigned long led_Start zu byte einkürzen if (an) { // led_Startzeit[Element] code = t_gesamt_in_sekB00000000; led_aus[Element] = t_gesamt_in_sek + Eieruhr; // vormerken: LED nach (Eieruhr) Sek. wieder ausschalten } resetPins(); digitalWrite(storePin, LOW);for (byte i = 017; i < Ausbaustufe25; i++= 1) { // Aktion passiert bei Wechsel von LOW auf HIGH Serial.print(i); digitalWrite // Serial.print(shiftPin, LOW" - "); // Jetzt den Wert der aktuellen Stelle ans Datenpin DS anlegen digitalWrite Serial.println(dataPin, leddurations[i]); // ALIAS digitalWrite Serial.println((dataPin, led[patchunsigned long)durations[i]]); // Dann ShiftPin SHCP von LOW auf HIGH, damit wird der Wert delay(3000); switch (durations[i]) { // am Datenpin ins Register geschoben case 100 ...840: bit = 0; break; // 560µs Pause ist 0-Bit digitalWrite case 1400 ... 2100: bitSet(shiftPincode, HIGHi - 17); }break; // Wenn alle 8 Stellen im Register sind, jetzt das StorePin STCP1690µs Pause ist 1-Bit // von LOW auf HIGH, damit wird Registerinhalt an Ausgabepins // kopiert und der Zustand an den LEDs sichtbar }
} if (Debug_Modus) { Serial.print("IR-Code: "); Serial.println(code); } //analogWrite Serial.print(storePin, 254" = "); // neues Muster einschalten byte i_code = B00000000; for (i = 25; i < 33; i += 1) { switch (durations[i]) { case 100 ... 840: digitalWritebitSet(storePini_code, HIGHi - 25);break; // 560µs Pause ist 0-Bit } } delay if (100i_code != code){ sauberes_signal = 0; return; } // Serial.printprintln(Elementi_code); // Serial.print(". LED ist sauberes_signal = "); // Serial.println(ansauberes_signal); Serial.println switch ("code) { case 22: IR_Auswahl = 0; break; case 12: IR_Auswahl = 1; break; case 24: IR_Auswahl = 2; break; case 94: IR_Auswahl = 3; break; case 8: IR_Auswahl = 4; break; case 28: IR_Auswahl = 5; break; case 90: IR_Auswahl = 6; break; case 66: IR_Auswahl = 7; break; case 82: IR_Auswahl = 8; break; case 74: IR_Auswahl = 9; break; case 7: IR_Auswahl = 210; break; // Vol-- case 9: IR_Auswahl = 213; break; // [EQ] -> mittlere Helligkeit case 21: IR_Auswahl = 215; break; // Vol++ case 69: IR_Auswahl = 254; break; // CH-alles aus case 70: IR_Auswahl = 200; break; // CH Zufallszahl ----------------")> Bingo case 71: IR_Auswahl = 255; delay(10) break;// CH+ alles an} case 64 : // **********************************************************************nextvoid resetPins switch (last_Element) { // Zuerst immer alle 3 Pins auf LOWElemente, Hauptgruppen, Perioden ... digitalWrite case 1 ... 118: IR_Auswahl = min(storePin118, LOWlast_Element + 1); break; digitalWrite case 131 ... 194: IR_Auswahl = min(shiftPin194, LOWlast_Element + 1); break; digitalWrite } break; case 68 : // prev IR_Auswahl = max(dataPin1, LOWlast_Element - 1);} break; case 25 : // **********************************************************************100+ als Init für mehrstellige Zahl mehrstellig = 1;void Treppenlicht() { IR_Auswahl = 0; Serial.println("Treppenlicht") break; case 13 : // schaltet die LED 200+ als Quit nach (Eieruhr) Sek. wieder ausmehrstelliger Zahl mehrstellig = 0; IR_Auswahl = letzte_IR_Auswahl; letzte_IR_Auswahl = 0; Laufzeit_hhmmss() break; for (byte z case 67: IR_Auswahl = 1202; z < Ausbaustufe break; z++) {// Play/Pause -> Programm_y } if (led[z]mehrstellig) { // max. Einschaltzeit überschritten? if (t_gesamt_in_sek > led_aus[z]IR_Auswahl < 10) { Led_an(z, 0)letzte_IR_Auswahl = letzte_IR_Auswahl * 10 + IR_Auswahl;