Простенький терморегулятор

Тема в разделе "Глядите, что я сделал", создана пользователем Vladis_a, 2 фев 2018.

  1. Vladis_a

    Vladis_a Гик

    Всем привет! У меня уже больше двух лет трудится термостат для газового котла, собранный по скетчу с другого форума. Работает великолепно, но вот захотелось его немного усовершенствовать. В частности, сделать так, чтобы возле котла стояла всего лишь маленькая коробочка, внутри которой находится реле, а в удаленной комнате стояла полноценная "метеостанция" ну или "основной управляющий блок" :)
    Планируется, что Основной блок при превышении заданной температуры будет отправлять Ведомому блоку команду на включение или выключение реле посредством NRF24l01.
    Сразу скажу, что на пару лет отошел от темы Ардуино и сейчас приходится все вспоминать заново.
    Ну а пока, по ходу воспоминаний, сделал самый простенький терморегулятор. Авось кому-нибудь да пригодится.........
    Ну и постепенно буду добавлять в скетч все, что касается NRF24l01 (они ко мне только приехали, так что разбираюсь с ними, благодаря нашим форумчанам ИгорьК и Пушной звер тестовые скетчи заработали сразу).
     
    hahaha нравится это.
  2. Vladis_a

    Vladis_a Гик

    Код (C++):
    #include <DallasTemperature.h>
    #include <OneWire.h>
    #include <Wire.h>                           // Подключаем библиотеку Wire
    #include <LiquidCrystal_I2C.h>              // Подключаем библиотеку LiquidCrystal_I2C
    LiquidCrystal_I2C lcd(0x27,20,4);           // Задаем адрес и размер дисплея


    const int relayPin  = 2;                    // Реле на D2
    float MaxTemp;                              // Максимальная температура
    float temp;                                 // Температура с датчика DS18b20
    OneWire oneWire(8);                         // вход датчика DS18b20
    DallasTemperature ds(&oneWire);
    DeviceAddress sensor1 = {0x28, 0xff, 0xe1, 0x2d, 0x01, 0x17, 0x04, 0xfa };  //здесь задаем адрес датчика DS18b20


    void setup() {
    ds.begin();                                 // начинаем работу с датчиками
    pinMode(relayPin, OUTPUT);                  // объявляем выход реле
      MaxTemp=27;                               // устанавливаем максимальную температуру, при которой срабатывает реле
    Serial.begin(9600);
    lcd.init();                                // Инициализация lcd  
    lcd.backlight();                           // Включаем подсветку
    lcd.setCursor(2,0);                        // Устанавливаем курсор на 1 строку, ячейка 2
    lcd.print("Temp");                         // Выводим текст
    }


    void loop() {
      ds.requestTemperatures();                // считываем температуру с датчиков
         float temp=ds.getTempC(sensor1);
         Serial.println(temp);                 // создаем переменную с плавающей точкой(для более точного вывода значения)
        delay(1000);
        if (temp>=MaxTemp)                     // если температура с датчика превысила максимальную
          digitalWrite(relayPin, LOW);
        else digitalWrite(relayPin, HIGH);
          delay(2000);
    Serial.print("Температура = ");
    lcd.setCursor(7,0);                         // Устанавливаем курсор на 1 строку, ячейка 7
    lcd.print(ds.getTempCByIndex(0));           // Выводим показания температуры
    lcd.setCursor(12,0);                        // Устанавливаем курсор на 1 строку, ячейка 12
    lcd.setCursor(13,0);                        // Устанавливаем курсор на 1 строку, ячейка 13
    lcd.print("C");                             // Выводим текст
         
    }
     
    hahaha нравится это.
  3. Vladis_a

    Vladis_a Гик

    Доделал, как и обещал.
    Передатчик (с дисплеем 2004 по I2C и датчиком DS18b20)
    Код (C++):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>                          
    #include <DallasTemperature.h>
    #include <OneWire.h>
    #include <Wire.h>                           // Подключаем библиотеку Wire
    #include <LiquidCrystal_I2C.h>              // Подключаем библиотеку LiquidCrystal_I2C
    LiquidCrystal_I2C lcd(0x27,20,4);           // Задаем адрес и размер дисплея

    const uint64_t pipe = 0xF0F1F2F3F4LL;       // идентификатор передачи, "труба"
    RF24 radio(9, 10); // CE, CSN

    float temp;                                   // Температура с датчика DS18b20
    OneWire oneWire(8);                           // вход датчика DS18b20
    DallasTemperature ds(&oneWire);
    DeviceAddress sensor1 = {0x28, 0xff, 0xe1, 0x2d, 0x01, 0x17, 0x04, 0xfa };  //здесь задаем адрес датчика DS18b20 НЕОБХОДИМО ЗАДАВАТЬ ВАШ АДРЕС!!!


    void setup() {
    ds.begin();                                   // начинаем работу с датчиками
    Serial.begin(9600);
    lcd.init();                                   // Инициализация lcd  
    lcd.backlight();                              // Включаем подсветку
    lcd.setCursor(2,0);                           // Устанавливаем курсор на 1 строку, ячейка 2
    lcd.print("Temp");                            // Выводим текст

    radio.begin();
    delay(2);
    radio.setChannel(9);                          // канал (0-127)
    radio.setDataRate(RF24_1MBPS);  
    radio.setPALevel(RF24_PA_HIGH);  

    radio.openWritingPipe(pipe);                  // открываем трубу на передачу.
     
    }


    void loop() {
      ds.requestTemperatures();                  // считываем температуру с датчиков
         float temp=ds.getTempC(sensor1);
         Serial.println(temp);                   // создаем переменную с плавающей точкой(для более точного вывода значения)
        delay(1000);

    lcd.setCursor(7,0);                         // Устанавливаем курсор на 1 строку, ячейка 7
    lcd.print(ds.getTempCByIndex(0));           // Выводим показания температуры
    lcd.setCursor(12,0);                        // Устанавливаем курсор на 1 строку, ячейка 12
    lcd.setCursor(13,0);                        // Устанавливаем курсор на 1 строку, ячейка 13
    lcd.print("C");                             // Выводим текст
    Serial.print("Температура = ");
                                               
    radio.write(&temp, sizeof(temp));         // отправляем данные и указываем сколько байт пакет
           
    }
     
    hahaha нравится это.
  4. Vladis_a

    Vladis_a Гик

    Код (C++):
    /// приемник термостата
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <Wire.h>
    const int relayPin  = 2;                    // Реле на D2
    float MaxTemp;                              // Максимальная температура

    const uint64_t pipe01 = 0xF0F1F2F3F4LL;     // идентификатор передачи, "труба"
    //const uint64_t pipe02 = 0xF0F1F2F3F1LL;   // могут различатся только на младший байт

    RF24 radio(9, 10); // CE, CSN

    void setup(){

      pinMode(relayPin, OUTPUT);                  // объявляем выход реле
      MaxTemp=28;                                 // устанавливаем максимальную температуру, при которой срабатывает реле
      Serial.begin(9600);
      radio.begin();
      delay(2);
      radio.setChannel(9); // канал (0-127)
      radio.setDataRate(RF24_1MBPS);    
      radio.setPALevel(RF24_PA_HIGH);  
       
      radio.openReadingPipe(1,pipe01);              // открываем трубу с идентификатором "pipe01"
    //  radio.openReadingPipe(2,pipe02);            // открываем трубу с идентификатором "pipe02"
    //  radio.openReadingPipe(0,pipe01);            // или открываем все трубы разом
      radio.startListening();                       // включаем приемник, начинаем слушать трубу
    }
    //  radio.stopListening(); // останавливает приём (нужно перед началом передачи)


    void loop()  
    {
      uint8_t pipeNum = 0;
     
      if (radio.available(&pipeNum)){              // проверяем не пришло ли чего в буфер.
         if (pipeNum == 1){      
            float temp = 0;
            radio.read(&temp, sizeof(temp));
           
              Serial.println(pipeNum);
                if (temp < 0) Serial.print("-");
                else Serial.print("+");
              Serial.println(temp);
              Serial.println();
        delay(1000);
        if (temp>=MaxTemp)                         // если температура с датчика превысила максимальную
          digitalWrite(relayPin, HIGH);
        else digitalWrite(relayPin, LOW);
          delay(2000);
             
         }
         if (pipeNum == 2){
            int data[2] = {0};
            radio.read(&data, sizeof(data));
         
            Serial.println(pipeNum);
                if (data[0] < 0) Serial.print("-");
                else Serial.print("+");
            Serial.print(data[0]);
            Serial.print("C  ");
            Serial.print(data[1]);
            Serial.println("%");
            Serial.println();
         }
      }
    }
     
    Приемник (тут только ардуинка и реле)
     
    hahaha нравится это.
  5. Vladis_a

    Vladis_a Гик

    Еще раз хочу выразить огромную благодарность двум форумчанам - ИгорьК и Пушной звер за то, что толково все разъясняют, приводят примеры скетчей и подробно их комментируют!!!
     
    hahaha нравится это.