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

Тема в разделе "Закажу проект", создана пользователем Slaiterx, 8 май 2016.

  1. Slaiterx

    Slaiterx Гик

    имеется Arduino uno Lcd shild 1602 с кнопками датчик температуры даллас 18b20 и DHT11 три твердотельные реле и одно обычное для насоса.
    Имеется твердотопливный котел с тремя тэнами и циркуляционный насос
    Скетч я нашол моленько не подходит хотелось бы чтобы работало все это следующим образом
    датчик DHT11 стоял внутри дома и читал температуру в помещении и и относительно этой температуры(нужно чтобы регулировалась в пределах например +10 до +30 градусов) включал тэны а даллас 18b20 стоял на котле и ограничивал максимальную температуру нагрева котла(нужно чтобы регулировалась например от +50 до +80 градусов) и включал циркуляционный насос(нужно чтобы регулировалась например от +30 градусов)и если температура в помещении поднималась до заданной то все тэны отключались ну а насос продолжал работать пока теплоноситель не остывал ниже заданной температуры включения насоса
    Код (C++):

    // Подключаем библиотеку для работы с шиной OneWire
    // Термометр будет подключен на Pin2
    #include <OneWire.h>
    OneWire oneWire(2);
    //Подключаем библиотеку для работы с термометром
    #include <DallasTemperature.h>
    //Создаем объект sensors, подключенный по OneWire
    DallasTemperature sensors(&oneWire);
    //Создаем переменные для работы с термометром
    DeviceAddress temp1DeviceAddress;//переменная для хранения адреса датчика
    DeviceAddress temp2DeviceAddress; //второй информационный датчик
    float temp1=0; //переменная для текущего значения температуры 1
    float temp2=0; //переменная для текущего значения температуры 2
    int setTmp=0; // переменная для заданного значения температуры
    //Подключаем LCD-дисплей
    #include <LiquidCrystal.h>
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
    //Подсветка управляется через пин D10
    #define BACKLIGHT_PIN 10
    //Создаем переменную для хранения состояния подсветки
    boolean backlightStatus = 1;
    // Подключаем библиотеку для работы с ARDUINO EEPROM
    //Заданная температура будет храниться по адресу 0
    #include <EEPROM2.h>
    //Реле подключено к пину D11
    #define RELAY1 11
    #define RELAY2 12
    #define RELAY3 13
    //Объявим переменную для хранения состояния реле
    boolean relayStatus1=LOW;
    boolean relayStatus2=LOW;
    boolean relayStatus3=LOW;

    //Объявим переменные для задания задержки
    long previousMillis1 = 0;
    long interval1 = 2000; // интервал опроса датчиков температуры
    //Аналоговая клавиатура подключена к пину A0
    #define KEYPAD_PIN A0
    //Определим значения на аналоговом входе для клавиатуры
    #define ButtonUp_LOW 140
    #define ButtonUp_HIGH 145
    #define ButtonDown_LOW 324
    #define ButtonDown_HIGH 330
    #define ButtonLeft_LOW 503
    #define ButtonLeft_HIGH 509
    #define ButtonRight_LOW 0
    #define ButtonRight_HIGH 5
    #define ButtonSelect_LOW 740
    #define ButtonSelect_HIGH 745
    void setup() {
    //Настроим пин для управления реле
      pinMode(RELAY1,OUTPUT);
      pinMode(RELAY2,OUTPUT);
      pinMode(RELAY3,OUTPUT);
      digitalWrite(RELAY1,LOW);
      digitalWrite(RELAY2,LOW);
      digitalWrite(RELAY3,LOW);
    //Считаем из постоянной памяти заданную температуру
      setTmp=EEPROM_read_byte(0);

    //Инициализируем термодатчик и установим разрешающую способность 12 бит
    //(обычно она установлена по умолчанию, так что последнюю строчку
    //можно опустить)
      sensors.begin();
      sensors.getAddress(temp1DeviceAddress, 0);
      temp1=sensors.getTempC(temp1DeviceAddress);
      sensors.getAddress(temp2DeviceAddress, 1);
      temp2=sensors.getTempC(temp2DeviceAddress);
    // sensors.setResolution(12);
     
    //Настроим подсветку дисплея
      pinMode(BACKLIGHT_PIN, OUTPUT);
      digitalWrite(BACKLIGHT_PIN, backlightStatus);

    //Выведем на дисплей стартовое сообщение на 2 секунды
      lcd.begin(16, 2);
      lcd.setCursor(0, 0);
      lcd.print("Temp. Controller");
      lcd.setCursor(0, 1);
      lcd.print("      v1.1      ");
      delay(1500);
    // выведем на дисплей заданное значение температуры на 2 секунды
      lcd.setCursor(0, 1);
      lcd.print("  Set temp:     ");
      lcd.setCursor(12,1);
      lcd.print(setTmp);
      delay(1500);
    //Очистим дисплей
      lcd.begin(16, 2);
    }
    //Определим функцию для опроса аналоговой клавиатуры
    //Функция опроса клавиатуры, принимает адрес пина, к которому
    //подключена клавиатура, и возвращает код клавиши:
    // 1 - UP
    // 2 - DOWN
    // 3 - LEFT
    // 4 - RIGHT
    // 5 - SELECT
    int ReadKey(int keyPin)
    {
    int KeyNum=0;
    int KeyValue1=0;
    int KeyValue2=0;
    //Читаем в цикле аналоговый вход, для подавления дребезга
    //и нестабильности читаем по два раза подряд, пока значения
    //не будут равны.
    //Если значения равны 1023 – значит не была нажата ни  одна клавиша.
    do {
    KeyValue1=analogRead(keyPin);
    KeyValue2=analogRead(keyPin);
    } while (KeyValue1==KeyValue2&&KeyValue2!=1023);
    //Интерпретируем полученное значение и определяем код нажатой клавиши
    if (KeyValue2<ButtonUp_HIGH&&KeyValue2>ButtonUp_LOW) {KeyNum=1;}//Up
    if (KeyValue2<ButtonDown_HIGH&&KeyValue2>ButtonDown_LOW) {KeyNum=2;}//Down
    if (KeyValue2<ButtonLeft_HIGH&&KeyValue2>ButtonLeft_LOW) {KeyNum=3;}//Left
    if (KeyValue2<ButtonRight_HIGH&&KeyValue2>ButtonRight_LOW) {KeyNum=4;}//Right
    if (KeyValue2<ButtonSelect_HIGH&&KeyValue2>ButtonSelect_LOW) {KeyNum=5;}//Select
    //Возвращаем код нажатой клавиши
    return KeyNum;
    }
    //Определим процедуру редактирования заданной температуры
    //Вызывается по нажатию клавиши Select, отображает на дисплее
    //заданную температуру и позволяет изменять ее клавишами Up и Down
    void setTemperature()
    {
    lcd.begin(16,2);
      int keyCode=0;
    //выводим на дисплей заданное значение температуры
      lcd.setCursor(0, 0);
      lcd.print("  Setting temp  ");
      lcd.setCursor(7, 1);
      lcd.print(setTmp);
    //Опрашиваем клавиатуру, если нажата клавиша Up увеличиваем
    //значение на 1, если Down – уменьшаем на 1
    //Если нажаты клавиши Select или Right – цикл опроса прерывается
    //Задержки введены для борьбы с дребезгом, если клавиши срабатывают
    //четко – можно уменьшить время задержек или вообще их убрать
      do
      {
      keyCode=ReadKey(KEYPAD_PIN);
      if (keyCode==1){setTmp++;delay(150);lcd.setCursor(7, 1);lcd.print(setTmp);}
      if (keyCode==2){setTmp--;delay(150);lcd.setCursor(7, 1);lcd.print(setTmp);}
      //lcd.begin(16,2);
    }
      while (keyCode!=5 && keyCode!=4);

      delay(200);
    //lcd.begin(16, 2);
    //По клавише Select – созраняем в EEPROM измененное значение
    //По клавише Right – восстанавливаем старое значение
    if (keyCode==5) {EEPROM_write_byte(0, setTmp);}
    if (keyCode==4) {setTmp = EEPROM_read_byte(0);}
    }
    void loop() {
    //Модуль опроса датчиков и получения сведений о температуре
    //Вызывается 1 раз в секунду
      unsigned long currentMillis1 = millis();
    if(currentMillis1 - previousMillis1 > interval1) {
        previousMillis1 = currentMillis1;
    //Запуск процедуры измерения температуры
    // sensors.setWaitForConversion(false);
      sensors.requestTemperatures();
      //sensors.setWaitForConversion(true);
    //Delay(250) // задержка для обработки информации внутри термометра,
    //в данном случае можно не задавать
    //Считывание значения температуры
      sensors.getAddress(temp1DeviceAddress, 0);
      temp1=sensors.getTempC(temp1DeviceAddress);
      sensors.getAddress(temp2DeviceAddress, 1);
      temp2=sensors.getTempC(temp2DeviceAddress);
    // Вывод текущего значения температуры на дисплей
      lcd.setCursor(0, 0);
      lcd.print("Current");
      lcd.setCursor(0, 1);
      lcd.print("T=");
      lcd.print(temp1);
      lcd.print("C");
      lcd.setCursor(9, 1);
      lcd.print("Ty");
      lcd.print(temp2);
    }
    //Проверка условия включения/выключения нагревателя
    if (temp1<setTmp&&relayStatus1==LOW)
    {relayStatus1=HIGH; digitalWrite(RELAY1,HIGH);
    lcd.setCursor(10, 0);
    lcd.print("P= 35%");}
    if (temp1>setTmp&&relayStatus1==HIGH)
    {relayStatus1=LOW; digitalWrite(RELAY1,LOW);
    lcd.setCursor(10, 0);
    lcd.print("P=  0%");
    }
    delay(500);
    if (temp1+1<setTmp&&relayStatus2==LOW)
    {relayStatus2=HIGH; digitalWrite(RELAY2,HIGH);
    lcd.setCursor(10, 0);
    lcd.print("P= 70%");}
    if (temp1>setTmp&&relayStatus2==HIGH)
    {relayStatus2=LOW; digitalWrite(RELAY2,LOW);
    //lcd.begin(10, 2);
    }
    delay(500);
    if (temp1+2<setTmp&&relayStatus3==LOW)
    {relayStatus3=HIGH; digitalWrite(RELAY3,HIGH);
    lcd.setCursor(10, 0);
    lcd.print("P=100%");}
    if (temp1>setTmp&&relayStatus3==HIGH)
    {relayStatus3=LOW; digitalWrite(RELAY3,LOW);
    //lcd.begin(16, 2);
    }
    delay(200);
    // Опрос клавиатуры
    int Feature = ReadKey(KEYPAD_PIN);
    //Включение подсветки
    if (Feature==1 )
    {backlightStatus=1;digitalWrite(BACKLIGHT_PIN, backlightStatus);}
    //Отключение подсветки
    if (Feature==2 )
    {backlightStatus=0;digitalWrite(BACKLIGHT_PIN, backlightStatus);}
    //Переход к редактированию заданной температуры
    if (Feature==5 )
    {delay(200);setTemperature();
    }
    }
     
    от этого скетча может че поможет
     
  2. Slaiterx

    Slaiterx Гик

    если за тысячу кто возьмется так я только за
     
  3. NazarDiadiun

    NazarDiadiun Нуб

    Если ваша задача актуальна, то напишите мне в скайп: rzd-nazarhik1 или Вк: https://vk.com/nazar_diadiun
     
  4. Slaiterx

    Slaiterx Гик

    Уже решил