автомат для циркуляционного насоса

Тема в разделе "Arduino & Shields", создана пользователем Slaiterx, 15 сен 2016.

  1. Slaiterx

    Slaiterx Гик

    в общем простой автомат включения циркуляционного насоса на ds18b20 по температуре котла датчик установлен на водяной рубашке котла
    Код (C++):

    #include <OneWire.h>
    #include <DallasTemperature.h>
    #define ONE_WIRE_BUS 10 //задаем контакт для датчика
    int ledPin = 13;// задаем контакт для светодиода, реле
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);


    void setup(void)
    {
      Serial.begin(115200);
      sensors.begin();
    }

      void loop(void)
    {
      sensors.requestTemperatures();//команда на получение температуры
      //delay(1000);//задержка 1 секунда
      float t = sensors.getTempCByIndex(0);//обьявляем переменную температуры (t)
      Serial.println(t);//Выводим темпеатуру в сериал порт
      if(t >= 35 )digitalWrite(ledPin, HIGH);//температура включения
      if(t <= 33 )digitalWrite(ledPin, LOW);//температура выключения
      if(t <=-127 )digitalWrite(ledPin, HIGH);//при потере датчика включаем насос
    }
     
  2. Slaiterx

    Slaiterx Гик

    может кто что нибудь добавит
     
  3. Slaiterx

    Slaiterx Гик

    подумал маленько и добавил индикацию потери датчика может и не по фэншую зато работает
    Код (C++):

    #include <OneWire.h>
    #include <DallasTemperature.h>
    #define ONE_WIRE_BUS 10 //задаем контакт для датчика
    int ledPin = 13;// задаем контакт для светодиода
    int rele = 12; //задаем контакт реле
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);


    void setup(void)
    {
      Serial.begin(115200);
      sensors.begin();
    }

      void loop(void)
    {
      sensors.requestTemperatures();//команда на получение температуры
      //delay(1000);//задержка 1 секунда
      float t = sensors.getTempCByIndex(0);//обьявляем переменную температуры (t)
      Serial.println(t);//Выводим темпеатуру в сериал порт
      if(t >= 35 )digitalWrite(rele, HIGH);//температура включения
      if(t <= 33 )digitalWrite(rele, LOW);//температура выключения
      if(t <=-127 )digitalWrite(rele, HIGH);//при потере датчика включаем насос
      if(t <=-127 )digitalWrite(ledPin, HIGH);//при потере датчика включаем светодиод
      else digitalWrite(ledPin, LOW);
    }
     
     
  4. Onkel

    Onkel Гуру

    я бы предложил считать датчик потерянным после 3 ÷ 5 неудачных попыток, а до этого просто повторять в отчете предыдущие значения температуры. 1wire плох по помехоустойчивости и сам процесс запроса / считывания достаточно длительный, может во время включения холодильника или насоса сбойнуть, потом опять нормально работать.
     
  5. Slaiterx

    Slaiterx Гик

    я думал считывать температуру раз в 15 секунд можно и реже
     
  6. Slaiterx

    Slaiterx Гик

    а не подскажите как реализовать просто я только начинаю с ардуино
     
  7. Limoney

    Limoney Гик

    Библиотека содержит подсчет CRC, что точно дает достоверность принятых данных.
     
  8. Slaiterx

    Slaiterx Гик

    моленько доработал сдедал индикацию потери датчика миганием светодиода
    Код (C++):

    #include <OneWire.h>
    #include <DallasTemperature.h>
    #define ONE_WIRE_BUS 10 //задаем контакт для датчика
    int ledPin = 13;// задаем контакт для светодиода
    int rele = 12; //задаем контакт реле
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);


    void setup(void)
    {
      Serial.begin(115200);
      sensors.begin();
    }

      void loop(void)
    {
      sensors.requestTemperatures();//команда на получение температуры
      //delay(1000);//задержка 1 секунда
      float t = sensors.getTempCByIndex(0);//обьявляем переменную температуры (t)
      Serial.println(t);//Выводим темпеатуру в сериал порт
      if(t >= 35 )digitalWrite(rele, HIGH);//температура включения
      if(t <= 33 )digitalWrite(rele, LOW);//температура выключения
      if(t <=-127 )digitalWrite(rele, HIGH);//при потере датчика включаем насос
      if(t <=-127 )digitalWrite(ledPin, HIGH);//при потере датчика включаем светодиод
      delay(200);              // помигаем светодиодом при потери датчика
      digitalWrite(ledPin, LOW);
      delay(50);
      }
     
     
  9. Slaiterx

    Slaiterx Гик

    мне интересно просто правильно ли я все написал работает то отлично но со стороны виднее лучше
     
  10. qwone

    qwone Гик

    Работает и ладно. Подскажу если поймете.
    Код (C++):

    #include <OneWire.h>
    #include <DallasTemperature.h>
    #define ONE_WIRE_BUS 10 //задаем контакт для датчика
    int ledPin =13;// задаем контакт для светодиода
    int rele =12;//задаем контакт реле
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    float t ;//обьявляем переменную температуры (t)

    void setup(void) {
       Serial.begin(115200);
       sensors.begin();
       pinMode(rele, OUTPUT);
       digitalWrite(rele, LOW) ;
       pinMode(edPin, OUTPUT);
       digitalWrite(ledPin, LOW);

    }

    void loop(void) {
      delay(1000);//задержка 1 секунда
      sensors.requestTemperatures();//команда на получение температуры
      t = sensors.getTempCByIndex(0);
      Serial.println(t);//Выводим температуру в сериал порт
      if (t >=35) digitalWrite(rele, HIGH) ;//температура включения насос
      if (t <=33) digitalWrite(rele, LOW) ;//температура выключения насосa
      if (t <=-127 ) {  //при потере датчика
            digitalWrite(rele, HIGH);// включаем насос
            digitalWrite(ledPin, HIGH);// помигаем светодиодом
            delay(200);    
            digitalWrite(ledPin, LOW);    
          }
    }
     
    Последнее редактирование: 16 сен 2016
  11. Slaiterx

    Slaiterx Гик

    Ну да все понял так по фэншую спасибо что поправили когда-нибудь и я смогу писать правильно а пока только учусь
     
  12. alp69

    alp69 Форумчанин

    Я бы добавил еще
    Код (C++):
    if(t ==85)digitalWrite(ledPin, HIGH);//при потере датчика включаем насос
    }
    Если ds18b20 не хватает питания, он выдает значение 85.
    И еще по месту установки датчика. Лучше его врезать в магистраль. Т.к. полагаю, что рубашка котла довольно инертна в плане теплопередачи. Следовательно включением циркуляции регулировать Вы будете температуру рубашки котла, а не теплоносителя.
     
    Последнее редактирование: 16 сен 2016
  13. Onkel

    Onkel Гуру

    точно не t==85 ?
     
    alp69 нравится это.
  14. alp69

    alp69 Форумчанин

    Да, конечно t==85
    Поправил свой пост.
    С телефона, да еще без очков очень неудобно писать.
     
  15. alp69

    alp69 Форумчанин

    И еще рекомендую прислушаться к
    и даже немного развить эту мысль.

    Даже при опросе 1 раз в 15 секунд и даже реже, представьте - датчик единожды выплюнул по какой-то причине не 35, а 35.0001 или 36 при реальной температуре, допустим, 32 градуса. И Ваш насос включился. И какая свистопляска может начаться на граничных значениях, представляете?
    Пока Ваше устройство еще будет прототипом, это еще ничего. А в "боевом" режиме лучше все-таки задавать диапазоны, в которых Ваше устройство будет игнорировать погрешности измерения и колебания температуры ввиду инертности системы отопления. Т.н. "гистерезис".
    Да и в целом я бы проектировал автомат, принимающий решения по мажоритарному принципу. Допустим 2 из 3. Или 5 из 7.
    Как то так.

    P.S. По поводу "козления" ds18b20 - нечасто, но бывает.
     
    Последнее редактирование: 16 сен 2016
  16. alp69

    alp69 Форумчанин

    Я так полагаю, что delay нужен для того, чтобы датчик успел измерить температуру (750ms при паразитном питании)? Тогда delay должен идти после sensors.... ? Как у ТС в первом сообщении?
     
    Последнее редактирование: 16 сен 2016
  17. Slaiterx

    Slaiterx Гик

    Эта система нужна чтобы летом когда тепло не гонять насос а затопил и насос включился а 85 градусов не стал прописывать а аварию потому что эта температура больше температуры включения а при аварии насос включается так что при 85 насос будет включен
     
  18. Slaiterx

    Slaiterx Гик

    Delay я прописал чтобы можно было опрашивать датчик раз в минуту например
     
  19. Slaiterx

    Slaiterx Гик

    По поводу проверки полученных данных так вроде в библиотеке уже встроенная проверка данных с датчика
     
  20. alp69

    alp69 Форумчанин

    Речь не о наличии, а местоположении delay в приведенном коде. Датчику при паразитном питании нужно 750ms для вычисления температуры. Поэтому delay нужно ставить не до, а после команды датчику на расчет температуры. И перед командой на формирование ответа.
    В Вашем первом сообщении он стоит на месте, но закомментирован. А вот в листинге qwone не совсем.
    Ради интереса почитайте.
    И еще. delay(1000) это одна секунда. Минутный интервал 60000.
    Не в упрек. Я речь вел не об ошибках вычислений датчиком измеренной температуры, а об ошибках измерения. Эти ошибки библиотекой не отлавливаются. Или в библиотеке учтено усреднение нескольких измерений? Какой библиотекой пользуетесь?

    Просто добавляем одну строку для информирования о неисправности датчика
    Код (C++):

    if(t==85) // то включаем сигнал аварии
     
    Последнее редактирование: 17 сен 2016