Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // >> 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 <Ethernet.h>
- #include <SPI.h>
- 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 <Wire.h>
- #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 <OneWire.h>
- // 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 <LiquidCrystal.h> //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;}
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement