Беспроводной комнатный термостат

Тема в разделе "Посоветуйте детальки", создана пользователем ImrDuke, 13 фев 2017.

  1. ImrDuke

    ImrDuke Гик

    Задумался подключить термостат к газовому котлу. Хотел что бы он был расположен в комнате, приемный модуль с реле на кухне.
    Как лучше всего такой изготовить?
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Термостат должен быть рядом с котлом и подключен проводами.
    А дисплей и управление выноси куда угодно.
    Термостат должен работать автономно, даже если не будет связи с блоком управления.
     
  3. ImrDuke

    ImrDuke Гик

    Вопрос как организовать беспроводную передачу данных между двумя точками?
     
  4. Radius

    Radius Гик

    Самый простой способ это радиомодуль NRF24L01, но у него мощность маленькая и через бетон 2,4 ГГц плохо проходят. Лучше использовать модули на 433 МГц или на 868 МГц.
     
  5. Arkad_snz

    Arkad_snz Гик

  6. ImrDuke

    ImrDuke Гик

    Термостат был изготовлен - сейчас проходит опытную эксплуатацию.
    Появилась мысль - что бы к моменту пробуждения полы были подогреты (котел подключен к водяным полам в квартире). Вот только никак не могу четко сформулировать алгоритм включения...
    Пока думаю что включать по времени и смотреть температуру обратки, что бы повторно не включать если котел только что закончил нагрев.
    Посоветуйте пожалуйста, если у кого был похожий опыт.
     
  7. DIYMan

    DIYMan Guest

    Да от простой, как три копейки:
    Код (C++):
    if(currentTemperature < neededTemperature && isWorkTime(currentTime))
    {
      turnOn();
    }
    else
    {
      turnOff();
    }
     
  8. ImrDuke

    ImrDuke Гик

    Это и так работает - держит заданную температуру воздуха.
    А вот что бы к моменты пробуждения полы были или уже или все еще теплые - надо доделать.
     
  9. DIYMan

    DIYMan Guest

    В смысле? Подогревать заранее? Так по времени запускайте ночью, и всё. Теплоёмкость полов можно примерно прикинуть, простая физика - чтобы знать, сколько времени требуется для нагрева на 1 градус, в процессе этот коэффициент подогнать. Ну и запускать заранее, за полчаса до рассчитанного по коэффициенту времени. Или я опять неправильно понял проблему и она заключается просто в том, что вы не знаете, как запустить по времени?
     
  10. ImrDuke

    ImrDuke Гик

    Я пока вижу два алгоритма:
    1. По времени и температуре жидкости. Т.е. в назначенное время смотрится температура жидкости в контуре, и если она меньше заданной (т.е. котел давно включался), независимо от температуры воздуха, включается подогрев.
    2. По температуре воздуха плюс поправочное значение для данного времени суток. Т.е. в 6 утра к заданной температуре плюсуется какая то величина - и котел начинает греть воздух до нее.
     
  11. DIYMan

    DIYMan Guest

    Имхо первый для тёплых полов - лучше, вам же надо, чтобы
    , а это скорее имеет отношение к температуре теплоносителя, т.к. тёплые полы обладают большой инерционностью, и достаточно подогреть их по температуре теплоносителя, чтобы достичь процитированного эффекта (полы под ногами комфортные).

    Хотя, как по мне - тут вообще ардуина не нужна: при грамотно спроектированных и разведённых тёплых полах достаточно простого копеечного суточного таймера ;)
     
  12. ImrDuke

    ImrDuke Гик

    Ну где ж у нас грамотно проектируют с первого раза, да еще и за недорого?! ;)
     
  13. ImrDuke

    ImrDuke Гик

    Сделал суточный таймер: 4 временных зоны (утро, день, вечер, ночь) и в промежутках заданная температура термостата.
     
    Vladis_a нравится это.
  14. Vladis_a

    Vladis_a Гик

    Это я удачно зашёл! :) А скетчем не поделитесь? У меня уже есть термостат для газового котла. Благополучно трудится уже 2 года. Но вот все больше посещает мысль сделать датчик выносным и поставить его в другой комнате, а провода тащить нет возможности.
     
  15. ImrDuke

    ImrDuke Гик

    Могу, но код о-очень корявый...
     
  16. Vladis_a

    Vladis_a Гик

    Поверьте, с моими познаниями он будет идеальным :) Главное, чтобы работал. Там на NRF24?
     
  17. ImrDuke

    ImrDuke Гик

    Нет, делал на радиомодулях 433МГц.
     
  18. ImrDuke

    ImrDuke Гик

    Передатчик

    Код (C++):
    #include <iarduino_RF433_Transmitter.h>
    #include <avr/wdt.h>
    #include <LowPower.h>
    #include <Wire.h> // Used to establied serial communication on the I2C bus
    #include "SparkFunTMP102.h" // Used to send and recieve specific information from our sensor

    iarduino_RF433_Transmitter radioTX(4);
    int PwrSend = 7;

    TMP102 sensor0(0x48); // Initialize sensor at I2C address 0x48

    struct dataStructure
    {
      byte id;
      float temperature;
      float Vop;
    };

    typedef struct dataStructure Package;
    Package data;

    float getTemp() {
      float temperature;
      // Turn sensor on to start temperature measurement.
      // Current consumtion typically ~10uA.
      sensor0.wakeup();
      // read temperature data
      //temperature = sensor0.readTempF();
      temperature = sensor0.readTempC();
      // Place sensor in sleep mode to save power.
      // Current consumtion typically <0.5uA.
      sensor0.sleep();
      return (float)temperature;
    }

    int Vbg() {
      ADMUX = (1 << REFS0) | (0 << REFS1) | (1 << MUX3) | (1 << MUX2) | (1 << MUX1) | (0 << MUX0);
      long buffersamp = 0;
      for (int n = 0x0; n <= 0xff; n++ ) {
        ADCSRA |= (1 << ADSC) | (1 << ADEN); //Starts a new conversion
        while (bit_is_set(ADCSRA, ADSC));
        buffersamp += ADC;
      }
      buffersamp >>= 4; //16368 full scale 14bit
      ADCSRA &= ~(1 << ADEN);  // отключаем АЦП
      return buffersamp;
    }

    void setup() {
      wdt_disable();
      radioTX.begin(100);               // Инициируем работу передатчика FS1000A на скорости 1 кбит/сек
      //radioTX.setDataRate(i433_1KBPS);  // Скорость передачи данных можно изменить вызвав данную функцию в любом месте кода. Параметры (i433_5KBPS, i433_4KBPS, i433_3KBPS, i433_2KBPS, i433_1KBPS, i433_500BPS, i433_100BPS), i433_1KBPS - 1кбит/сек
      radioTX.openWritingPipe(7);       // Открываем 5 трубу для передачи данных (передатчик может передавать данные только по одной из труб: 0...7). Если повторно вызвать функцию openWritingPipe указав другой номер трубы, то передатчик начнёт передавать данные по вновь указанной трубе

      sensor0.begin();  // Join I2C bus
      // set the Conversion Rate (how quickly the sensor gets a new reading)
      //0-3: 0:0.25Hz, 1:1Hz, 2:4Hz, 3:8Hz
      sensor0.setConversionRate(2);
      //set Extended Mode.
      //0:12-bit Temperature(-55C to +128C) 1:13-bit Temperature(-55C to +150C)
      sensor0.setExtendedMode(0);

      pinMode(PwrSend, OUTPUT);
      digitalWrite(PwrSend, LOW);
      wdt_enable (WDTO_8S);
    }

    void loop() {
      digitalWrite(PwrSend, HIGH);
      data.id = 1;
      data.temperature = getTemp();
      data.Vop = (float)(1.1 * 16368) / Vbg();
      for (int i = 0; i <= 1; i++) { // отправка 2х посылок
        wdt_reset();
        radioTX.write((uint8_t *)&data, sizeof(data));
        delay(500);
      }
      digitalWrite(PwrSend, LOW);
      //for (int i = 0; i <= 225; i++) { // засыпает на 30 минут.
      for (int i = 0; i <= 75; i++) { // засыпает на 10 минут.
        wdt_reset();
        LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
      }
    }
     
    Vladis_a нравится это.
  19. Vladis_a

    Vladis_a Гик

    Ну такая красота у меня тоже валяется без дела, так что теперь и им найдётся применение :)
     
  20. ImrDuke

    ImrDuke Гик

    Vladis_a нравится это.