Advertisement
untoha

sketch_AIRconvection.ino

Aug 23rd, 2019
390
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.98 KB | None | 0 0
  1. #include "DS1302.h"       // время
  2. #include "DHT.h"          // температура
  3. #include "Adafruit_GFX.h"   // монитор
  4. #include "Adafruit_SSD1306.h"   // монитор
  5. #include <IRremote.h> // подключаем библиотеку для IR приемника
  6. #include <EEPROM.h>     // для сохранения в память
  7.  
  8. // for monitor
  9. #define OLED_MOSI 9
  10. #define OLED_CLK 10
  11. #define OLED_DC 11
  12. #define OLED_CS 12
  13. #define OLED_RESET 13
  14.  
  15. #define IR_TOLERANCE 17
  16.  
  17. //Adafruit_SSD1306 display(128, 32, OLED_DC, OLED_RESET, OLED_CS);
  18. Adafruit_SSD1306 display(128, 32, &Wire, OLED_RESET);
  19. DS1302 rtc(5, 4, 3);  //  установка пинов модуля времени
  20. #define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
  21. DHT dht(6, DHTTYPE);      // 6 pin
  22.  
  23. IRrecv irrecv(A1); // указываем пин, к которому подключен IR приемник
  24. decode_results results;
  25. uint32_t x_result;
  26.  
  27. int relayP = 2;
  28. int CheckTimeDelay = 1000;    // как часто проверяем пришло ли время
  29. bool timecheck = false;        // проверять ли время
  30. int show_state = 0;           // 1 - показывать температуру 2 - настройка
  31. int temperature_tostart = EEPROM.read(0);         // минимальная температура на датчике при которой начинаем конвекцию
  32. int temperature_error = 5;            // датчик температуры херовый +-5 по параметрам. купил норм датчик, это не используется
  33. int temperature_hysteresis = EEPROM.read(3);
  34. static bool relay_state;
  35. static bool manual_state = false;          // если включено с пульта, то true и не следим ни за чем
  36. static float temperature_sensor;   // темература сенсора
  37. Time t = rtc.time();
  38.  
  39. // int time
  40. static bool lolalternate = true;     // чтобы двоеточие на часах мигало))
  41.  
  42. void setup() {
  43.   Serial.begin(9600);
  44.   //EEPROM.write(0, 30);        //  set temperature_tostart  
  45.   //EEPROM.write(3, 5);         // set hysteresis
  46.  
  47.   //Конфигурируем порты для энкодера
  48.   pinMode(7,INPUT);
  49.   pinMode(8,INPUT);
  50.   pinMode(9,INPUT);
  51.  
  52.   irrecv.enableIRIn();  // запускаем прием инфракрасного сигнала
  53.   pinMode(A1, INPUT); // IR
  54.  
  55.   pinMode(relayP, OUTPUT);  // Объявляем пин реле как выход
  56.   digitalWrite(relayP, LOW);    // при включении выставляем реле в одно положение relay_state = false
  57.  
  58.   // Initialize a new chip by turning off write protection and clearing the
  59.   // clock halt flag. These methods needn't always be called. See the DS1302
  60.   // datasheet for details.
  61.   rtc.writeProtect(false);
  62.   rtc.halt(false);
  63.   // Make a new time object to set the date and time.
  64.   //Time t(2019, 8, 8, 15, 27, 50, Time::kSunday);
  65.   // Set the time and date on the chip.
  66.   //rtc.time(t);
  67.   dht.begin();
  68.   switch_relay(false);
  69.  
  70.   // инициализация и очистка дисплея
  71.   display.begin(SSD1306_SWITCHCAPVCC);
  72.   display.clearDisplay();
  73.   display.display();  
  74.   delay(100);  
  75. }
  76.  
  77. void switch_relay(bool state) {
  78.   if (state == true)      // вкл реле
  79.   {      
  80.     digitalWrite(relayP, HIGH);
  81.     relay_state = true;
  82.   }
  83.   else                    // выкл реле
  84.   {
  85.     digitalWrite(relayP, LOW);
  86.     relay_state = false;
  87.   }    
  88. }
  89.  
  90. void showdata()
  91. {
  92.   display.clearDisplay();
  93.   display.setTextSize(1); // установка размера шрифта
  94.   display.setTextColor(WHITE); // установка цвета текста
  95.   display.setCursor(0,0); // установка курсора. для истории 0,1 чет не работало
  96.   char buf[55];
  97.   char str_temp[6];
  98.   dtostrf(temperature_sensor, 4, 2, str_temp);
  99.   if (lolalternate == true){
  100.     snprintf(buf, sizeof(buf), "sensor temp: %s\ntemp2start: %d\nhysteresis: %d\n%d:%d",          
  101.            str_temp, temperature_tostart, temperature_hysteresis, t.hr, t.min );
  102.     lolalternate = false;}
  103.   else{
  104.     snprintf(buf, sizeof(buf), "sensor temp: %s\ntemp2start: %d\nhysteresis: %d\n%d %d",          
  105.            str_temp, temperature_tostart, temperature_hysteresis, t.hr, t.min );
  106.     lolalternate = true;}
  107.    
  108.   display.println(buf);
  109.   //display.println(x_result);
  110.   display.display();
  111.   buf[55];
  112.   str_temp[6];
  113. }
  114.  
  115. void settings()
  116. {
  117.   display.clearDisplay();
  118.   display.setTextSize(1); // установка размера шрифта
  119.   display.setTextColor(WHITE); // установка цвета текста
  120.   display.setCursor(0,0); // установка курсора. для истории 0,1 чет не работало
  121.   display.println("SETTINGS\nSet temp2start: %s");
  122.   display.println(temperature_tostart, DEC);
  123.   display.display();
  124. }
  125.  
  126. void IRmanager()
  127. {
  128.    //Serial.println(x_result); // отправляем полученные данные на порт
  129.    if (x_result == 1328754892 && show_state == 1)     // 9 входим в настройки
  130.       show_state = 2;
  131.    else if (x_result == 1328754892 && show_state == 2)
  132.       show_state = 1;
  133.  
  134.    if (x_result == 2143289407){     // - temp2start
  135.       temperature_tostart--;
  136.       EEPROM.write(0, temperature_tostart);}
  137.    if (x_result == 2093744947){         // ++
  138.       temperature_tostart++;
  139.       EEPROM.write(0, temperature_tostart);}
  140.    if (x_result == 1338978352){     // - hysteresis
  141.       temperature_hysteresis--;
  142.       EEPROM.write(3, temperature_hysteresis);}
  143.    if (x_result == 1342124032){         // ++
  144.       temperature_hysteresis++;
  145.       EEPROM.write(3, temperature_hysteresis);}
  146.    if (x_result == 1341337612){         // disable/enable show data on screen. кароч если ардуина работает от сети, то почемуто зависает при включении ручного режима
  147.       if (show_state == 1){
  148.          show_state = 0;
  149.          display.clearDisplay();
  150.          display.display();}        
  151.       else if (show_state == 0)
  152.          show_state = 1;
  153.       }
  154.    if (x_result == 1338781747 && !relay_state){     // turn on
  155.       switch_relay(true);
  156.       manual_state = true;}
  157.    else if (x_result == 1338781747 && relay_state){      // turn off
  158.       switch_relay(false);
  159.       manual_state = false;}
  160. }
  161.  
  162. void loop() {
  163.   t = rtc.time();
  164.   /*digitalWrite(relayP, LOW); // Включаем реле - посылаем низкий уровень сигнала
  165.   delay(1000);
  166.   digitalWrite(relayP, HIGH); // Отключаем реле - посылаем высокий уровень сигнала
  167.   delay(1000);
  168.   */
  169.   if(millis()%CheckTimeDelay==0 && timecheck)      // время проверки
  170.   {    
  171.     char buf[50];
  172.     snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d",          
  173.            t.yr, t.mon, t.date,
  174.            t.hr, t.min, t.sec);
  175.     //Serial.println(buf);    
  176.     delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
  177.   }
  178.  
  179.   // Reading temperature or humidity takes about 250 milliseconds!
  180.   // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  181.   float h = dht.readHumidity();
  182.   // Read temperature as Celsius (the default)
  183.   temperature_sensor = dht.readTemperature();
  184.   // Read temperature as Fahrenheit (isFahrenheit = true)
  185.   float f = dht.readTemperature(true);
  186.  
  187.   // Check if any reads failed and exit early (to try again).
  188.   if (isnan(h) || isnan(temperature_sensor) || isnan(f)) {
  189.     Serial.println("Failed to read from DHT sensor!");
  190.     delay(2000);
  191.   }
  192.  
  193.   /*if (irrecv.decode(&results)) // если данные пришли выполняем команды
  194.   {
  195.     IRmanager();    
  196.     irrecv.resume(); // принимаем следующий сигнал на ИК приемнике
  197.   }*/
  198.  
  199.   if (irrecv.decode(&results))
  200. {
  201.     uint64_t irVal = 0;
  202.     for(int i=3; i<(results.rawlen-1); i++)
  203.     {
  204.         int Delta = results.rawbuf[i] - results.rawbuf[i+1];
  205.         if (Delta < 0) Delta = -Delta;
  206.         uint8_t b = (Delta < IR_TOLERANCE) ? 0 : 1;
  207.  
  208.         if ((i-3) < 63)
  209.         {
  210.             irVal = irVal | ((int64_t)b << (int64_t)(i-3));
  211.         }
  212.     }
  213.  
  214.     uint64_t x1 = irVal;
  215.     uint32_t x = x1 >> 32;
  216.     x_result = x;
  217.     //Serial.println(x_result);    
  218.     //x = x1 & 0xFFFFFFFF;
  219.     //Serial.println(x, HEX);
  220.     IRmanager();
  221.     //delay(1000);
  222.     irrecv.resume(); // get the next signal
  223.   }  
  224.  
  225.   if (!manual_state)
  226.   {
  227.     if (temperature_sensor < temperature_tostart+temperature_hysteresis && !relay_state)
  228.       switch_relay(true);
  229.     else if(temperature_sensor >= temperature_tostart+temperature_hysteresis && relay_state)
  230.       switch_relay(false);
  231.   }
  232.  
  233.   if (show_state == 1)
  234.     showdata();    
  235.   else if (show_state == 2)
  236.     settings();  
  237.  
  238.   delay(1000);
  239. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement