Advertisement
Antropex

Termo ardu

Apr 6th, 2019
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 18.47 KB | None | 0 0
  1. /*
  2.       TERMOSTAT V2.0
  3.  DziaÅ‚a jak zwykÅ‚y termostat tylko że:
  4.  -Każde wyjÅ›cie może mieć przypisanÄ… wÅ‚asnÄ… czujkÄ™, lub korzystać ze Å›redniej wartoÅ›ci
  5.  -Ilość przewidzianych czujek to 8.
  6.  -Ilość przewidzianych wyjść to 8, ale lekko modyfikujÄ…c kod i dodajÄ…c odpowiedniÄ… ilość ekspanderów można uzyskać ich b.d ilość.
  7.  (Gdyby użyć jeszÄ™ multiplekserów to ilość wyjść przekroczy pewnie każde wymagania)
  8.  -Można podglÄ…dać wartoÅ›ci odbierane z czujek.
  9.  -Można sterować manualnie (tryb automatyczny nie aktywny)
  10.  -WartoÅ›ci zaÅ‚Ä…czania ustawiamy z poziomu keypada podÅ‚Ä…czonego do arduino
  11.  -Wsparcie dla wyÅ›wietlacza lcd (hd...) z konwerterem I2C oraz monitora portu szeregowego
  12.  o
  13.  Dodatkowo planujÄ™:
  14.  -Dodać "first setup" czyli konfigurowanie która czujka jest na dworzu a która w Å›rodku, zakres tolrerancji, czas odÅ›wieżania, ustawianie wartoÅ›ci eeprom itp.
  15.  -Dodać krytycznÄ… wartoÅ›c dla danej czujki która spowodujÄ™ wyÅ‚Ä…czenie wszystkich wyjść.
  16.  -*Sterowanie wyjÅ›ciami za pomocÄ… SMS i wysyÅ‚anie danych na żądanie.
  17.  -*Setrowanie z poziomu przeglÄ…darki
  18.  * - Może kiedyÅ›, ale nie w najbliższym czasie.
  19.  
  20.  Do podstawowego dziaÅ‚ania wymagane jest:
  21.  -JakieÅ› arduino (ja użyÅ‚em UNO, ale finalnie planujÄ™ zapakować w nano)
  22.  -WyÅ›wietlacz z konwerterem  I2C 2x16 (może być wiÄ™kszy, polecam wtedy zmodyfikować kod aby  czytelniej wyÅ›wietlaÅ‚ dane )
  23.  -2 ekspandery pcf8574
  24.  -Klawiatury 4x4
  25.  -Czujnika temperatury i wilgotnoÅ›ci (DomyÅ›lnie DHT22)  
  26.  -No i oczywiÅ›cie zasilania 5V oraz przewody.
  27.  
  28.  WykonaÅ‚ MichaÅ‚ Wysocki
  29.  Stworzono 07.05.2017
  30.  
  31.  */
  32. #include <Wire.h>
  33. #include <Keypad_I2C.h>
  34. #include <Keypad.h>
  35. #include <LiquidCrystal_I2C.h>
  36. #include <LiquidCrystal_I2C.h>
  37. #include <EEPROM.h>
  38. #include <PCF.h>
  39. #include <dht.h>
  40. LiquidCrystal_I2C lcd(0x27,16,2);//Inicjacja wyświetlacza
  41.  
  42. dht DHT;
  43. PCF expander;
  44.  
  45. const byte ROWS = 4;
  46. const byte COLS = 4;
  47.  
  48. char keys[ROWS][COLS] = {
  49.   {
  50.     '1', '2', '3', 'A'                                    }
  51.   ,
  52.   {
  53.     '4', '5', '6', 'B'                                    }
  54.   ,
  55.   {
  56.     '7', '8', '9', 'C'                                    }
  57.   ,
  58.   {
  59.     '*', '0', '#', 'D'                                    }
  60. };
  61.  
  62. byte rowPins[ROWS] = {
  63.   0, 1, 2, 3};
  64. byte colPins[COLS] = {
  65.   4, 5, 6, 7};
  66. int i2caddress = 0x38;//Inicjacja klawiatury
  67. Keypad_I2C kpd = Keypad_I2C( makeKeymap(keys), rowPins, colPins, ROWS, COLS, i2caddress );
  68.  
  69. // KONIEC INICJALIZACJI
  70. int mode = 0 ;//Ustawia tryb
  71. int ekran;//Inaczej krok (pozostałości po inny pomyśle wyświetlania)
  72. //Zmienne konfiguracji
  73. int value;
  74. boolean TH;  
  75. int PIN;
  76. int czujka;
  77. int dmuchanie;
  78. //ZMIENNE AUTOMATU;
  79. int TValue[9];//Temperatury załączania
  80. int HValue[9];
  81. int Czujka[9];//Która czujka odpowiada za jakie wyjście
  82. int temps;//Średnie wartośći
  83. int humas;
  84. long last;//Ostatni czas sprawdzania czujek
  85. long now;
  86. int temp[9];//Odczyty z czujek
  87. int huma[9];
  88. boolean wlacz[9];
  89. boolean first = 1;
  90. boolean update = 0;
  91. void setup() {
  92.   // set up the LCD's number of columns and rows:
  93.   lcd.init();  
  94.   lcd.backlight();
  95.   // Print a message to the LCD.
  96.   lcd.print("Termostat");
  97.   lcd.setCursor(0, 1);
  98.   lcd.print("V1.0");
  99.   //KEYPAD
  100.   Serial.begin(9600);
  101.   kpd.begin();
  102.   expander.begin(0x39);
  103.   for(int i = 0; i <= 8; i++){
  104.     expander.pinMode(i, OUTPUT);
  105.     expander.digitalWrite(i,1);
  106.   }
  107.   pinMode(13, OUTPUT);
  108.   pinMode(2, OUTPUT);
  109.   Serial.print("Termostat1");
  110.   for(int i = 0; i < 9; i++){
  111.     wlacz[i]=0;
  112.     Serial.println(i);
  113.     //Reczny format ustawien
  114.     //    EEPROM.write(i,0);
  115.     //    EEPROM.write(i+10,0);
  116.     //    EEPROM.write(i+20,0);
  117.     value = EEPROM.read(i+10);
  118.     if (value >= 100){
  119.       value = -value +100;
  120.     }
  121.     TValue[i] = value;
  122.  
  123.     value = EEPROM.read(i+20);
  124.     if (value >= 100){
  125.       value = -value +100;
  126.     }
  127.     HValue[i] = value;
  128.     Czujka[i] = EEPROM.read(i);
  129.   }
  130.   Serial.print("Termostat2");
  131. }
  132. void loop() {
  133.  
  134.   char key = kpd.getKey();
  135.   if (key && !first) {
  136.     update = 0;
  137.     lcd.clear();
  138.     byte change = true;
  139.     switch (key) {//Ustawianie trybów
  140.     case 'A' :
  141.       lcd.print("Automat");
  142.       mode = 1;
  143.       Serial.println(key);
  144.       ekran = 1;//EKRAN = KROK POZOSTALOSCI PO CASE
  145.       update = 1;
  146.       break;
  147.     case 'B' :
  148.       lcd.print("Manual");
  149.       mode = 2;
  150.       Serial.println(key);
  151.       ekran = 2;
  152.       break;
  153.     case 'C' :
  154.       lcd.print("Setup");
  155.       mode = 3;
  156.       Serial.println(key);
  157.       ekran = 3;
  158.       break;
  159.     case 'D' :
  160.       lcd.print("Dane");
  161.       mode = 4;
  162.       Serial.println(key);
  163.       ekran = 4;
  164.       break;
  165.     }
  166.     //KONIEC USTAWIANIA TRYBÓW
  167.     int Key = key - '0';
  168.     switch (mode) {
  169.     case 1 :
  170.       { //JEÅšLI AUTOMAT
  171.         switch(key){
  172.         case 'A':
  173.           break;
  174.         default:
  175.           lcd.print(Key);
  176.           lcd.print(" TEMP->");
  177.           lcd.print(temp[Key]);
  178.           lcd.setCursor(0,1);
  179.           lcd.print(Key);
  180.           lcd.print("WILG->");
  181.           lcd.print(huma[Key]);  
  182.           break;
  183.         }
  184.       }
  185.       break;
  186.     case 2 ://MANUAL
  187.       {
  188.         if((Key > 0 ) & (Key < 9) & (Key != 18)){
  189.  
  190.           expander.digitalWrite(Key -1, !expander.digitalRead(Key -1));
  191.           ekran = 6;
  192.           Serial.println(Key);
  193.           if(expander.digitalRead(Key -1) == HIGH){
  194.             lcd.print("WYLACZAM  ");
  195.             lcd.print(Key);
  196.           }
  197.           else{
  198.  
  199.             lcd.print("WLACZAM ");
  200.             lcd.print(Key);
  201.  
  202.           }
  203.         }
  204.         else{
  205.           if(Key != 18){
  206.             lcd.print("POZA ZAKRESEM ");
  207.             //Serial.println("POZA ZAKRESEM ");
  208.             //Serial.println(Key);
  209.           }
  210.         }
  211.         if (key == '*'){
  212.           ekran = 7;
  213.           int i = 0;
  214.           while (i < 8){
  215.             lcd.clear();
  216.             lcd.print("Wylaczam");
  217.             lcd.setCursor(0, 1);
  218.             lcd.print(i);
  219.             expander.digitalWrite(i, HIGH);
  220.             Serial.print("SETING ");
  221.             Serial.print(i);
  222.             Serial.println(" HIGH");
  223.             delay (1500);
  224.             i++;
  225.           }
  226.         }
  227.         if (key == '0'){
  228.           ekran = 8;
  229.           int i = 0;
  230.           while (i < 8){
  231.             lcd.clear();
  232.             lcd.print("Zalczam");
  233.             lcd.setCursor(0, 1);
  234.             lcd.print(i);
  235.             expander.digitalWrite(i, LOW);
  236.             Serial.print("SETING ");
  237.             Serial.print(i);
  238.             Serial.println(" LOW");
  239.             delay(1500);
  240.             i++;
  241.           }
  242.           i = 0;
  243.           while (i < 360){
  244.             lcd.clear();
  245.             lcd.print("Nadmuch czas.");
  246.             delay(1000);
  247.             lcd.setCursor(0, 1);
  248.             lcd.print(i);
  249.             lcd.print("sec");
  250.           }
  251.           ekran = 7;
  252.           i = 0;
  253.           while (i < 8){
  254.             lcd.clear();
  255.             lcd.print("Wylaczam");
  256.             lcd.setCursor(0, 1);
  257.             lcd.print(i);
  258.             expander.digitalWrite(i, HIGH);
  259.             Serial.print("SETING ");
  260.             Serial.print(i);
  261.             Serial.println(" HIGH");
  262.             delay (1500);
  263.             i++;
  264.           }
  265.         }
  266.         if (key == '#'){
  267.           ekran = 8;
  268.           int i = 0;
  269.           while (i < 8){
  270.             lcd.clear();
  271.             lcd.print("Zalczam");
  272.             lcd.setCursor(0, 1);
  273.             lcd.print(i);
  274.             expander.digitalWrite(i, LOW);
  275.             Serial.print("SETING ");
  276.             Serial.print(i);
  277.             Serial.println(" LOW");
  278.             delay(1500);
  279.             i++;
  280.           }
  281.         }
  282.  
  283.       }
  284.       break;
  285.     case 3:
  286.       {
  287.         switch (ekran)
  288.         {
  289.         case 3://Ustawianie wartoÅ›ci
  290.           lcd.clear();
  291.           lcd.print("PODAJ PIN");
  292.           Serial.println("PODAJ PIN");
  293.           ekran = 80;
  294.           break;
  295.         case 80:
  296.           if((Key > 8) || (Key < 0)){
  297.             lcd.print("POZA ZAKRESEM");
  298.             Serial.println("POZA ZAKRESEM");
  299.           }
  300.           else{
  301.             lcd.print("PIN =");
  302.             lcd.print(Key);
  303.             Serial.print("PIN = ");
  304.             Serial.println(Key);
  305.             PIN = Key;
  306.             delay(500);
  307.             Serial.println("TEMP/HUM");
  308.             lcd.setCursor(0, 1);
  309.             lcd.print("TEM/HUM");
  310.             ekran = 81;
  311.           }
  312.           break;
  313.         case 81:
  314.           if(Key == 1){
  315.             Serial.print("TEMPERATURA");
  316.             TH = 0;
  317.             value = TValue[PIN];
  318.             ekran = 82;
  319.             lcd.setCursor(0, 1);
  320.             Serial.print("Wartosc:");
  321.             lcd.print("TEMP WARTOSC");
  322.           }
  323.           else if (Key == 2){
  324.             Serial.print("WILOGOTNOSC");
  325.             TH = 1;
  326.             value = HValue[PIN];
  327.             Serial.print("Wartosc");
  328.             ekran = 82;
  329.             lcd.print("WILGO WATOSC");
  330.           }
  331.           break;
  332.         case 82:
  333.           switch(key) {
  334.           case '1' :
  335.             value++;
  336.             Serial.print("WARTOSC= ");
  337.             Serial.println(value);
  338.             lcd.print("WARTOSC:");
  339.             lcd.setCursor(0, 1);
  340.             lcd.print(value);
  341.             break;
  342.           case '2' :
  343.             value = value +5;
  344.             Serial.print("WARTOSC= ");
  345.             Serial.println(value);
  346.             lcd.print("WARTOSC:");
  347.             lcd.setCursor(0, 1);
  348.             lcd.print(value);
  349.             break;
  350.           case '4' :
  351.             value--;
  352.             Serial.print("WARTOSC= ");
  353.             Serial.println(value);
  354.             lcd.print("WARTOSC:");
  355.             lcd.setCursor(0, 1);
  356.             lcd.print(value);
  357.             break;
  358.           case '5' :
  359.             value = value - 5;
  360.             Serial.print("WARTOSC= ");
  361.             Serial.println(value);
  362.             lcd.print("WARTOSC:");
  363.             lcd.setCursor(0, 1);
  364.             lcd.print(value);
  365.             break;
  366.           case '#' :
  367.             ekran = 83;
  368.             Serial.println("CZUJKA->");
  369.             lcd.print("CZUJKA->");
  370.             break;
  371.           }
  372.           //KONTROLA
  373.           if(value > 99){
  374.             value = 99;
  375.             ekran = 82;
  376.             Serial.print("MAX");
  377.             Serial.println(value);
  378.             lcd.print("MAX:");
  379.             lcd.setCursor(0, 1);
  380.             lcd.print(value);
  381.           }
  382.           else if (value < -99) {
  383.             value = -99;
  384.             ekran = 82;
  385.             Serial.print("MIN");
  386.             Serial.println(value);
  387.             lcd.print("MIN:");
  388.             lcd.setCursor(0, 1);
  389.             lcd.print(value);
  390.           }
  391.           break;
  392.         case 83:
  393.           if((Key > 8) || (Key < 0)){
  394.             Serial.println("POZA ZAKRESEM");
  395.             lcd.print("POZA ZAKRESEM");
  396.           }
  397.           else{
  398.             lcd.print("Czujka = ");
  399.             lcd.print(Key);
  400.             Serial.print("CZUJKA = ");
  401.             Serial.println(Key);
  402.             czujka = Key;
  403.             ekran = 84;
  404.           }
  405.           break;
  406.         case 84:
  407.           if (TH == 0){
  408.             lcd.print("PIN=");
  409.             lcd.print(PIN);
  410.             lcd.print(" TEMP>");
  411.             lcd.print(value);
  412.             lcd.setCursor(0, 1);
  413.             lcd.print("Czujka");
  414.             lcd.print(czujka);
  415.             Serial.print("Zalaczam PIN ");
  416.             Serial.println(PIN);
  417.             Serial.print("Dla temperatury wyzszej niz ");
  418.             Serial.println(value);
  419.             Serial.print("Czujka zalaczajaca ");
  420.             Serial.println(czujka);
  421.             TValue[PIN]= value;
  422.             Czujka[PIN]= czujka;
  423.             if(value >= 0){
  424.               EEPROM.write(PIN+10, value);
  425.             }
  426.             else {
  427.               value = -value +100;
  428.               EEPROM.write(PIN+10, value);
  429.             }
  430.             EEPROM.write(PIN, czujka);
  431.           }
  432.           else {
  433.             lcd.print("PIN=");
  434.             lcd.print(PIN);
  435.             lcd.print(" WILGO>");
  436.             lcd.print(value);
  437.             lcd.setCursor(0, 1);
  438.             lcd.print("Czujka");
  439.             lcd.print(czujka);
  440.             Serial.print("Zalaczam PIN ");
  441.             Serial.println(PIN);
  442.             Serial.print("Dla wilgotnosci wyzszej niz ");
  443.             Serial.println(value);
  444.             Serial.print("Czujka zalaczajaca ");
  445.             Serial.println(czujka);
  446.             HValue[PIN]= value;
  447.             Czujka[PIN]= czujka;
  448.             if(value >= 0){
  449.               EEPROM.write(PIN+20, value);
  450.             }
  451.             else {
  452.               value = -value +100;
  453.               EEPROM.write(PIN+20, value);
  454.             }
  455.             EEPROM.write(PIN, czujka);
  456.           }
  457.           ekran = 85;
  458.           break;
  459.         }
  460.  
  461.       }
  462.       break;
  463.     case 4:
  464.       {//WyÅ›wietlanie ustawieÅ„
  465.         switch (Key){
  466.         case -6:
  467.           lcd.print(" NIEDOSTEPNE");
  468.           for(int i = 1; i < 9; i++)
  469.           {
  470.             Serial.print(TValue[i]);
  471.             Serial.print("<-TEMP |");
  472.             Serial.print("| WILGO ->");
  473.             Serial.println(HValue[i]);
  474.           }
  475.           break;
  476.         case 20:
  477.           break;
  478.         default:
  479.           if((Key > 8) || (Key < 0) && (Key != 20)){
  480.             if(Key == 9){
  481.               lcd.print(" TEMP->");
  482.               lcd.print(temp[0]);
  483.               lcd.setCursor(0, 1);
  484.               lcd.print(" HUMA->");
  485.               lcd.println(huma[0]);
  486.             }
  487.             else{
  488.               Serial.println("POZA ZAKRESEM");
  489.               lcd.print("POZA ZAKRESEM");
  490.             }
  491.           }
  492.           else {
  493.             lcd.print(Key);
  494.             lcd.print(" TEMP ->");
  495.             lcd.print(TValue[Key]);
  496.             lcd.setCursor(0, 1);
  497.             lcd.print(Czujka[Key]);
  498.             lcd.print(" WILGO ->");
  499.             lcd.print(HValue[Key]);
  500.             Serial.print(TValue[Key]);
  501.             Serial.print("<-TEMP |");
  502.             Serial.print(Czujka[Key]);
  503.             Serial.print("| WILGO ->");
  504.             Serial.println(HValue[Key]);
  505.           }
  506.           break;
  507.         }
  508.         break;
  509.       }
  510.  
  511.     }
  512.   }
  513.   now = millis();//Automat
  514.  
  515.   // Wykonuje zadanie co pewien czas
  516.   if  ( ( (now % 10000) < 10) && ( (now - last) > 200) ) {
  517.     Serial.println("Lapie");
  518.     digitalWrite(13,!digitalRead(13));
  519.     last = now;
  520.     int b=0;
  521.  
  522.     int tsv =0;
  523.     int hsv =0;
  524.     for(int i = 0; i < 9;i++){
  525.       temp[i] = -200;
  526.       huma[i] = -200;
  527.     }
  528.     for(int i = 1; i <= 8;i++){
  529.       int temperatura;
  530.       int chk = DHT.read22(i+2);//PIN poczÄ…tkowy = 3
  531.       if(!((chk == DHTLIB_ERROR_CHECKSUM) || (chk == DHTLIB_ERROR_TIMEOUT))){
  532.         b++;
  533.         temperatura = DHT.temperature;
  534.         int err_T = temp[i] - temperatura;// Wykrywanie bÅ‚Ä™dów zabużeÅ„ w pracy czujki
  535.         err_T = abs(err_T);
  536.         if(err_T < 5 or temp[i] == -200){
  537.           Serial.print("Odczyt poprawny T");
  538.           temp[i] = temperatura;
  539.         }
  540.         else{
  541.           Serial.println("Blad odczytu Temp");
  542.         }
  543.         int err_H = huma[i] - DHT.humidity;// Wykrywanie bÅ‚Ä™dów zabużeÅ„ w pracy czujki
  544.         err_H = abs(err_H);
  545.         if(err_H < 5 or huma[i] == -200){
  546.           huma[i] = DHT.humidity;
  547.           Serial.println("Odczyt poprawny W");
  548.          
  549.         }
  550.         else{
  551.          Serial.println("Blad odczytu Wilgo");
  552.         }
  553.         tsv = tsv + temp[i];
  554.         hsv = hsv + huma[i];
  555.         Serial.print("WYKRYTO CZUJKE PIN->");
  556.         Serial.print(i);
  557.         Serial.print(" TEMP->");
  558.         Serial.print(temp[i]);
  559.         Serial.print(" HUMA->");
  560.         Serial.println(huma[i]);
  561.         Serial.print(" hsv->");
  562.         Serial.println(hsv);
  563.       }
  564.  
  565.     }
  566.  
  567.  
  568.     tsv = tsv/b;
  569.     hsv = hsv/b;
  570.     //Czujka zero ma być zawsze Å›redniÄ…
  571.     for(int i = 0; i <= 8;i++){
  572.       if(temp[i] < -150){
  573.         temp[i] = tsv;
  574.         huma[i] = hsv;
  575.  
  576.       }
  577.  
  578.     }
  579.     //Uzywane do sprawdzania czujek
  580.     //    for(int i = 0; i <= 8;i++){
  581.     //      Serial.print(temp[i]);
  582.     //      Serial.print("<-TEMP|");
  583.     //      Serial.print(i);
  584.     //      Serial.print("|huma->");
  585.     //      Serial.println(huma[i]);
  586.     //
  587.     //    }
  588.  
  589.     if(mode != 2){//Odpowiednie ustawianie wyjść
  590.       for(int i = 1; i <= 8;i++){
  591.         boolean stan = expander.digitalRead(i);
  592.         if(stan = 1){
  593.           //JeÅ›li któraÅ› z wartoÅ›ci spadnie poza zakres tolerancji to wyÅ‚Ä…czam
  594.           if((temp[Czujka[i]] + 1) <= TValue[i])
  595.           {
  596.             wlacz[i] = 0;  
  597.             Serial.print("wylaczam->");
  598.             Serial.println(i);        
  599.           }
  600.  
  601.           //if((huma[Czujka[i]] + 10) < HValue[i])
  602.           //{
  603.           // wlacz[i] = 0;          
  604.           //}
  605.  
  606.         }
  607.         //JeÅ›li przekroczy wartość zadanÄ… uruchamiam wyjÅ›cie
  608.         if(temp[Czujka[i]] > TValue[i]){
  609.           wlacz[i] = 1;
  610.           Serial.print(i);
  611.           Serial.print("->");
  612.           Serial.print(temp[Czujka[i]]);
  613.           Serial.print(">");
  614.           Serial.println(TValue[i]);
  615.  
  616.         }
  617.         //JeÅ›li przekroczy wartość zadanÄ… uruchamiam wyjÅ›cie
  618.         if(huma[Czujka[i]] > HValue[i]){
  619.           //wlacz[i] == 1;
  620.           //Serial.print(huma[Czujka[i]]);
  621.           //Serial.print(">");
  622.           //Serial.println(HValue[i]);
  623.  
  624.         }
  625.         //WÅ‚aÅ›iwe zaÅ‚Ä…czanie
  626.         if(wlacz[i] == 1){
  627.           expander.digitalWrite(i -1, LOW);//Sterowanie wyjÅ›ciami LOW = WLACZONY (sterowanie masÄ…)
  628.           Serial.print("ON->");
  629.           Serial.println(i);
  630.         }
  631.         else{
  632.           expander.digitalWrite(i -1, HIGH);
  633.           Serial.print("OFF->");
  634.           Serial.println(i);
  635.         }  
  636.         if(update){
  637.           lcd.clear();
  638.           lcd.print("Automat");
  639.           lcd.setCursor(0, 1);
  640.           lcd.print("temp->");
  641.           lcd.print(temp[0]);
  642.  
  643.         }
  644.       }
  645.  
  646.       Serial.println("END");
  647.     }
  648.     if(first){
  649.       update = 1;
  650.       mode = 1;
  651.       first = 0;
  652.       lcd.clear();
  653.       lcd.print("Automat");
  654.       lcd.setCursor(0, 1);
  655.     }
  656.   }
  657.  
  658. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement