Advertisement
handyfreak

AQ Arduino

Nov 19th, 2012
321
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 33.19 KB | None | 0 0
  1. //  >> PINout, unvollstaenig  <<
  2. /*
  3. A0
  4. A15
  5.  
  6. D0
  7. D4  = SS fuer SD-Kart via Ethernet Shield
  8. D10 = SS fuer Ethernet Controller
  9. D11 = DS18S20 1-Wire Sensor
  10. D20 = SDA I2C
  11. D21 = SCL I2C
  12. D50 = MISO (Ethernet) = ICSP 1
  13. D51 = MOSI = ICSP 4
  14. D52 = SCK
  15. D53 = Hardware SS
  16. */
  17.  
  18. //____________________________________________________________________________________
  19. //____________________________________________________________________________________
  20. //____________________________________________________________________________________
  21.  
  22. // DEFINITIONEN
  23.  
  24. //____________________________________________________________________________________
  25. //ETHERNET
  26.  
  27. #include <Ethernet.h>
  28. #include <SPI.h>
  29.  
  30. char formkey[] = "dFpHMG1zbzAxXXXXXXXXXXXX"; //Replace with your GoogleKey
  31. byte mac[] = {   0x00, 0x6A, 0x43, 0xC0, 0xA0, 0x6C};  //Replace with your Ethernet shield MAC
  32. byte ip[] = {  192,168,168,001};  //The Arduino device IP address - fiktive IP
  33.  
  34. //byte subnet[] = { 255,255,255,0};
  35.  
  36. byte gateway[] = { 169, 254,001,010}; //Internet des Internetstellenden Computers - fiktive IP
  37.  
  38. byte server[] = { 173,194,70,139 }; // Google IP
  39. //byte server[] = { 209,85,229,101 }; // Google IP
  40.  
  41. //Client client(server, 80);
  42. EthernetClient client; //Arduino ist als Client definiert
  43. int zeitpkt_letzte_uebertragung=0; //Hilfsvariable die den Minutenzeitpkt der letzten ¸bertragung anzeigt
  44. int uebertragungsfrequenz = 120; //H‰ufigkeit der ‹bertragung in sekunden
  45. long vorhin=0;
  46.  
  47.  
  48. //____________________________________________________________________________________
  49. //ECHTZEIT und LICHT-RELAY
  50.  
  51. #include <Wire.h>
  52. #include "RTClib.h"
  53.  
  54.  
  55. RTC_Millis RTC;
  56.  
  57. int minutenUhrzeit;
  58. int Lichtpin = 28;
  59. int Dimmpin = 32;
  60.  
  61. //____________________________________________________________________________________
  62. //DEFINITIONEN DER PARAMETER F‹R MESSUNGEN (IN VOLT)MITTELS DES TEMPERATURF‹HLERS
  63.  
  64.  
  65. #include <OneWire.h>
  66.  
  67. // Temperaturfuehler auf Digital Pin 11
  68. OneWire  ds(11);  // on pin 11
  69.  
  70.  
  71. //____________________________________________________________________________________
  72. //DEFINITIONEN DER PARAMETER ZUR ZURODNUNG VON OHM-INTERVALLEN ZU BESTIMMTEN FALLNUMMERN  
  73.  
  74.  
  75. // Definition von Temperaturen
  76. int adc_key_val[2] ={24, 27}; //Entspricht in C∞ 27, 24
  77.  
  78. //Ordnet den Temp-Intervallen eine Bewertung zu.
  79. char msgs[3][18] = {"Kalt",
  80.                     " OK ",              
  81.                     "Warm"
  82.                     };
  83.  
  84. // Variable, die Temp-Intervalle eine Fallnummer zuordnet
  85. int key;
  86.  
  87.  
  88. // Variable, die sicherstellt, dass nur dann ein Programm gestartet wird, wenn sich der gemessene Wertebereich ge‰ndert hat.
  89. //Hilfswert = 6, damit beim ersten Durchlauf die If-Schleife des Programmabschnittes ("ZUORDNEN BESTIMMTER AKTIONEN ZU DEN DER Temp-INTERVALLEN ZUGEORDNETEN FALLNUMMERN")
  90. //durchgef¸hrt werden kann.
  91. int oldkey = 6;
  92.  
  93.  
  94. // Anzahl der F‰lle (der 6. Fall wird im Unterprogramm "getKey" definiert).
  95. int NUM_KEYS = 3;
  96.  
  97. //____________________________________________________________________________________
  98. //DEFINITIONEN DER DIGITALEN PINS
  99.  
  100.  
  101. // Zuordnung der digitalen Pins entsprechend der Wertebereiche
  102. 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.
  103.                                             //Pin = 100 steht f¸r einen nicht vergebenen Pin
  104.  
  105. //____________________________________________________________________________________
  106. //DEFINITIONEN DER PARAMETER DAS LCD-DISPLAY
  107.  
  108. #include <LiquidCrystal.h> //Digitalbib f¸r das LCD-Display
  109.  
  110.  
  111. /*
  112.  
  113.   ALTE Pinverteilung, ALLE Digital:
  114.  * LCD RS pin to digital pin 8
  115.  ** LCD RS pin to digital pin 0
  116.  * LCD Enable pin to digital pin 9
  117.  ** LCD Enable pin to digital pin 1
  118.  * LCD D4 pin to digital pin 4
  119.  ** LCD D4 pin to digital pin 2
  120.  * LCD D5 pin to digital pin 5
  121.  ** LCD D5 pin to digital pin 3
  122.  * LCD D6 pin to digital pin 6
  123.  ** LCD D6 pin to digital pin 4
  124.  * LCD D7 pin to digital pin 2 (vorher 7)
  125.  ** LCD D7 pin to digital pin 5
  126.  * LCD BL pin to digital pin 10 (bzw. 13?)
  127.  ** LCD BL pin to +5V
  128.  * KEY pin to analogl pin 0
  129.  
  130.  */
  131.  
  132. LiquidCrystal lcd(0, 1, 2, 3, 6, 5);
  133.  
  134. //____________________________________________________________________________________
  135. //DEFINITIONEN DER PARAMETER F‹R DIE LCD-TASTEN
  136.  
  137. char msgs_taste[5][20] = {"Right Key OK ",
  138.                     "Select Key OK    ",              
  139.                     "Up Key OK  ",
  140.                     "Down Key OK  ",
  141.                     "Left Key OK" };
  142.  
  143. //int adc_taste_val[5] ={50, 200, 400, 600, 800 };
  144. int adc_taste_val[5] ={50, 400, 500, 600, 750 };
  145.  
  146. int adc_taste_in;
  147.  
  148. int taste=-1;
  149.  
  150. int alte_taste=-1;
  151.  
  152. int NUM_KEYS_TASTEN = 5;
  153.  
  154. //____________________________________________________________________________________
  155. //DEFINITIONEN DER PARAMETER ZUR MANUELLEN ‹BERBR‹CKUNG DER AKTIONSSSCHLEIFE
  156.  
  157. int ueberbrueckung_luefter = 0; //‹berbr¸ckungsparameter f¸r den l¸fter
  158. int ueberbrueckung_heizen = 0;//‹vberbr¸ckungsparameter f¸r den Heizstab
  159.  
  160. //____________________________________________________________________________________
  161. //DEFINITIONEN DER PARAMETER ZUR HERUNTERK‹HLUNG
  162.  
  163. int temp_krit_kuehlen = 26; //Definiert kritischen wert in Temp, bei dessen unterschreitung die herunterk¸hlung beendet sein soll. (26 Grad)
  164. int herunterkuehlen; //Pr¸fvariable, die besagt, ob die herunterk¸hlung eingeschaltet ist.
  165.  
  166. //____________________________________________________________________________________
  167. //DEFINITIONEN DER PARAMETER ZUM HOCHHEIZEN
  168.  
  169. int temp_krit_heizen = 25; //Definiert kritischen wert in Temp, bei dessen unterschreitung das Hochheizen beendet sein soll. (25 Grad)
  170. int hochheizen; //Pr¸fvariable, die besagt, ob das Hochheizen eingeschaltet ist.
  171.  
  172. //____________________________________________________________________________________
  173.  
  174. //DEFINITIONEN DER ZUSTANDSVARIABLEN ZUR ÜBERTRAGUNG INS INTERNET
  175. int binaerstatus_licht;
  176. int binaerzustand_luefter;
  177. int binaerzustand_heizstab;
  178. char an_aus[2][4] ={"AUS", "AN"};//Vektor um den Zustandsbinärcode NULL und EINS in Worte zu übertragen
  179.  
  180. //____________________________________________________________________________________
  181. //DEFINITIONEN DER HILFSVARIABLEN
  182.  
  183. int relay; //Variable um den RelayPin im PinVektor zu errechnen.
  184. //unsigned long value; // zur messung der Durchlaufzeit.
  185.  
  186. //____________________________________________________________________________________
  187. //____________________________________________________________________________________
  188. //____________________________________________________________________________________
  189.  
  190.  
  191.  
  192. // uint8_t i;
  193.   float average;
  194.  
  195. void setup(void) {
  196.   //Serial.begin(9600);
  197.  
  198.   pinMode(digitalPin[0], OUTPUT);
  199.   pinMode(digitalPin[1], OUTPUT);
  200.   pinMode(digitalPin[2], OUTPUT);
  201.   pinMode(digitalPin[3], OUTPUT);
  202.   pinMode(digitalPin[4], OUTPUT); //wird nicht benutzt
  203.   pinMode(digitalPin[5], OUTPUT);
  204.   pinMode(digitalPin[6], OUTPUT);
  205.   pinMode (10, OUTPUT);
  206.   pinMode (53, OUTPUT);
  207.  
  208.   //____________________________________________________________________________________
  209.   //LCD-Display Setup
  210.  
  211.   lcd.clear();
  212.   lcd.begin(16, 2);
  213.   lcd.setCursor(0,0);
  214.   lcd.print(F("Starting..."));
  215.   delay(1000);
  216.   lcd.clear();
  217.  
  218.   //____________________________________________________________________________________
  219.   //Licht-Steuerung mit Echt-Zeit
  220.  
  221.   Wire.begin();
  222.  
  223.     RTC.begin(DateTime(__DATE__, __TIME__));
  224.     pinMode(Lichtpin, OUTPUT);
  225.     pinMode(Dimmpin, OUTPUT);
  226.  
  227.   //if (! RTC.isrunning()) {
  228.     //Serial.println("RTC is NOT running!");
  229.     // following line sets the RTC to the date & time this sketch was compiled
  230.    // RTC.adjust(DateTime(__DATE__, __TIME__));
  231.   //}
  232.  
  233.   //_______________________________________________________________________________________
  234.   //ETHERNETSETUP
  235.  
  236.   //Ethernet.begin(mac, ip , gateway);
  237.   Ethernet.begin(mac, ip, gateway);
  238.   delay(1000);
  239.  
  240.  // Serial.println("connecting...");                            // Auf Clients warten
  241.  
  242. }
  243.  
  244.  
  245. //____________________________________________________________________________________
  246. //____________________________________________________________________________________
  247. //____________________________________________________________________________________
  248.  
  249.  
  250. // HAUPTPROGRAMM
  251.  
  252.  
  253. void loop(void) {
  254.  
  255.   byte i;
  256.   byte present = 0;
  257.   byte type_s;
  258.   byte data[12];
  259.   byte addr[8];
  260.   float celsius;
  261.  
  262.  
  263.  
  264.   if ( !ds.search(addr)) {
  265. //    Serial.println("No more addresses.");
  266.   //  Serial.println();
  267.     ds.reset_search();
  268.     delay(250);
  269.     return;
  270.   }
  271.  
  272.   Serial.print("ROM =");
  273.   for( i = 0; i < 8; i++) {
  274.    Serial.write(' ');
  275.     Serial.print(addr[i], HEX);
  276.   }
  277.  
  278.   if (OneWire::crc8(addr, 7) != addr[7]) {
  279.    Serial.println("CRC is not valid!");
  280.       return;
  281.   }
  282.  
  283.   Serial.println();
  284.  
  285.   // the first ROM byte indicates which chip
  286.   switch (addr[0]) {
  287.     case 0x10:
  288.       Serial.println("  Chip = DS18S20");  // or old DS1820
  289.       type_s = 1;
  290.       break;
  291.     case 0x28:
  292.       Serial.println("  Chip = DS18B20");
  293.       type_s = 0;
  294.       break;
  295.     case 0x22:
  296.       Serial.println("  Chip = DS1822");
  297.       type_s = 0;
  298.       break;
  299.     default:
  300.       Serial.println("Device is not a DS18x20 family device.");
  301.       return;
  302.   }
  303.  
  304.  
  305.   ds.reset();
  306.   ds.select(addr);
  307.   ds.write(0x44,1);         // start conversion, with parasite power on at the end
  308.  
  309.   delay(1000);     // maybe 750ms is enough, maybe not
  310.   // we might do a ds.depower() here, but the reset will take care of it.
  311.  
  312.   present = ds.reset();
  313.   ds.select(addr);    
  314.   ds.write(0xBE);         // Read Scratchpad
  315.  
  316.  
  317.  
  318.   Serial.print("  Data = ");
  319.   Serial.print(present,HEX);
  320.   Serial.print(" ");
  321.   for ( i = 0; i < 9; i++) {           // we need 9 bytes
  322.     data[i] = ds.read();
  323.     Serial.print(data[i], HEX);
  324.     Serial.print(" ");
  325.   }
  326.   Serial.print(" CRC=");
  327.   Serial.print(OneWire::crc8(data, 8), HEX);
  328.   Serial.println();
  329.  
  330.  
  331.  
  332.   // convert the data to actual temperature
  333.  
  334.   unsigned int raw = (data[1] << 8) | data[0];
  335.   if (type_s) {
  336.     raw = raw << 3; // 9 bit resolution default
  337.     if (data[7] == 0x10) {
  338.       // count remain gives full 12 bit resolution
  339.       raw = (raw & 0xFFF0) + 12 - data[6];
  340.     }
  341.   } else {
  342.     byte cfg = (data[4] & 0x60);
  343.     if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
  344.     else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
  345.     else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
  346.     // default is 12 bit resolution, 750 ms conversion time
  347.   }
  348.   celsius = (float)raw / 16.0;
  349. //  Serial.print("  Temperature = ");
  350.  // Serial.print(" Celsius, ");
  351. //  Serial.print(celsius);
  352.  // Serial.print(fahrenheit);
  353.  // Serial.println(" Fahrenheit");
  354.  
  355. //____________________________________________________________________________________
  356. // BILDSCHIRMAUSGABE(LCD): Aktuelle Temperatur
  357.  
  358.  lcd.setCursor(0, 0);
  359.  lcd.print(celsius);
  360.  lcd.setCursor(5,0);
  361.  lcd.print(F("C"));
  362. // lcd.setCursor(7,0);lcd.print(key);
  363.  
  364. //___________________________________________________________________________________
  365. //ZEITANZEIGE
  366.  
  367.     lcd.setCursor (7, 0);
  368.     DateTime now = RTC.now();
  369.    
  370.    
  371. // >> Null fuer 1-09 Stunden
  372. if (now.hour() < 10)
  373.  
  374.   {
  375.     lcd.print('0');
  376.     lcd.print(now.hour(), DEC);
  377.   }  
  378.  
  379. else
  380.  
  381.   {
  382.     lcd.print(now.hour(), DEC);
  383.   }
  384.         lcd.print(':');
  385.    
  386. // >> Null fuer 1-09 Minuten
  387. if (now.minute() < 10)
  388.  
  389.   {
  390.     lcd.print('0');
  391.     lcd.print(now.minute(), DEC);
  392.   }  
  393.  
  394. else
  395.  
  396.   {
  397.     lcd.print(now.minute(), DEC);
  398.   }
  399.         lcd.print(':');
  400.    
  401. // >> Null fuer 1-09 Sekunden
  402. if (now.second() < 10)
  403.  
  404.   {
  405.     lcd.print('0');
  406.     lcd.print(now.second(), DEC);
  407.   }  
  408.  
  409. else
  410.  
  411.   {
  412.     lcd.print(now.second(), DEC);
  413.   }
  414.    
  415. //___________________________________________________________________________
  416. // An-& Ausschalten der Beleuchtung mit Dimmer in Echtzeit  
  417.   //  DateTime now = RTC.now();
  418.  
  419.     minutenUhrzeit=now.hour() * 60 + now.minute(); //Umrechnung Stunden in Minuten
  420.  
  421. //Serial.print("MinutenZeit ist ");
  422. //Serial.println(minutenUhrzeit);
  423.     //Serial.println(now.unixtime());
  424.    // lcd.setCursor(0, 1);
  425.    // lcd.print(now.unixtime());
  426.  
  427. if (minutenUhrzeit >= 480 && minutenUhrzeit < 840) //Wenn Uhrzeit zwischen 8 Uhr und 14h00:
  428.  
  429. {
  430.   digitalWrite(Lichtpin, HIGH);              //Licht anschalten
  431.   binaerstatus_licht = 1;
  432.    //Serial.println(" AN");
  433. }
  434.  
  435. else if (minutenUhrzeit >= 960 && minutenUhrzeit < 1290) //Wenn Uhrzeit zwisch 16h00 und 21h30:
  436.  
  437. {
  438.   digitalWrite(Lichtpin, HIGH);              //Licht anschalten
  439.   binaerstatus_licht = 1;
  440.    //Serial.println(" AN");
  441. }
  442.  
  443. else
  444.  
  445. {
  446.   digitalWrite(Lichtpin, LOW);              // Sonst Licht ausschalten
  447.   binaerstatus_licht = 0;
  448.    //Serial.println("aus");
  449. }
  450.  
  451.  
  452. //____________________________________________________________________________________
  453. //TASTENDRUCK
  454.  
  455. adc_taste_in = analogRead(0);    // Lese den Wert auf AnalogPin 0
  456. taste = get_taste(adc_taste_in);  // Unterprogramm get_taste(): Ordne gelesenen Analogwert einer Nummer bzw. Taste zu.
  457.  
  458.  
  459. if (taste != alte_taste)   // Ermittle ob eine Taste gedr¸ckt wurde.
  460.  
  461.   {
  462.     // ueberpr¸fung ob ermittelte Taste wirklich gedr¸ckt wurde.
  463.     delay(50);  // warte eine gewisse Zeit und...
  464.     adc_taste_in = analogRead(0);    // ...lese den Wert auf AnalogPin 0
  465.     taste = get_taste(adc_taste_in);    // Unterprogramm get_taste(): Ordne gelesenen Analogwert einer Nummer bzw. Taste zu.
  466.     if (taste != alte_taste)    
  467.  
  468.     {  
  469.       alte_taste = taste;
  470.   // Starte Programmaktionen f¸r bestimmte Tasten      
  471.   switch(taste)
  472.  
  473.   {
  474.         case 2: //Key right
  475.        
  476.         lcd.setCursor(0, 1);
  477.         lcd.print(F("case 2"));
  478.         delay(1000);
  479.         lcd.clear();
  480.  
  481.        /*
  482.  
  483.         //taste_nachricht(); //Unterprogramm um entsprechend der gedr¸ckten taste eine Nachricht auf das LCD-Display zu schicken.
  484.         // Errechnung der Statistik
  485.         temp_int = minuten_vektor[1]; //holt abgespeicherten Wert t-2 aus dem Speicher
  486.         temp = (float) temp_int;//Konvertierung float in int.
  487.         temp = temp / 100; //Umrechnung in Zahl mit Kommastellen
  488.         stat_minute = celsius - temp;//Ver‰nderung aktuell im Vergleich zu t-1
  489.        
  490.         //Ausgabe der Statistik auf das LCD-Display
  491.        
  492.         lcd.clear();
  493.         lcd.setCursor(0, 0);
  494.         lcd.print(F("C-Diff t-2 Stde:"));
  495.         lcd.setCursor(0, 1);
  496.         lcd.print(stat_minute);
  497.         delay(2000);
  498.         lcd.clear();
  499.         reset_aktionsschleife(); //Unterprogramm dass sicherstellt, dass die aktionsschleife wieder aktiv werden kann, auch wenn die temperatur sich nicht geˆndert hat.
  500.  
  501.         */
  502.  
  503.         break;
  504.  
  505.     case 1: //resetTaste___funktioniert nicht.
  506.     //taste_nachricht(); //Unterprogramm um entsprechend der gedr¸ckten taste eine Nachricht auf das LCD-Display zu schicken.
  507.         // Errechnung der Statistik
  508.  
  509.         lcd.setCursor(0, 1);
  510.         lcd.print(F("case 1"));
  511.         delay(1000);
  512.         lcd.clear();        
  513.  
  514.         reset_aktionsschleife(); //Unterprogramm dass sicherstellt, dass die aktionsschleife wieder aktiv werden kann, auch wenn die temperatur sich nicht geˆndert hat
  515.        
  516.         break;
  517.  
  518.     case 0: //Key Up
  519.         //taste_nachricht(); //Unterprogramm um entsprechend der gedr¸ckten taste eine Nachricht auf das LCD-Display zu schicken.
  520.         // Errechnung der Statistik
  521.         //temp_int = minuten_vektor[0]; //holt abgespeicherten Wert t-1 aus dem Speicher
  522.         //temp = (float) temp_int;//Konvertierung float in int.
  523.         //temp = temp / 100; //Umrechnung in Zahl mit Kommastellen
  524.         //stat_minute = celsius - temp;//Ver‰nderung aktuell im Vergleich zu t-1
  525.        
  526.         //Ausgabe der Statistik auf das LCD-Display
  527.        //lcd.clear();
  528.         //lcd.setCursor(0, 0);
  529.         //lcd.print(F("C-Diff t-1 Stde:");
  530.         //lcd.setCursor(0, 1);
  531.         //lcd.print(stat_minute);
  532.         //delay(2000);
  533.         //lcd.clear();
  534.  
  535.         //programm zum an/ausschalten der manuellen ¸berbr¸ckung, mit entsprechendem Hinweis auf dem LCD-bildschirm.
  536.  
  537.         lcd.clear();
  538.         switch(ueberbrueckung_luefter)
  539.         {case 0:
  540.         ueberbrueckung_luefter = 1;
  541.         lcd.setCursor(0, 1);
  542.         lcd.print(F("Stop Luefter: AN"));
  543.         delay(2000);
  544.         lcd.clear();
  545.  
  546.         break;      
  547.  
  548.         case 1:
  549.         ueberbrueckung_luefter = 0;
  550.         lcd.setCursor(0, 1);
  551.  
  552.         lcd.print(F("StopLuefter: AUS"));
  553.         delay(2000);
  554.         lcd.clear();
  555.  
  556.         break;
  557.  
  558.         }
  559.        
  560.         reset_aktionsschleife(); //Unterprogramm dass sicherstellt, dass die aktionsschleife wieder aktiv werden kann, auch wenn die temperatur sich nicht geˆndert hat
  561.  
  562.         break;
  563.  
  564.     case 4: //Key down
  565.         //taste_nachricht(); //Unterprogramm um entsprechend der gedr¸ckten taste eine Nachricht auf das LCD-Display zu schicken.
  566.         // Errechnung der Statistik
  567.         //temp_int = minuten_vektor[2]; //holt abgespeicherten Wert t-3 aus dem Speicher
  568.         //temp = (float) temp_int;//Konvertierung float in int.
  569.         //temp = temp / 100; //Umrechnung in Zahl mit Kommastellen
  570.         //stat_minute = celsius - temp;//Ver‰nderung aktuell im Vergleich zu t-3
  571.        
  572.         //Ausgabe der Statistik auf das LCD-Display
  573.  
  574.         //lcd.clear();
  575.         //lcd.setCursor(0, 0);
  576.         //lcd.print(F("C-Diff t-3 Stde:");
  577.         //lcd.setCursor(0, 1);
  578.         //lcd.print(stat_minute);
  579.         //delay(2000);
  580.         //lcd.clear();
  581.         //reset_aktionsschleife(); //Unterprogramm dass sicherstellt, dass die aktionsschleife wieder aktiv werden kann, auch wenn die temperatur sich nicht geˆndert hat
  582.         //break;
  583.  
  584.        
  585.         //programm zum an/ausschalten der manuellen ¸berbr¸ckung_heizen, mit entsprechendem Hinweis auf dem LCD-bildschirm.
  586.  
  587.         lcd.clear();
  588.         switch(ueberbrueckung_heizen)
  589.         {case 0:
  590.  
  591.         ueberbrueckung_heizen = 1;
  592.         lcd.setCursor(0, 1);
  593.         lcd.print(F("Stop Heizen: AN "));
  594.         delay(2000);
  595.         lcd.clear();
  596.         break;
  597.  
  598.         case 1:
  599.         ueberbrueckung_heizen = 0;
  600.         lcd.setCursor(0, 1);
  601.         lcd.print(F("Stop Heizen: AUS"));
  602.         delay(2000);
  603.         lcd.clear();
  604.         break;
  605.  
  606.         }
  607.  
  608.         reset_aktionsschleife(); //Unterprogramm dass sicherstellt, dass die aktionsschleife wieder aktiv werden kann, auch wenn die temperatur sich nicht geˆndert hat
  609.  
  610.         break;
  611.  
  612.  
  613.     case 3: //Key left    
  614.  
  615.    lcd.print(F("Links"));  //>>> BLAU
  616.  
  617.          /*lcd.clear();      
  618.          lcd.setCursor(2, 1);
  619.          lcd.print(F("Es ist ");
  620.          lcd.print(now.hour(), DEC);
  621.          lcd.print(':');
  622.          lcd.print(now.minute(), DEC);
  623.         */
  624.  
  625.          delay(1000);
  626.          lcd.clear();
  627.  
  628.        /*
  629.        //taste_nachricht(); //Unterprogramm um entsprechend der gedr¸ckten taste eine Nachricht auf das LCD-Display zu schicken.
  630.        // Errechnung der Statistik
  631.  
  632.         temp_int = minuten_vektor[3]; //holt abgespeicherten Wert t-4 aus dem Speicher
  633.         temp = (float) temp_int;//Konvertierung float in int.
  634.         temp = temp / 100; //Umrechnung in Zahl mit Kommastellen
  635.         stat_minute = celsius - temp;//Ver‰nderung aktuell im Vergleich zu t-4
  636.  
  637.         //Ausgabe der Statistik auf das LCD-Display
  638.  
  639.         lcd.clear();
  640.         lcd.setCursor(0, 0);
  641.         lcd.print(F("C-Diff t-4 Stde:"));
  642.         lcd.setCursor(0, 1);
  643.         lcd.print(stat_minute);
  644.         delay(2000);
  645.         lcd.clear();
  646.         */
  647.         reset_aktionsschleife(); //Unterprogramm dass sicherstellt, dass die aktionsschleife wieder aktiv werden kann, auch wenn die temperatur sich nicht geˆndert hat
  648.        
  649.  
  650.         break;        
  651.                  
  652.       }
  653.  
  654.   }
  655.  
  656.  }
  657.  
  658.  
  659.  
  660. //____________________________________________________________________________________  
  661. // ZUWEISUNG VON Temp-INTERVALLEN ZU BESTIMMTEN FALLNUMMERN.
  662.  
  663.  
  664.   // Starte hierzu das Unterprogramm get_key() siehe weiter unten.
  665.   key = get_key(celsius);
  666.  
  667. //____________________________________________________________________________________
  668. // BILDSCHIRMAUSGABE(SERIELL): BEWERTUNG GEMƒfl DER DEM OHM-INTERVALL ZUGEORDNETEN FALLNUMMER: Beispiel: "Viel zu heifl!"
  669.  
  670.   //Serial.print(msgs[key]);
  671.   //Serial.println();
  672.  
  673. //____________________________________________________________________________________
  674. // ZUORDNEN BESTIMMTER AKTIONEN ZU DEN DER Temp-INTERVALLEN ZUGEORDNETEN FALLNUMMERN
  675.  
  676. if (herunterkuehlen == 1) //Kriterium der Abschaltung der Herunterk¸hlung: muss eingeschaltet
  677.  
  678. {
  679.  
  680.  if (ueberbrueckung_luefter == 1) // UND NOTABSCHALTUNG ist aktiviert
  681.  {digitalWrite(digitalPin[0], LOW); //Schalte die Lampe des Falls 0 aus.
  682.   digitalWrite(digitalPin[3], HIGH); // Schalte Relay des Falls 0 aus. (=0 +3). Relay wird deaktiviert, wenn HIGH-Signal
  683.  
  684.  herunterkuehlen = 0;  
  685.  
  686.  }
  687.  
  688.  
  689.  if (celsius < temp_krit_kuehlen)// ODER kritischer temperaturwert wurde unterschritten, !!!weil messungen in temp, muss der kritische wert ¸berschritten sein!!!
  690.  
  691.  {
  692.  
  693.  digitalWrite(digitalPin[0], LOW); ////Schalte die Lampe des Falls 0 aus.
  694.  digitalWrite(digitalPin[3], HIGH);// Schalte Relay des Falls 0 aus. (=0 +3). Relay wird deaktiviert, wenn HIGH-Signal
  695.  
  696.  herunterkuehlen = 0;  
  697.  
  698.   }
  699.  
  700.  }
  701.  
  702.  
  703. if (hochheizen == 1) //Kriterium der Abschaltung des Hochheizen: muss eingeschaltet
  704.  
  705. {
  706.  
  707.  if (ueberbrueckung_heizen == 1) // UND NOTABSCHALTUNG ist aktiviert
  708.  
  709.   {
  710.    digitalWrite(digitalPin[2], LOW); //Schalte die Lampe des Falls 2 aus.
  711.    digitalWrite(digitalPin[5], HIGH); // Schalte Relay des Falls 2 aus. (= 2 +3). Relay wird deaktiviert, wenn HIGH-Signal
  712.  
  713.  hochheizen = 0;  
  714.  
  715.   }
  716.  
  717.  if (celsius >  temp_krit_heizen)// ODER kritischer temperaturwert wurde ¸berschritten, !!!weil messungen in temp, muss der kritische wert unterschritten sein!!!
  718.  
  719.   {
  720.  
  721.  digitalWrite(digitalPin[2], LOW);//Schalte die Lampe des Falls 2 aus.
  722.  digitalWrite(digitalPin[5], HIGH); // Schalte Relay des Falls 2 aus. (= 2 +3). Relay wird deaktiviert, wenn HIGH-Signal
  723.  
  724.  hochheizen = 0;  
  725.  
  726.   }
  727.  
  728.  }
  729.  
  730.  
  731. if (key != oldkey) // Stellt sicher dass nur dann ein Programm gestartet wird, wenn sich der gemessene Wertebereich ge‰ndert hat.
  732.  
  733. {
  734.  
  735.  
  736.  if (oldkey == 1) // stellt sicher das die Rote Lampe "sehr heifl" nicht ungewollt abgeschaltet wird.
  737.  
  738.   {
  739.  
  740.     digitalWrite(digitalPin[oldkey], LOW); //Schalte die Lampe der alten Fallnummer aus.
  741.  
  742.   }
  743.    
  744. //_________________________________________________________________
  745. // Starte Programmaktionen f¸r bestimmte Temperaturbereiche      
  746.   switch(key)
  747.  
  748.   {    
  749.  
  750.     case 0:
  751.  
  752.     // Fall: "Viel zu warm", Blinke Rot.
  753.    
  754.     if(ueberbrueckung_luefter == 0) //wenn manuelle ‹berbr¸ckung ausgeschaltet, dann schalte lampe automatisch an.
  755.  
  756.     {
  757.  
  758.     //Serial.print("FALL 0: Blinke Rot");
  759.     digitalWrite(digitalPin[key], HIGH);
  760.  
  761.     relay = key + 3; //ergibt die relayNr. im Pinvektor
  762.  
  763.     //Serial.println(digitalPin[relay]);
  764.     digitalWrite(digitalPin[relay], LOW); //damit Relay aktiv wird, muss ein LOW-Signal gesendet werden.
  765.  
  766.     herunterkuehlen = 1; //Aktiviert Pr¸fvariable zum herunterk¸hlen
  767.  
  768.     }
  769.  
  770.    
  771.   lcd_anzeige_notstop_an();// Unterprogramm zur Anzeige der Temperaturbewertung oder hinweis, dass notstopp eingeschaltet ist
  772.  
  773.    
  774.  
  775.     LCD_Bewertung(); //Unterprogramm, dass die Bewertung der Temperatur auf das LCD-Display schreibt.
  776.  
  777.     oldkey = key;
  778.  
  779.         break;
  780.    
  781.  
  782.     case 1: // Fall: "Temperatur OK", Blinke Gr¸n.
  783.  
  784.     //Serial.print("FALL 1, Blinke Gr¸n");
  785.     digitalWrite(digitalPin[key], HIGH);    
  786.  
  787.     lcd_anzeige_notstop_an();// Unterprogramm zur Anzeige der Temperaturbewertung oder hinweis, dass notstopp eingeschaltet ist
  788.  
  789.  
  790.     //LCD_Bewertung(); //Unterprogramm, dass die Bewertung der Temperatur auf das LCD-Display schreibt.
  791.  
  792.     oldkey = key;
  793.  
  794.     break;
  795.  
  796.    
  797.     case 2: // Fall: "Zu Kalt", Blinke Gelb.
  798.  
  799.     //Serial.print("FALL 2, Blinke Gelb.");
  800.  
  801.      if(ueberbrueckung_heizen == 0) //wenn manuelle ‹berbr¸ckung ausgeschaltet, dann schalte lampe automatisch an.
  802.  
  803.     {
  804.  
  805.     //Serial.print("FALL 0: Blinke Gelb");
  806.  
  807.     digitalWrite(digitalPin[key], HIGH);
  808.  
  809.     relay = key + 3; //ergibt die relayNr. im Pinvektor
  810.  
  811.     digitalWrite(digitalPin[relay], LOW); //damit Relay aktiv wird, muss ein LOW-Signal gesendet werden.
  812.  
  813.     hochheizen = 1; //Aktiviert Pr¸fvariable zum herunterk¸hlen
  814.  
  815.     }
  816.  
  817.  
  818.     lcd_anzeige_notstop_an();// Unterprogramm zur Anzeige der Temperaturbewertung oder hinweis, dass notstopp eingeschaltet ist
  819.    
  820.  
  821.     //LCD_Bewertung(); //Unterprogramm, dass die Bewertung der Temperatur auf das LCD-Display schreibt.
  822.  
  823.     oldkey = key;
  824.  
  825.     break;
  826.  
  827.    
  828.     //case 3: // Fall: "In Ordnung", Blinke Gr¸n.
  829.     //Serial.print("FALL 3, Blinke Gr¸n.");
  830.     //digitalWrite(digitalPin[key], HIGH);
  831.    
  832.     //lcd_anzeige_notstop_an();// Unterprogramm zur Anzeige der Temperaturbewertung oder hinweis, dass notstopp eingeschaltet ist
  833.     //LCD_Bewertung(); //Unterprogramm, dass die Bewertung der Temperatur auf das LCD-Display schreibt.
  834.     //oldkey = key;
  835.  
  836.     //break;
  837.    
  838.  
  839.     //case 4: // Fall: "Kalt aber gr¸n", Blinke Gelb.
  840.     // Serial.print("FALL 4, Blinke Gelb");
  841.     //digitalWrite(digitalPin[key], HIGH);  
  842.  
  843.     //lcd_anzeige_notstop_an();// Unterprogramm zur Anzeige der Temperaturbewertung oder hinweis, dass notstopp eingeschaltet ist
  844.    
  845.     //LCD_Bewertung(); //Unterprogramm, dass die Bewertung der Temperatur auf das LCD-Display schreibt.
  846.     //oldkey = key;
  847.  
  848.     //break;
  849.  
  850.  
  851.     //case 5: // Fall: "Viel zu kalt", Blinke Rot.
  852.     //Serial.print("FALL 5, Blinke Rot");
  853.     //digitalWrite(digitalPin[key], HIGH);
  854.  
  855.    //lcd_anzeige_notstop_an();// Unterprogramm zur Anzeige der Temperaturbewertung oder hinweis, dass notstopp eingeschaltet ist
  856.  
  857.    //LCD_Bewertung(); //Unterprogramm, dass die Bewertung der Temperatur auf das LCD-Display schreibt.
  858.     //oldkey = key;
  859.     //break;
  860.  
  861.   }
  862.  
  863. }
  864.  
  865.  
  866.  
  867. //____________________________________________________________________________________
  868. //Übertragung der Messwerte via Internet
  869.  
  870.  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.
  871.  
  872.   {
  873.   //Serial.println(now.unixtime() - vorhin);
  874.     vorhin = now.unixtime(); //Speichert übertragungszeitpkt ab.
  875.  
  876.  
  877.   //Umrechnung, damit die Temperatur mit Komma via der Variable "temperaturwert übermittelt werden kann.
  878.   int zahl0=(int) celsius;
  879.  
  880.   zahl0 *= 100;
  881.  
  882.   float zahl1= celsius *100;
  883.  
  884.   int zahl2 = (int) zahl1;
  885.  
  886.   int nachkommastellen = zahl2 - zahl0;
  887.  
  888.   int vorkommastellen = (int) celsius;
  889.  
  890.   String temperaturwert; //Erstellt Zeichenkette der Temperatur mit Kommastellen, die später in die Übertragungszeichenkette eingefügt wird.
  891.  
  892.   temperaturwert+="";//löscht letzten Inhalt des Strings
  893.   temperaturwert +=vorkommastellen;
  894.  
  895.   temperaturwert += ",";
  896.  
  897.   temperaturwert +=nachkommastellen;
  898.  
  899.  
  900.  
  901.   //Ermittlung der Zustände von Lüfter und Heizstab
  902.   binaerzustand_luefter = zustandsermittlung(herunterkuehlen, ueberbrueckung_luefter);
  903.   binaerzustand_heizstab = zustandsermittlung(hochheizen, ueberbrueckung_heizen);
  904.  
  905.   // Übertragungsstring bzw. -Kette "Data", wird im folgenden mit Informationen beschrieben, die übermittelt werden sollen.
  906.   String data;
  907.  
  908.   data+="";//löscht letzten Inhalt des Strings
  909.  
  910.   data+="entry.0.single="; //Temperatur
  911.   data+=temperaturwert;
  912.  
  913.   data+="&entry.1.single="; //Lichtstatus
  914.   //data+=an_aus[binaerstatus_licht]; //Überträgt den Status in Worten
  915.   data+=binaerstatus_licht; //Überträgt den Status im Binärcode
  916.  
  917.   data+="&entry.4.single=";// Heizungsstatus
  918.   //data+=an_aus[binaerzustand_heizstab]; //Überträgt den Status in Worten
  919.   data+=zustandsermittlung(hochheizen, ueberbrueckung_heizen); //Überträgt den Status im Binärcode
  920.  
  921.   data+="&entry.9.single=";// Lüfterstatus
  922.   //data+=an_aus[binaerzustand_luefter]; //Überträgt den Status in Worten
  923.   data+=zustandsermittlung(herunterkuehlen, ueberbrueckung_luefter); //Überträgt den Status im Binärcode
  924.  
  925.   data+="&submit=Submit";
  926.  
  927.  
  928. //Eigentlich Übertragung des Datastrings der die Werte enthält:
  929.   if (client.connect(server, 80)) //Wenn Verbinding zum Googleserver via Port 80 besteht
  930.  
  931.   {
  932.  
  933.    // Serial.println("connected");
  934.  
  935.  
  936.     client.print("POST /formResponse?formkey=");
  937.     client.print(formkey); //formkey ist die ID der Googletabelle bzw. des Googleformblattes.
  938.  
  939.     client.println("&ifq HTTP/1.1");
  940.  
  941.     client.println("Host: spreadsheets.google.com");
  942.  
  943.     client.println("Content-Type: application/x-www-form-urlencoded");
  944.  
  945.     client.println("Connection: close");
  946.  
  947.     client.print("Content-Length: ");
  948.  
  949.     client.println(data.length());
  950.  
  951.     client.println();
  952.  
  953.     client.print(data);//Übertragung der Zeichenkette mit den Werten.
  954.    
  955.     delay(1000);//Wichtig  um der Übertragung Zeit zu geben!!!
  956.    
  957.     client.println();
  958.  
  959.  //delay(1000);
  960.  
  961.  
  962. /*
  963.    Serial.print("POST /formResponse?formkey=");
  964.     Serial.print(formkey);
  965.     Serial.println("&ifq HTTP/1.1");
  966.     Serial.println("Host: spreadsheets.google.com");
  967.     Serial.println("Content-Type: application/x-www-form-urlencoded");
  968.     Serial.println("Connection: close");
  969.     Serial.print("Content-Length: ");
  970.     Serial.println(data.length());
  971.     Serial.println();
  972.     Serial.print(data);
  973.     Serial.println();
  974.  */
  975.  
  976. }
  977.  
  978.   if (!client.connected()) //Wenn keine Verbindung zustande gekommen ist, dann Abbruch
  979.  
  980.   {
  981.  
  982.     //Serial.println();
  983.     //Serial.println("disconnecting.");
  984.  
  985.     client.stop();
  986.  
  987.   }
  988.  
  989. }
  990.  
  991. }
  992.  
  993. //____________________________________________________________________________________
  994. //____________________________________________________________________________________
  995. //____________________________________________________________________________________
  996.  
  997. //DEFINITION VON VERWENDETEN UNTERPROGRAMME
  998.  
  999. //____________________________________________________________________________________
  1000. // UNTERPROGRAMM ZUR ZUORDNUNG VON temp-BEREICHEN ZU BESTIMMTEN FALLNUMMERN
  1001.  
  1002. int get_key(float tempw)
  1003.  
  1004. {
  1005.  
  1006.     int k;
  1007.     for (k = 0; k < NUM_KEYS; k++)
  1008.  
  1009.     {
  1010.  
  1011.       if (tempw < adc_key_val[k])
  1012.  
  1013.  {
  1014.             return k;
  1015.  
  1016.         }
  1017.  
  1018.    }
  1019.  
  1020.     if (k >= NUM_KEYS)k = 2;  // Groesser als 27c (kleiner als 24 C) erhaelt die Fallnummer 2
  1021.  
  1022.     return k;
  1023.  
  1024. }
  1025.  
  1026. //____________________________________________________________________________________
  1027. // UNTERPROGRAMM ZUM ANZEIGEN DER BEWERTUNG AUF DEM LCD-DISPLAY
  1028.  
  1029.  
  1030. void LCD_Bewertung()
  1031.  
  1032. {
  1033.     lcd.setCursor(0, 1);
  1034.     lcd.print(msgs[key]);
  1035. }  
  1036.  
  1037. //____________________________________________________________________________________
  1038. // UNTERPROGRAMM ZUR ZUORDNUNG VON MESSWERTEN ZU BESTIMMTEN TASTENNUMMERN; siehe Unterprogramm "ZUORDNUNG VON OHM-BEREICHEN ZU BESTIMMTEN FALLNUMMERN"
  1039.  
  1040. int get_taste(unsigned int input2)
  1041.  
  1042. {
  1043.  
  1044.     int k2;
  1045.     for (k2 = 0; k2 < NUM_KEYS_TASTEN; k2++)
  1046.  
  1047.     {
  1048.  
  1049.       if (input2 < adc_taste_val[k2])
  1050.  
  1051.  {
  1052.  
  1053.             return k2;
  1054.  
  1055.         }
  1056.  
  1057.    }
  1058.  
  1059.     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.
  1060.     return k2;
  1061.  
  1062. }
  1063.  
  1064. //____________________________________________________________________________________
  1065. // UNTERPROGRAMM ZUM ANZEIGEN EINER TASTENNACHTICHT AUF DEM LCD-DISPLAY
  1066.  
  1067.   void taste_nachricht()
  1068.  
  1069.   {
  1070.       lcd.clear();
  1071.       lcd.setCursor(0, 1);
  1072.       lcd.print(msgs_taste[taste]);
  1073.       delay(2000);
  1074.       lcd.clear();
  1075.   }
  1076.  
  1077. //____________________________________________________________________________________
  1078. // UNTERPROGRAMM UM NACH DEM DRUCK EINER TASTE WIEDER IN DIE AKTIONSSCHLEIFE ZU KOMMEN
  1079.  
  1080.   void reset_aktionsschleife()
  1081.  
  1082.   {
  1083.  
  1084.     digitalWrite(digitalPin[oldkey], LOW); //stellt sicher dass nach dem reset des Pr¸fwertes der Aktionsschleife (oldkey)  der digitalPin nicht einfriert.
  1085.  
  1086.     oldkey = 6; //reset des Pr¸fwertes; stellt sicher, dass die Aktionsschleife aktiv wird, auch wenn sich der temperaturbereich nicht ge‰ndert hat.
  1087.  
  1088.   }
  1089.  
  1090. //____________________________________________________________________________________
  1091. // UNTERPROGRAMM ZUR PERMANENTEN ANZEIGE "NOTSTOP: AN" AUF DEM LCD-DISPLAY, wenn notstop aus, dann anzeige der normalen bewertung.
  1092.  
  1093. void lcd_anzeige_notstop_an()
  1094.  
  1095.   {
  1096.  
  1097. if(ueberbrueckung_luefter == 1 && ueberbrueckung_heizen == 1)
  1098.  
  1099. {
  1100.     lcd.setCursor(0, 1);
  1101.     lcd.print(F("Alle Stops: AN  "));
  1102. }
  1103.  
  1104. if(ueberbrueckung_luefter == 1 && ueberbrueckung_heizen == 0)
  1105.  
  1106. {
  1107.     lcd.setCursor(0, 1);
  1108.     lcd.print(F("Stop Luefter: AN"));
  1109. }
  1110.  
  1111. if(ueberbrueckung_luefter == 0 && ueberbrueckung_heizen == 1)
  1112.  
  1113. {
  1114.     lcd.setCursor(0, 1);
  1115.     lcd.print(F("Stop Heizen: AN "));
  1116. }
  1117.  
  1118. if(ueberbrueckung_luefter == 0 && ueberbrueckung_heizen == 0)
  1119.  
  1120. {
  1121.   LCD_Bewertung();//Unterprogramm zum Anzeigen der Temperaturbewertung auf dem LCD-Display.
  1122. }
  1123.  
  1124.  
  1125.   }
  1126.  
  1127. //____________________________________________________________________________________
  1128. // UNTERPROGRAMM ZUr ERMITTLUNG DES AKTIVITÄTSZUSTANDES DES HEIZSTABES ODER LÜFTERS
  1129.  
  1130. int zustandsermittlung(int normal, int notaus)
  1131. {
  1132.  
  1133.   if (normal == 1 && notaus == 0) {return 1; }
  1134.   else {return 0;}
  1135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement