Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "DS1302.h" // время
- #include "DHT.h" // температура
- #include "Adafruit_GFX.h" // монитор
- #include "Adafruit_SSD1306.h" // монитор
- #include <IRremote.h> // подключаем библиотеку для IR приемника
- #include <EEPROM.h> // для сохранения в память
- // for monitor
- #define OLED_MOSI 9
- #define OLED_CLK 10
- #define OLED_DC 11
- #define OLED_CS 12
- #define OLED_RESET 13
- #define IR_TOLERANCE 17
- //Adafruit_SSD1306 display(128, 32, OLED_DC, OLED_RESET, OLED_CS);
- Adafruit_SSD1306 display(128, 32, &Wire, OLED_RESET);
- DS1302 rtc(5, 4, 3); // установка пинов модуля времени
- #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
- DHT dht(6, DHTTYPE); // 6 pin
- IRrecv irrecv(A1); // указываем пин, к которому подключен IR приемник
- decode_results results;
- uint32_t x_result;
- int relayP = 2;
- int CheckTimeDelay = 1000; // как часто проверяем пришло ли время
- bool timecheck = false; // проверять ли время
- int show_state = 0; // 1 - показывать температуру 2 - настройка
- int temperature_tostart = EEPROM.read(0); // минимальная температура на датчике при которой начинаем конвекцию
- int temperature_error = 5; // датчик температуры херовый +-5 по параметрам. купил норм датчик, это не используется
- int temperature_hysteresis = EEPROM.read(3);
- static bool relay_state;
- static bool manual_state = false; // если включено с пульта, то true и не следим ни за чем
- static float temperature_sensor; // темература сенсора
- Time t = rtc.time();
- // int time
- static bool lolalternate = true; // чтобы двоеточие на часах мигало))
- void setup() {
- Serial.begin(9600);
- //EEPROM.write(0, 30); // set temperature_tostart
- //EEPROM.write(3, 5); // set hysteresis
- //Конфигурируем порты для энкодера
- pinMode(7,INPUT);
- pinMode(8,INPUT);
- pinMode(9,INPUT);
- irrecv.enableIRIn(); // запускаем прием инфракрасного сигнала
- pinMode(A1, INPUT); // IR
- pinMode(relayP, OUTPUT); // Объявляем пин реле как выход
- digitalWrite(relayP, LOW); // при включении выставляем реле в одно положение relay_state = false
- // Initialize a new chip by turning off write protection and clearing the
- // clock halt flag. These methods needn't always be called. See the DS1302
- // datasheet for details.
- rtc.writeProtect(false);
- rtc.halt(false);
- // Make a new time object to set the date and time.
- //Time t(2019, 8, 8, 15, 27, 50, Time::kSunday);
- // Set the time and date on the chip.
- //rtc.time(t);
- dht.begin();
- switch_relay(false);
- // инициализация и очистка дисплея
- display.begin(SSD1306_SWITCHCAPVCC);
- display.clearDisplay();
- display.display();
- delay(100);
- }
- void switch_relay(bool state) {
- if (state == true) // вкл реле
- {
- digitalWrite(relayP, HIGH);
- relay_state = true;
- }
- else // выкл реле
- {
- digitalWrite(relayP, LOW);
- relay_state = false;
- }
- }
- void showdata()
- {
- display.clearDisplay();
- display.setTextSize(1); // установка размера шрифта
- display.setTextColor(WHITE); // установка цвета текста
- display.setCursor(0,0); // установка курсора. для истории 0,1 чет не работало
- char buf[55];
- char str_temp[6];
- dtostrf(temperature_sensor, 4, 2, str_temp);
- if (lolalternate == true){
- snprintf(buf, sizeof(buf), "sensor temp: %s\ntemp2start: %d\nhysteresis: %d\n%d:%d",
- str_temp, temperature_tostart, temperature_hysteresis, t.hr, t.min );
- lolalternate = false;}
- else{
- snprintf(buf, sizeof(buf), "sensor temp: %s\ntemp2start: %d\nhysteresis: %d\n%d %d",
- str_temp, temperature_tostart, temperature_hysteresis, t.hr, t.min );
- lolalternate = true;}
- display.println(buf);
- //display.println(x_result);
- display.display();
- buf[55];
- str_temp[6];
- }
- void settings()
- {
- display.clearDisplay();
- display.setTextSize(1); // установка размера шрифта
- display.setTextColor(WHITE); // установка цвета текста
- display.setCursor(0,0); // установка курсора. для истории 0,1 чет не работало
- display.println("SETTINGS\nSet temp2start: %s");
- display.println(temperature_tostart, DEC);
- display.display();
- }
- void IRmanager()
- {
- //Serial.println(x_result); // отправляем полученные данные на порт
- if (x_result == 1328754892 && show_state == 1) // 9 входим в настройки
- show_state = 2;
- else if (x_result == 1328754892 && show_state == 2)
- show_state = 1;
- if (x_result == 2143289407){ // - temp2start
- temperature_tostart--;
- EEPROM.write(0, temperature_tostart);}
- if (x_result == 2093744947){ // ++
- temperature_tostart++;
- EEPROM.write(0, temperature_tostart);}
- if (x_result == 1338978352){ // - hysteresis
- temperature_hysteresis--;
- EEPROM.write(3, temperature_hysteresis);}
- if (x_result == 1342124032){ // ++
- temperature_hysteresis++;
- EEPROM.write(3, temperature_hysteresis);}
- if (x_result == 1341337612){ // disable/enable show data on screen. кароч если ардуина работает от сети, то почемуто зависает при включении ручного режима
- if (show_state == 1){
- show_state = 0;
- display.clearDisplay();
- display.display();}
- else if (show_state == 0)
- show_state = 1;
- }
- if (x_result == 1338781747 && !relay_state){ // turn on
- switch_relay(true);
- manual_state = true;}
- else if (x_result == 1338781747 && relay_state){ // turn off
- switch_relay(false);
- manual_state = false;}
- }
- void loop() {
- t = rtc.time();
- /*digitalWrite(relayP, LOW); // Включаем реле - посылаем низкий уровень сигнала
- delay(1000);
- digitalWrite(relayP, HIGH); // Отключаем реле - посылаем высокий уровень сигнала
- delay(1000);
- */
- if(millis()%CheckTimeDelay==0 && timecheck) // время проверки
- {
- char buf[50];
- snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d",
- t.yr, t.mon, t.date,
- t.hr, t.min, t.sec);
- //Serial.println(buf);
- delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
- }
- // Reading temperature or humidity takes about 250 milliseconds!
- // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
- float h = dht.readHumidity();
- // Read temperature as Celsius (the default)
- temperature_sensor = dht.readTemperature();
- // Read temperature as Fahrenheit (isFahrenheit = true)
- float f = dht.readTemperature(true);
- // Check if any reads failed and exit early (to try again).
- if (isnan(h) || isnan(temperature_sensor) || isnan(f)) {
- Serial.println("Failed to read from DHT sensor!");
- delay(2000);
- }
- /*if (irrecv.decode(&results)) // если данные пришли выполняем команды
- {
- IRmanager();
- irrecv.resume(); // принимаем следующий сигнал на ИК приемнике
- }*/
- if (irrecv.decode(&results))
- {
- uint64_t irVal = 0;
- for(int i=3; i<(results.rawlen-1); i++)
- {
- int Delta = results.rawbuf[i] - results.rawbuf[i+1];
- if (Delta < 0) Delta = -Delta;
- uint8_t b = (Delta < IR_TOLERANCE) ? 0 : 1;
- if ((i-3) < 63)
- {
- irVal = irVal | ((int64_t)b << (int64_t)(i-3));
- }
- }
- uint64_t x1 = irVal;
- uint32_t x = x1 >> 32;
- x_result = x;
- //Serial.println(x_result);
- //x = x1 & 0xFFFFFFFF;
- //Serial.println(x, HEX);
- IRmanager();
- //delay(1000);
- irrecv.resume(); // get the next signal
- }
- if (!manual_state)
- {
- if (temperature_sensor < temperature_tostart+temperature_hysteresis && !relay_state)
- switch_relay(true);
- else if(temperature_sensor >= temperature_tostart+temperature_hysteresis && relay_state)
- switch_relay(false);
- }
- if (show_state == 1)
- showdata();
- else if (show_state == 2)
- settings();
- delay(1000);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement