// >> PINout, unvollstaenig << /* A0 A15 D0 D4 = SS fuer SD-Kart via Ethernet Shield D10 = SS fuer Ethernet Controller D11 = DS18S20 1-Wire Sensor D20 = SDA I2C D21 = SCL I2C D50 = MISO (Ethernet) = ICSP 1 D51 = MOSI = ICSP 4 D52 = SCK D53 = Hardware SS */ //____________________________________________________________________________________ //____________________________________________________________________________________ //____________________________________________________________________________________ // DEFINITIONEN //____________________________________________________________________________________ //ETHERNET #include #include char formkey[] = "dFpHMG1zbzAxXXXXXXXXXXXX"; //Replace with your GoogleKey byte mac[] = { 0x00, 0x6A, 0x43, 0xC0, 0xA0, 0x6C}; //Replace with your Ethernet shield MAC byte ip[] = { 192,168,168,001}; //The Arduino device IP address - fiktive IP //byte subnet[] = { 255,255,255,0}; byte gateway[] = { 169, 254,001,010}; //Internet des Internetstellenden Computers - fiktive IP byte server[] = { 173,194,70,139 }; // Google IP //byte server[] = { 209,85,229,101 }; // Google IP //Client client(server, 80); EthernetClient client; //Arduino ist als Client definiert int zeitpkt_letzte_uebertragung=0; //Hilfsvariable die den Minutenzeitpkt der letzten ¸bertragung anzeigt int uebertragungsfrequenz = 120; //H‰ufigkeit der ‹bertragung in sekunden long vorhin=0; //____________________________________________________________________________________ //ECHTZEIT und LICHT-RELAY #include #include "RTClib.h" RTC_Millis RTC; int minutenUhrzeit; int Lichtpin = 28; int Dimmpin = 32; //____________________________________________________________________________________ //DEFINITIONEN DER PARAMETER F‹R MESSUNGEN (IN VOLT)MITTELS DES TEMPERATURF‹HLERS #include // Temperaturfuehler auf Digital Pin 11 OneWire ds(11); // on pin 11 //____________________________________________________________________________________ //DEFINITIONEN DER PARAMETER ZUR ZURODNUNG VON OHM-INTERVALLEN ZU BESTIMMTEN FALLNUMMERN // Definition von Temperaturen int adc_key_val[2] ={24, 27}; //Entspricht in C∞ 27, 24 //Ordnet den Temp-Intervallen eine Bewertung zu. char msgs[3][18] = {"Kalt", " OK ", "Warm" }; // Variable, die Temp-Intervalle eine Fallnummer zuordnet int key; // Variable, die sicherstellt, dass nur dann ein Programm gestartet wird, wenn sich der gemessene Wertebereich ge‰ndert hat. //Hilfswert = 6, damit beim ersten Durchlauf die If-Schleife des Programmabschnittes ("ZUORDNEN BESTIMMTER AKTIONEN ZU DEN DER Temp-INTERVALLEN ZUGEORDNETEN FALLNUMMERN") //durchgef¸hrt werden kann. int oldkey = 6; // Anzahl der F‰lle (der 6. Fall wird im Unterprogramm "getKey" definiert). int NUM_KEYS = 3; //____________________________________________________________________________________ //DEFINITIONEN DER DIGITALEN PINS // Zuordnung der digitalen Pins entsprechend der Wertebereiche int digitalPin[6] = {31, 33, 35, 48, 100, 40}; //drei ersten PinNr. f¸r dioden, drei letzten respektiv die PinNr. f¸r die entsprechenden Relays. //Pin = 100 steht f¸r einen nicht vergebenen Pin //____________________________________________________________________________________ //DEFINITIONEN DER PARAMETER DAS LCD-DISPLAY #include //Digitalbib f¸r das LCD-Display /* ALTE Pinverteilung, ALLE Digital: * LCD RS pin to digital pin 8 ** LCD RS pin to digital pin 0 * LCD Enable pin to digital pin 9 ** LCD Enable pin to digital pin 1 * LCD D4 pin to digital pin 4 ** LCD D4 pin to digital pin 2 * LCD D5 pin to digital pin 5 ** LCD D5 pin to digital pin 3 * LCD D6 pin to digital pin 6 ** LCD D6 pin to digital pin 4 * LCD D7 pin to digital pin 2 (vorher 7) ** LCD D7 pin to digital pin 5 * LCD BL pin to digital pin 10 (bzw. 13?) ** LCD BL pin to +5V * KEY pin to analogl pin 0 */ LiquidCrystal lcd(0, 1, 2, 3, 6, 5); //____________________________________________________________________________________ //DEFINITIONEN DER PARAMETER F‹R DIE LCD-TASTEN char msgs_taste[5][20] = {"Right Key OK ", "Select Key OK ", "Up Key OK ", "Down Key OK ", "Left Key OK" }; //int adc_taste_val[5] ={50, 200, 400, 600, 800 }; int adc_taste_val[5] ={50, 400, 500, 600, 750 }; int adc_taste_in; int taste=-1; int alte_taste=-1; int NUM_KEYS_TASTEN = 5; //____________________________________________________________________________________ //DEFINITIONEN DER PARAMETER ZUR MANUELLEN ‹BERBR‹CKUNG DER AKTIONSSSCHLEIFE int ueberbrueckung_luefter = 0; //‹berbr¸ckungsparameter f¸r den l¸fter int ueberbrueckung_heizen = 0;//‹vberbr¸ckungsparameter f¸r den Heizstab //____________________________________________________________________________________ //DEFINITIONEN DER PARAMETER ZUR HERUNTERK‹HLUNG int temp_krit_kuehlen = 26; //Definiert kritischen wert in Temp, bei dessen unterschreitung die herunterk¸hlung beendet sein soll. (26 Grad) int herunterkuehlen; //Pr¸fvariable, die besagt, ob die herunterk¸hlung eingeschaltet ist. //____________________________________________________________________________________ //DEFINITIONEN DER PARAMETER ZUM HOCHHEIZEN int temp_krit_heizen = 25; //Definiert kritischen wert in Temp, bei dessen unterschreitung das Hochheizen beendet sein soll. (25 Grad) int hochheizen; //Pr¸fvariable, die besagt, ob das Hochheizen eingeschaltet ist. //____________________________________________________________________________________ //DEFINITIONEN DER ZUSTANDSVARIABLEN ZUR ÜBERTRAGUNG INS INTERNET int binaerstatus_licht; int binaerzustand_luefter; int binaerzustand_heizstab; char an_aus[2][4] ={"AUS", "AN"};//Vektor um den Zustandsbinärcode NULL und EINS in Worte zu übertragen //____________________________________________________________________________________ //DEFINITIONEN DER HILFSVARIABLEN int relay; //Variable um den RelayPin im PinVektor zu errechnen. //unsigned long value; // zur messung der Durchlaufzeit. //____________________________________________________________________________________ //____________________________________________________________________________________ //____________________________________________________________________________________ // uint8_t i; float average; void setup(void) { //Serial.begin(9600); pinMode(digitalPin[0], OUTPUT); pinMode(digitalPin[1], OUTPUT); pinMode(digitalPin[2], OUTPUT); pinMode(digitalPin[3], OUTPUT); pinMode(digitalPin[4], OUTPUT); //wird nicht benutzt pinMode(digitalPin[5], OUTPUT); pinMode(digitalPin[6], OUTPUT); pinMode (10, OUTPUT); pinMode (53, OUTPUT); //____________________________________________________________________________________ //LCD-Display Setup lcd.clear(); lcd.begin(16, 2); lcd.setCursor(0,0); lcd.print(F("Starting...")); delay(1000); lcd.clear(); //____________________________________________________________________________________ //Licht-Steuerung mit Echt-Zeit Wire.begin(); RTC.begin(DateTime(__DATE__, __TIME__)); pinMode(Lichtpin, OUTPUT); pinMode(Dimmpin, OUTPUT); //if (! RTC.isrunning()) { //Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled // RTC.adjust(DateTime(__DATE__, __TIME__)); //} //_______________________________________________________________________________________ //ETHERNETSETUP //Ethernet.begin(mac, ip , gateway); Ethernet.begin(mac, ip, gateway); delay(1000); // Serial.println("connecting..."); // Auf Clients warten } //____________________________________________________________________________________ //____________________________________________________________________________________ //____________________________________________________________________________________ // HAUPTPROGRAMM void loop(void) { byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; float celsius; if ( !ds.search(addr)) { // Serial.println("No more addresses."); // Serial.println(); ds.reset_search(); delay(250); return; } Serial.print("ROM ="); for( i = 0; i < 8; i++) { Serial.write(' '); Serial.print(addr[i], HEX); } if (OneWire::crc8(addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return; } Serial.println(); // the first ROM byte indicates which chip switch (addr[0]) { case 0x10: Serial.println(" Chip = DS18S20"); // or old DS1820 type_s = 1; break; case 0x28: Serial.println(" Chip = DS18B20"); type_s = 0; break; case 0x22: Serial.println(" Chip = DS1822"); type_s = 0; break; default: Serial.println("Device is not a DS18x20 family device."); return; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad Serial.print(" Data = "); Serial.print(present,HEX); Serial.print(" "); for ( i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); Serial.print(data[i], HEX); Serial.print(" "); } Serial.print(" CRC="); Serial.print(OneWire::crc8(data, 8), HEX); Serial.println(); // convert the data to actual temperature unsigned int raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; // 9 bit resolution default if (data[7] == 0x10) { // count remain gives full 12 bit resolution raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms // default is 12 bit resolution, 750 ms conversion time } celsius = (float)raw / 16.0; // Serial.print(" Temperature = "); // Serial.print(" Celsius, "); // Serial.print(celsius); // Serial.print(fahrenheit); // Serial.println(" Fahrenheit"); //____________________________________________________________________________________ // BILDSCHIRMAUSGABE(LCD): Aktuelle Temperatur lcd.setCursor(0, 0); lcd.print(celsius); lcd.setCursor(5,0); lcd.print(F("C")); // lcd.setCursor(7,0);lcd.print(key); //___________________________________________________________________________________ //ZEITANZEIGE lcd.setCursor (7, 0); DateTime now = RTC.now(); // >> Null fuer 1-09 Stunden if (now.hour() < 10) { lcd.print('0'); lcd.print(now.hour(), DEC); } else { lcd.print(now.hour(), DEC); } lcd.print(':'); // >> Null fuer 1-09 Minuten if (now.minute() < 10) { lcd.print('0'); lcd.print(now.minute(), DEC); } else { lcd.print(now.minute(), DEC); } lcd.print(':'); // >> Null fuer 1-09 Sekunden if (now.second() < 10) { lcd.print('0'); lcd.print(now.second(), DEC); } else { lcd.print(now.second(), DEC); } //___________________________________________________________________________ // An-& Ausschalten der Beleuchtung mit Dimmer in Echtzeit // DateTime now = RTC.now(); minutenUhrzeit=now.hour() * 60 + now.minute(); //Umrechnung Stunden in Minuten //Serial.print("MinutenZeit ist "); //Serial.println(minutenUhrzeit); //Serial.println(now.unixtime()); // lcd.setCursor(0, 1); // lcd.print(now.unixtime()); if (minutenUhrzeit >= 480 && minutenUhrzeit < 840) //Wenn Uhrzeit zwischen 8 Uhr und 14h00: { digitalWrite(Lichtpin, HIGH); //Licht anschalten binaerstatus_licht = 1; //Serial.println(" AN"); } else if (minutenUhrzeit >= 960 && minutenUhrzeit < 1290) //Wenn Uhrzeit zwisch 16h00 und 21h30: { digitalWrite(Lichtpin, HIGH); //Licht anschalten binaerstatus_licht = 1; //Serial.println(" AN"); } else { digitalWrite(Lichtpin, LOW); // Sonst Licht ausschalten binaerstatus_licht = 0; //Serial.println("aus"); } //____________________________________________________________________________________ //TASTENDRUCK adc_taste_in = analogRead(0); // Lese den Wert auf AnalogPin 0 taste = get_taste(adc_taste_in); // Unterprogramm get_taste(): Ordne gelesenen Analogwert einer Nummer bzw. Taste zu. if (taste != alte_taste) // Ermittle ob eine Taste gedr¸ckt wurde. { // ueberpr¸fung ob ermittelte Taste wirklich gedr¸ckt wurde. delay(50); // warte eine gewisse Zeit und... adc_taste_in = analogRead(0); // ...lese den Wert auf AnalogPin 0 taste = get_taste(adc_taste_in); // Unterprogramm get_taste(): Ordne gelesenen Analogwert einer Nummer bzw. Taste zu. if (taste != alte_taste) { alte_taste = taste; // Starte Programmaktionen f¸r bestimmte Tasten switch(taste) { case 2: //Key right lcd.setCursor(0, 1); lcd.print(F("case 2")); delay(1000); lcd.clear(); /* //taste_nachricht(); //Unterprogramm um entsprechend der gedr¸ckten taste eine Nachricht auf das LCD-Display zu schicken. // Errechnung der Statistik temp_int = minuten_vektor[1]; //holt abgespeicherten Wert t-2 aus dem Speicher temp = (float) temp_int;//Konvertierung float in int. temp = temp / 100; //Umrechnung in Zahl mit Kommastellen stat_minute = celsius - temp;//Ver‰nderung aktuell im Vergleich zu t-1 //Ausgabe der Statistik auf das LCD-Display lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("C-Diff t-2 Stde:")); lcd.setCursor(0, 1); lcd.print(stat_minute); delay(2000); lcd.clear(); reset_aktionsschleife(); //Unterprogramm dass sicherstellt, dass die aktionsschleife wieder aktiv werden kann, auch wenn die temperatur sich nicht geˆndert hat. */ break; case 1: //resetTaste___funktioniert nicht. //taste_nachricht(); //Unterprogramm um entsprechend der gedr¸ckten taste eine Nachricht auf das LCD-Display zu schicken. // Errechnung der Statistik lcd.setCursor(0, 1); lcd.print(F("case 1")); delay(1000); lcd.clear(); reset_aktionsschleife(); //Unterprogramm dass sicherstellt, dass die aktionsschleife wieder aktiv werden kann, auch wenn die temperatur sich nicht geˆndert hat break; case 0: //Key Up //taste_nachricht(); //Unterprogramm um entsprechend der gedr¸ckten taste eine Nachricht auf das LCD-Display zu schicken. // Errechnung der Statistik //temp_int = minuten_vektor[0]; //holt abgespeicherten Wert t-1 aus dem Speicher //temp = (float) temp_int;//Konvertierung float in int. //temp = temp / 100; //Umrechnung in Zahl mit Kommastellen //stat_minute = celsius - temp;//Ver‰nderung aktuell im Vergleich zu t-1 //Ausgabe der Statistik auf das LCD-Display //lcd.clear(); //lcd.setCursor(0, 0); //lcd.print(F("C-Diff t-1 Stde:"); //lcd.setCursor(0, 1); //lcd.print(stat_minute); //delay(2000); //lcd.clear(); //programm zum an/ausschalten der manuellen ¸berbr¸ckung, mit entsprechendem Hinweis auf dem LCD-bildschirm. lcd.clear(); switch(ueberbrueckung_luefter) {case 0: ueberbrueckung_luefter = 1; lcd.setCursor(0, 1); lcd.print(F("Stop Luefter: AN")); delay(2000); lcd.clear(); break; case 1: ueberbrueckung_luefter = 0; lcd.setCursor(0, 1); lcd.print(F("StopLuefter: AUS")); delay(2000); lcd.clear(); break; } reset_aktionsschleife(); //Unterprogramm dass sicherstellt, dass die aktionsschleife wieder aktiv werden kann, auch wenn die temperatur sich nicht geˆndert hat break; case 4: //Key down //taste_nachricht(); //Unterprogramm um entsprechend der gedr¸ckten taste eine Nachricht auf das LCD-Display zu schicken. // Errechnung der Statistik //temp_int = minuten_vektor[2]; //holt abgespeicherten Wert t-3 aus dem Speicher //temp = (float) temp_int;//Konvertierung float in int. //temp = temp / 100; //Umrechnung in Zahl mit Kommastellen //stat_minute = celsius - temp;//Ver‰nderung aktuell im Vergleich zu t-3 //Ausgabe der Statistik auf das LCD-Display //lcd.clear(); //lcd.setCursor(0, 0); //lcd.print(F("C-Diff t-3 Stde:"); //lcd.setCursor(0, 1); //lcd.print(stat_minute); //delay(2000); //lcd.clear(); //reset_aktionsschleife(); //Unterprogramm dass sicherstellt, dass die aktionsschleife wieder aktiv werden kann, auch wenn die temperatur sich nicht geˆndert hat //break; //programm zum an/ausschalten der manuellen ¸berbr¸ckung_heizen, mit entsprechendem Hinweis auf dem LCD-bildschirm. lcd.clear(); switch(ueberbrueckung_heizen) {case 0: ueberbrueckung_heizen = 1; lcd.setCursor(0, 1); lcd.print(F("Stop Heizen: AN ")); delay(2000); lcd.clear(); break; case 1: ueberbrueckung_heizen = 0; lcd.setCursor(0, 1); lcd.print(F("Stop Heizen: AUS")); delay(2000); lcd.clear(); break; } reset_aktionsschleife(); //Unterprogramm dass sicherstellt, dass die aktionsschleife wieder aktiv werden kann, auch wenn die temperatur sich nicht geˆndert hat break; case 3: //Key left lcd.print(F("Links")); //>>> BLAU /*lcd.clear(); lcd.setCursor(2, 1); lcd.print(F("Es ist "); lcd.print(now.hour(), DEC); lcd.print(':'); lcd.print(now.minute(), DEC); */ delay(1000); lcd.clear(); /* //taste_nachricht(); //Unterprogramm um entsprechend der gedr¸ckten taste eine Nachricht auf das LCD-Display zu schicken. // Errechnung der Statistik temp_int = minuten_vektor[3]; //holt abgespeicherten Wert t-4 aus dem Speicher temp = (float) temp_int;//Konvertierung float in int. temp = temp / 100; //Umrechnung in Zahl mit Kommastellen stat_minute = celsius - temp;//Ver‰nderung aktuell im Vergleich zu t-4 //Ausgabe der Statistik auf das LCD-Display lcd.clear(); lcd.setCursor(0, 0); lcd.print(F("C-Diff t-4 Stde:")); lcd.setCursor(0, 1); lcd.print(stat_minute); delay(2000); lcd.clear(); */ reset_aktionsschleife(); //Unterprogramm dass sicherstellt, dass die aktionsschleife wieder aktiv werden kann, auch wenn die temperatur sich nicht geˆndert hat break; } } } //____________________________________________________________________________________ // ZUWEISUNG VON Temp-INTERVALLEN ZU BESTIMMTEN FALLNUMMERN. // Starte hierzu das Unterprogramm get_key() siehe weiter unten. key = get_key(celsius); //____________________________________________________________________________________ // BILDSCHIRMAUSGABE(SERIELL): BEWERTUNG GEMƒfl DER DEM OHM-INTERVALL ZUGEORDNETEN FALLNUMMER: Beispiel: "Viel zu heifl!" //Serial.print(msgs[key]); //Serial.println(); //____________________________________________________________________________________ // ZUORDNEN BESTIMMTER AKTIONEN ZU DEN DER Temp-INTERVALLEN ZUGEORDNETEN FALLNUMMERN if (herunterkuehlen == 1) //Kriterium der Abschaltung der Herunterk¸hlung: muss eingeschaltet { if (ueberbrueckung_luefter == 1) // UND NOTABSCHALTUNG ist aktiviert {digitalWrite(digitalPin[0], LOW); //Schalte die Lampe des Falls 0 aus. digitalWrite(digitalPin[3], HIGH); // Schalte Relay des Falls 0 aus. (=0 +3). Relay wird deaktiviert, wenn HIGH-Signal herunterkuehlen = 0; } if (celsius < temp_krit_kuehlen)// ODER kritischer temperaturwert wurde unterschritten, !!!weil messungen in temp, muss der kritische wert ¸berschritten sein!!! { digitalWrite(digitalPin[0], LOW); ////Schalte die Lampe des Falls 0 aus. digitalWrite(digitalPin[3], HIGH);// Schalte Relay des Falls 0 aus. (=0 +3). Relay wird deaktiviert, wenn HIGH-Signal herunterkuehlen = 0; } } if (hochheizen == 1) //Kriterium der Abschaltung des Hochheizen: muss eingeschaltet { if (ueberbrueckung_heizen == 1) // UND NOTABSCHALTUNG ist aktiviert { digitalWrite(digitalPin[2], LOW); //Schalte die Lampe des Falls 2 aus. digitalWrite(digitalPin[5], HIGH); // Schalte Relay des Falls 2 aus. (= 2 +3). Relay wird deaktiviert, wenn HIGH-Signal hochheizen = 0; } if (celsius > temp_krit_heizen)// ODER kritischer temperaturwert wurde ¸berschritten, !!!weil messungen in temp, muss der kritische wert unterschritten sein!!! { digitalWrite(digitalPin[2], LOW);//Schalte die Lampe des Falls 2 aus. digitalWrite(digitalPin[5], HIGH); // Schalte Relay des Falls 2 aus. (= 2 +3). Relay wird deaktiviert, wenn HIGH-Signal hochheizen = 0; } } if (key != oldkey) // Stellt sicher dass nur dann ein Programm gestartet wird, wenn sich der gemessene Wertebereich ge‰ndert hat. { if (oldkey == 1) // stellt sicher das die Rote Lampe "sehr heifl" nicht ungewollt abgeschaltet wird. { digitalWrite(digitalPin[oldkey], LOW); //Schalte die Lampe der alten Fallnummer aus. } //_________________________________________________________________ // Starte Programmaktionen f¸r bestimmte Temperaturbereiche switch(key) { case 0: // Fall: "Viel zu warm", Blinke Rot. if(ueberbrueckung_luefter == 0) //wenn manuelle ‹berbr¸ckung ausgeschaltet, dann schalte lampe automatisch an. { //Serial.print("FALL 0: Blinke Rot"); digitalWrite(digitalPin[key], HIGH); relay = key + 3; //ergibt die relayNr. im Pinvektor //Serial.println(digitalPin[relay]); digitalWrite(digitalPin[relay], LOW); //damit Relay aktiv wird, muss ein LOW-Signal gesendet werden. herunterkuehlen = 1; //Aktiviert Pr¸fvariable zum herunterk¸hlen } lcd_anzeige_notstop_an();// Unterprogramm zur Anzeige der Temperaturbewertung oder hinweis, dass notstopp eingeschaltet ist LCD_Bewertung(); //Unterprogramm, dass die Bewertung der Temperatur auf das LCD-Display schreibt. oldkey = key; break; case 1: // Fall: "Temperatur OK", Blinke Gr¸n. //Serial.print("FALL 1, Blinke Gr¸n"); digitalWrite(digitalPin[key], HIGH); lcd_anzeige_notstop_an();// Unterprogramm zur Anzeige der Temperaturbewertung oder hinweis, dass notstopp eingeschaltet ist //LCD_Bewertung(); //Unterprogramm, dass die Bewertung der Temperatur auf das LCD-Display schreibt. oldkey = key; break; case 2: // Fall: "Zu Kalt", Blinke Gelb. //Serial.print("FALL 2, Blinke Gelb."); if(ueberbrueckung_heizen == 0) //wenn manuelle ‹berbr¸ckung ausgeschaltet, dann schalte lampe automatisch an. { //Serial.print("FALL 0: Blinke Gelb"); digitalWrite(digitalPin[key], HIGH); relay = key + 3; //ergibt die relayNr. im Pinvektor digitalWrite(digitalPin[relay], LOW); //damit Relay aktiv wird, muss ein LOW-Signal gesendet werden. hochheizen = 1; //Aktiviert Pr¸fvariable zum herunterk¸hlen } lcd_anzeige_notstop_an();// Unterprogramm zur Anzeige der Temperaturbewertung oder hinweis, dass notstopp eingeschaltet ist //LCD_Bewertung(); //Unterprogramm, dass die Bewertung der Temperatur auf das LCD-Display schreibt. oldkey = key; break; //case 3: // Fall: "In Ordnung", Blinke Gr¸n. //Serial.print("FALL 3, Blinke Gr¸n."); //digitalWrite(digitalPin[key], HIGH); //lcd_anzeige_notstop_an();// Unterprogramm zur Anzeige der Temperaturbewertung oder hinweis, dass notstopp eingeschaltet ist //LCD_Bewertung(); //Unterprogramm, dass die Bewertung der Temperatur auf das LCD-Display schreibt. //oldkey = key; //break; //case 4: // Fall: "Kalt aber gr¸n", Blinke Gelb. // Serial.print("FALL 4, Blinke Gelb"); //digitalWrite(digitalPin[key], HIGH); //lcd_anzeige_notstop_an();// Unterprogramm zur Anzeige der Temperaturbewertung oder hinweis, dass notstopp eingeschaltet ist //LCD_Bewertung(); //Unterprogramm, dass die Bewertung der Temperatur auf das LCD-Display schreibt. //oldkey = key; //break; //case 5: // Fall: "Viel zu kalt", Blinke Rot. //Serial.print("FALL 5, Blinke Rot"); //digitalWrite(digitalPin[key], HIGH); //lcd_anzeige_notstop_an();// Unterprogramm zur Anzeige der Temperaturbewertung oder hinweis, dass notstopp eingeschaltet ist //LCD_Bewertung(); //Unterprogramm, dass die Bewertung der Temperatur auf das LCD-Display schreibt. //oldkey = key; //break; } } //____________________________________________________________________________________ //Übertragung der Messwerte via Internet if (now.unixtime() - vorhin >= uebertragungsfrequenz )//Misst ob genug Zeit vergangen ist, um Werte erneut ins Internet zu senden (Unixtime ist eine Fortlaufende Zahl die Gesamtzeit seit 1. Jan. 1970 in sekunden angibt. { //Serial.println(now.unixtime() - vorhin); vorhin = now.unixtime(); //Speichert übertragungszeitpkt ab. //Umrechnung, damit die Temperatur mit Komma via der Variable "temperaturwert übermittelt werden kann. int zahl0=(int) celsius; zahl0 *= 100; float zahl1= celsius *100; int zahl2 = (int) zahl1; int nachkommastellen = zahl2 - zahl0; int vorkommastellen = (int) celsius; String temperaturwert; //Erstellt Zeichenkette der Temperatur mit Kommastellen, die später in die Übertragungszeichenkette eingefügt wird. temperaturwert+="";//löscht letzten Inhalt des Strings temperaturwert +=vorkommastellen; temperaturwert += ","; temperaturwert +=nachkommastellen; //Ermittlung der Zustände von Lüfter und Heizstab binaerzustand_luefter = zustandsermittlung(herunterkuehlen, ueberbrueckung_luefter); binaerzustand_heizstab = zustandsermittlung(hochheizen, ueberbrueckung_heizen); // Übertragungsstring bzw. -Kette "Data", wird im folgenden mit Informationen beschrieben, die übermittelt werden sollen. String data; data+="";//löscht letzten Inhalt des Strings data+="entry.0.single="; //Temperatur data+=temperaturwert; data+="&entry.1.single="; //Lichtstatus //data+=an_aus[binaerstatus_licht]; //Überträgt den Status in Worten data+=binaerstatus_licht; //Überträgt den Status im Binärcode data+="&entry.4.single=";// Heizungsstatus //data+=an_aus[binaerzustand_heizstab]; //Überträgt den Status in Worten data+=zustandsermittlung(hochheizen, ueberbrueckung_heizen); //Überträgt den Status im Binärcode data+="&entry.9.single=";// Lüfterstatus //data+=an_aus[binaerzustand_luefter]; //Überträgt den Status in Worten data+=zustandsermittlung(herunterkuehlen, ueberbrueckung_luefter); //Überträgt den Status im Binärcode data+="&submit=Submit"; //Eigentlich Übertragung des Datastrings der die Werte enthält: if (client.connect(server, 80)) //Wenn Verbinding zum Googleserver via Port 80 besteht { // Serial.println("connected"); client.print("POST /formResponse?formkey="); client.print(formkey); //formkey ist die ID der Googletabelle bzw. des Googleformblattes. client.println("&ifq HTTP/1.1"); client.println("Host: spreadsheets.google.com"); client.println("Content-Type: application/x-www-form-urlencoded"); client.println("Connection: close"); client.print("Content-Length: "); client.println(data.length()); client.println(); client.print(data);//Übertragung der Zeichenkette mit den Werten. delay(1000);//Wichtig um der Übertragung Zeit zu geben!!! client.println(); //delay(1000); /* Serial.print("POST /formResponse?formkey="); Serial.print(formkey); Serial.println("&ifq HTTP/1.1"); Serial.println("Host: spreadsheets.google.com"); Serial.println("Content-Type: application/x-www-form-urlencoded"); Serial.println("Connection: close"); Serial.print("Content-Length: "); Serial.println(data.length()); Serial.println(); Serial.print(data); Serial.println(); */ } if (!client.connected()) //Wenn keine Verbindung zustande gekommen ist, dann Abbruch { //Serial.println(); //Serial.println("disconnecting."); client.stop(); } } } //____________________________________________________________________________________ //____________________________________________________________________________________ //____________________________________________________________________________________ //DEFINITION VON VERWENDETEN UNTERPROGRAMME //____________________________________________________________________________________ // UNTERPROGRAMM ZUR ZUORDNUNG VON temp-BEREICHEN ZU BESTIMMTEN FALLNUMMERN int get_key(float tempw) { int k; for (k = 0; k < NUM_KEYS; k++) { if (tempw < adc_key_val[k]) { return k; } } if (k >= NUM_KEYS)k = 2; // Groesser als 27c (kleiner als 24 C) erhaelt die Fallnummer 2 return k; } //____________________________________________________________________________________ // UNTERPROGRAMM ZUM ANZEIGEN DER BEWERTUNG AUF DEM LCD-DISPLAY void LCD_Bewertung() { lcd.setCursor(0, 1); lcd.print(msgs[key]); } //____________________________________________________________________________________ // UNTERPROGRAMM ZUR ZUORDNUNG VON MESSWERTEN ZU BESTIMMTEN TASTENNUMMERN; siehe Unterprogramm "ZUORDNUNG VON OHM-BEREICHEN ZU BESTIMMTEN FALLNUMMERN" int get_taste(unsigned int input2) { int k2; for (k2 = 0; k2 < NUM_KEYS_TASTEN; k2++) { if (input2 < adc_taste_val[k2]) { return k2; } } if (k2 >= NUM_KEYS_TASTEN)k2 = -1; // Wenn keine taste gedr¸ckt wird, dann nimmt stellt dies hier sicher, dass die selbe taste mehrmals gedr¸ckt werden darf. return k2; } //____________________________________________________________________________________ // UNTERPROGRAMM ZUM ANZEIGEN EINER TASTENNACHTICHT AUF DEM LCD-DISPLAY void taste_nachricht() { lcd.clear(); lcd.setCursor(0, 1); lcd.print(msgs_taste[taste]); delay(2000); lcd.clear(); } //____________________________________________________________________________________ // UNTERPROGRAMM UM NACH DEM DRUCK EINER TASTE WIEDER IN DIE AKTIONSSCHLEIFE ZU KOMMEN void reset_aktionsschleife() { digitalWrite(digitalPin[oldkey], LOW); //stellt sicher dass nach dem reset des Pr¸fwertes der Aktionsschleife (oldkey) der digitalPin nicht einfriert. oldkey = 6; //reset des Pr¸fwertes; stellt sicher, dass die Aktionsschleife aktiv wird, auch wenn sich der temperaturbereich nicht ge‰ndert hat. } //____________________________________________________________________________________ // UNTERPROGRAMM ZUR PERMANENTEN ANZEIGE "NOTSTOP: AN" AUF DEM LCD-DISPLAY, wenn notstop aus, dann anzeige der normalen bewertung. void lcd_anzeige_notstop_an() { if(ueberbrueckung_luefter == 1 && ueberbrueckung_heizen == 1) { lcd.setCursor(0, 1); lcd.print(F("Alle Stops: AN ")); } if(ueberbrueckung_luefter == 1 && ueberbrueckung_heizen == 0) { lcd.setCursor(0, 1); lcd.print(F("Stop Luefter: AN")); } if(ueberbrueckung_luefter == 0 && ueberbrueckung_heizen == 1) { lcd.setCursor(0, 1); lcd.print(F("Stop Heizen: AN ")); } if(ueberbrueckung_luefter == 0 && ueberbrueckung_heizen == 0) { LCD_Bewertung();//Unterprogramm zum Anzeigen der Temperaturbewertung auf dem LCD-Display. } } //____________________________________________________________________________________ // UNTERPROGRAMM ZUr ERMITTLUNG DES AKTIVITÄTSZUSTANDES DES HEIZSTABES ODER LÜFTERS int zustandsermittlung(int normal, int notaus) { if (normal == 1 && notaus == 0) {return 1; } else {return 0;} }