Чужой проект. Автоматическая регулировка воды в газовой колонке.

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

  1. Vitakill

    Vitakill Нуб

    Сегодня приехал аналоговый датчик температуры LM35 в пластиковом корпусе. Решил поставить его сразу на выходе теплообменника, рядом с родным датчиком перегрева, так меньше задержка системы. Положил силиконовую термопрокладку и прижал хомутом. Возникли новые проблемы: при работе программы регулировки, значения температуры сильно бросает: Clipboard03.gif
    Причем эти значения получены уже при отключенной серве, то есть без регулировки

    Если просто выводить значения на экран то датчик работает вполне стабильно: Clipboard01.gif

    Возможно проблемы с питанием, возможно наводки от ШИМ контроллера. Куплю цифровой датчик в магазине, ждать из китая долго.

    Вообще погуглив наткнулся на библиотеку "PID регулятор" http://bigbarrel.ru/arduino_pid/ По сути она направлена как раз на решение подобных задач. Здесь https://geektimes.ru/post/255616/ подробно описан подобный регулятор для газовой колонки, правда не на Arduino, так что готовых скетчей там нет, но процесс описан достаточно подробно, многое пригодится в дальнейшем. Думаю надо двигаться в этом направлении.
     
    Последнее редактирование: 9 дек 2016
  2. qwone

    qwone Гик

  3. SONIC300077

    SONIC300077 Нуб

    у меня масляный котел, мощность регулируется заслонкой, хочу прикрутить эту автоматику к этому котлу так как все очень похоже кроме времени реакции у водогрейной колонке все происходит быстро, на котле как принимаете в разы дольше, от сюда вопрос как мне поправить код что бы работало нормально?
     
  4. Spazma

    Spazma Нуб

    Добрый день. Вы не могли бы помочь объединить два скетча для подключения LCD1602 i2c. В первой строке заданная температура, во второй фактическая. И главное, что вписать для отображения заданной потенциометром температуры.
    /*
    Тестировалось на Arduino IDE 1.6.7
    */

    #include <Wire.h> // Подключаем библиотеку Wire
    #include <LiquidCrystal_I2C.h> // Подключаем библиотеку LiquidCrystal_I2C
    #include <DallasTemperature.h> // Подключаем библиотеку DallasTempature
    #define DS18B20 2 // Указываем, к какому выводу подключена DQ

    byte simvol[8] = {B11100,B10100,B11100,B00000,B00000,B00000,B00000,B00000,}; // Символ градуса

    LiquidCrystal_I2C lcd(0x3F, 16, 2); // Задаем адрес и размер дисплея
    OneWire oneWire(DS18B20);
    DallasTemperature sensors(&oneWire);

    void setup()
    {
    sensors.begin(); // Запуск библиотеки, по умолчанию 9 бит, то есть кратность 0.5 градуса
    lcd.init(); // Инициализация lcd
    lcd.backlight(); // Включаем подсветку
    lcd.setCursor(0,0); // Устанавливаем курсор на 1 строку, ячейка 2
    lcd.print("TEMP SET"); // Выводим текст
    lcd.setCursor(0,1); // Устанавливаем курсор на 2 строку, ячейка 2
    lcd.print("TEMP"); // Выводим текст
    }
    void loop()
    {
    lcd.createChar(1, simvol); // Создаем символ под номером 1
    sensors.requestTemperatures(); // Считываем показания температуры
    lcd.setCursor(9,0); // Устанавливаем курсор на 1 строку, ячейка 9
    lcd.print(sensors.getTempCByIndex(0)); // Выводим заданную температуру
    lcd.setCursor(9,1); // Устанавливаем курсор на 2 строку, ячейка 9
    lcd.print(sensors.getTempCByIndex(0)); // Выводим показания текущей температуры
    lcd.setCursor(14,0); // Устанавливаем курсор на 1 строку, ячейка 14
    lcd.print("\1"); // Выводим символ градуса
    lcd.setCursor(14,1); // Устанавливаем курсор на 2 строку, ячейка 14
    lcd.print("\1"); // Выводим символ градуса
    lcd.setCursor(15,0); // Устанавливаем курсор на 1 строку, ячейка 15
    lcd.print("C"); // Выводим текст
    lcd.setCursor(15,1); // Устанавливаем курсор на 2 строку, ячейка 15
    lcd.print("C"); // Выводим текст
    }

     
  5. qwone

    qwone Гик

    я давно это писал.Если сейчас начну, то код поменяется до неузнаваемости.:(
     
  6. Spazma

    Spazma Нуб

    Если не сложно. Или хотя бы подскажите, что нужно вписать для отображения заданной температуры, попробую сам разобраться. Я в программировании Нуб, только начал осваивать.
     
  7. parovoZZ

    parovoZZ Гуру

    Начни с простых вещей. Помнишь, как в школе - сперва выучили цифры, потом числа. Научились сложению, вычитанию. Потом умножение. А ты сразу умножаешь, а цифры не выучил.
     
  8. Spazma

    Spazma Нуб

    Объединил коды, не знаю на сколько верно. Собрано пока все на столе. нет самого главного компонента - сервы и потенциометра(слишком долгой для них оказалась дорога из Китая). На дисплее отображается заданная температура и фактическая. Получу все компоненты, буду тестить на колонке.
    [​IMG]
    //#1
    const int Enable_pin = 8; // пин питание с подсветки экрана
    uint8_t Enable = 0; // 1 работа / 0 нет


    #include <Wire.h> // Подключаем библиотеку Wire
    const int One_wire_bas_pin = 2 ; // пин на шину OneWire

    #include <LiquidCrystal_I2C.h> // Подключаем библиотеку LiquidCrystal_I2C
    #include <DallasTemperature.h> // Подключаем библиотеку DallasTempature
    #define DS18B20 2 // Указываем, к какому выводу подключена DQ

    byte simvol[8] = {B11100,B10100,B11100,B00000,B00000,B00000,B00000,B00000,}; // Символ градуса

    LiquidCrystal_I2C lcd(0x3F, 16, 2); // Задаем адрес и размер дисплея
    OneWire oneWire(DS18B20);
    DallasTemperature sensors(&oneWire);

    float temperature; // текущая температура
    const int right_temperature = 40; // нужная температура в колонке
    //#2
    const int led_pin = 7; // пин светодиода

    #include <Servo.h>
    Servo myservo;
    const int servo_pin = 9; // пин сервы
    uint8_t Enable_servo = 0; // 1 вкл сервы/ 0 откл сервы
    uint8_t pause = 0; // пауза для прогрева 0-50
    uint8_t Angle; // позиция сервы
    const int minAngle = 5;
    const int maxAngle = 100;

    void setup() {
    Serial.begin(9600); //включаем сериал
    //#1
    pinMode(Enable_pin, INPUT); //подключаем пин питание с подсветки экрана
    sensors.begin();
    //#2
    pinMode(led_pin, OUTPUT);
    digitalWrite(led_pin, Enable_servo = 0); //гасим лампочку
    sensors.begin(); // Запуск библиотеки, по умолчанию 9 бит, то есть кратность 0.5 градуса
    lcd.init(); // Инициализация lcd
    lcd.backlight(); // Включаем подсветку
    lcd.setCursor(0,0); // Устанавливаем курсор на 1 строку, ячейка 2
    lcd.print("TEMP SET"); // Выводим текст
    lcd.setCursor(0,1); // Устанавливаем курсор на 2 строку, ячейка 2
    lcd.print("TEMP"); // Выводим текст
    }

    void loop() {
    static uint32_t MILLIS ;
    MILLIS = millis() ;
    //#1
    static uint32_t future1 = 0 ;
    if (MILLIS >= future1) {
    future1 = MILLIS + 200 ;
    Enable = digitalRead(Enable_pin);
    sensors.requestTemperatures(); // послать команду измерить температуру
    temperature = sensors.getTempCByIndex(0);// получить температуру с 1 датчика(0)
    Serial.print("Temperature =");
    Serial.println(temperature);
    }
    //#2 200 миллисекунд управление сервой.
    static uint32_t future2 = 0 ;
    if (MILLIS >= future2) {
    future2 = MILLIS + 200 ;
    switch (Enable_servo * 2 + Enable) {
    case 1: // Enable_servo==0 Enable==1 ВКЛ сервы
    if (pause == 0) {
    myservo.attach(servo_pin); //атачим серву
    myservo.write(50); //ставим на середину
    Serial.println("BOILER ON");
    }
    pause++;
    if (pause > 50) { // делаем паузу 50*200=10000 или 10 секунд
    pause = 0;
    digitalWrite(led_pin, Enable_servo = 1); //вкл лампочку
    }
    break;
    case 2: // Enable_servo==1 Enable==0 ОТКЛ сeрвы
    myservo.write(50); //ставим серву посредине
    myservo.detach(); //детачим чтоб не жужжала
    Serial.println("BOILER OFF");
    digitalWrite(led_pin, Enable_servo = 0); //гасим лампочку
    break;
    case 3: // Enable_servo==1 Enable==1 РЕГУЛИРОВКА ТЕМПЕРАТУРЫ
    if (temperature < right_temperature) {
    Angle = myservo.read();
    Angle += 2; // 2 скорость регулировки
    if (Angle > maxAngle ) Angle = maxAngle;
    myservo.write(Angle);
    }
    else if ( temperature > right_temperature) {
    Angle = myservo.read();
    Angle -= 2; // 2 скорость регулировки
    if (Angle < minAngle ) Angle = maxAngle;
    myservo.write(Angle);
    }
    break;
    }
    }


    lcd.createChar(1, simvol); // Создаем символ под номером 1
    sensors.requestTemperatures(); // Считываем показания температуры
    lcd.setCursor(12,0); // Устанавливаем курсор на 1 строку, ячейка 12
    lcd.print(right_temperature); // Выводим заданную температуру
    lcd.setCursor(14,0); // Устанавливаем курсор на 1 строку, ячейка 14
    lcd.print("\1"); // Выводим символ градуса
    lcd.setCursor(15,0); // Устанавливаем курсор на 1 строку, ячейка 15
    lcd.print("C"); // Выводим текст
    lcd.setCursor(9,1); // Устанавливаем курсор на 2 строку, ячейка 9
    lcd.print(sensors.getTempCByIndex(0)); // Выводим показания текущей температуры
    lcd.setCursor(14,1); // Устанавливаем курсор на 2 строку, ячейка 14
    lcd.print("\1"); // Выводим символ градуса
    lcd.setCursor(15,1); // Устанавливаем курсор на 2 строку, ячейка 15
    lcd.print("C"); // Выводим текст


    }


    Как это будет на практике - напишу.
    P.S.

    Зачем вы вообще это писали, какую цель преследовали,оскорбить, обидеть человека, показать свое превосходство в какой то области знаний? Все мы специалисты в какой то области. Я не считаю целесообразным досконально изучать языки программирования из за одного понравившегося проекта. Достаточно поверхностного понимания. Форум для того и существует - одни спрашивают. другие делятся своим опытом. Или вы считаете по другому? Если внимательно посмотрите предыдущие сообщения - автор сам предлагал когда то доработать код для подключения дисплея. Поэтому я к нему и обратился с ненавязчивой просьбой.
     
    Последнее редактирование: 8 мар 2018
  9. sedoy380

    sedoy380 Нуб

    Люди есть идея использовать PID библиотеку, но как ее выход связать с сервой что б она поворачивала по сигналу библиотеки. Этот вариант я реализовал, что в форуме, используя: встроенный в колонку термистор, енкодер для настройки температуры, двух ячеечный 8 сегментный индикатор и естественно серву. Но при прогреве хотелось что работала диференциальная составляющая пид регулятора, а то проскакивает бывает при прогреве .
     
  10. SergeiL

    SergeiL Оракул Модератор

    А кран с термостатом не катит? :)
    Больше года назад поставил, и понял - то что надо:
    gro.png
     
  11. ImrDuke

    ImrDuke Гик

    На газовую колонку? Не поможет...
     
  12. SergeiL

    SergeiL Оракул Модератор

    Пробовали?
    Я тоже с недоверием относился, пока видео не увидел. Давно думал, решил видео на youtube посмотреть.
    Открывают кран с выставленной температурой 38 градусов.
    Вода течет.
    Сначала прерывают горячий стояк до крана. Вода из крана перестает течь совсем. (холодный стояк открыт)
    Открывают горячий - вода потекла.
    Прерывают холодный стояк - вода перестает течь.

    Поставил себе - очень доволен - это ничего не сказать! :)
    Забыл, что бывают перепады температуры при изменении давления.
    Можно открыть кран раковины и перекидывать рычаг с холодной на горячую воду.
    В душе лишь незначительное изменение температуры в первый момент, меньше чем через четверть секунды все приходит в норму, крутить ничего не нужно.
     
  13. parovoZZ

    parovoZZ Гуру

    почему? Я вот тоже терзаюсь мыслями...чем убрать градиент в 3-5 градусов?
     
  14. sedoy380

    sedoy380 Нуб

    Кран с термостатом, имеет минус что он смешивает воду. Следуя температура с колонки должна идти с запасом, а примерно градусов 50 и больше, но накипь образуется аналогично при превышение этой температуры. Может для бойлера это и идеальный вариант, но к газовой колонке я его использовать не стал бы.
    Меня это вариант точнее основа почти полностью устраивает, переделанная под себя. Так как для душа и мытья посуды нужно 43, а набрать горячую ванну 46, а не 50. Только вот прыжки особенно при первом разогреве неприятны, для этого и придуман ПИД регулятор, но как научить библиотеку контролировать нагрев, с помощь ардуины не знаю. Попытки оказались безуспешны.
     
  15. SergeiL

    SergeiL Оракул Модератор

    Он смешивает, кода это нужно, он же и есть - смеситель. :)

    Я же написал выше, если Вы выставили 43 градуса, а температура подаваемой, горячей воды меньше - у Вас холодная будет перекрыта совсем. Будет открыт только кран горячей воды.
    Если температура подаваемой будет выше 43, холодной будет добавлено столько, сколько нужно, чтобы обеспечить 43 на выходе.

    Очень хорошо видно, утром, когда вода в фильтре и трубах ГВС в квартире остыла.
    Ставишь 38, открываешь кран, - идет одна горячая (остывшая) вода.
    Как только температура достигает установленной, поток воды начинает увеличиваться (начинает открываться холодная.)
     
  16. ImrDuke

    ImrDuke Гик

    Я что то даже не задумывался что можно горячую на полную включить, а температуру регулировать холодной...
    Стоит попробовать.
     
  17. sedoy380

    sedoy380 Нуб

    Термосмеситель может кому то и хорош. Но я просто хочу доработать свою систему и по финансам она дешевле выходит. И я в ней могу прописать все условия что захочу к тому же просто развитие для мозга. А если выбирать самое простое решение то есть колонки с дивиацией пламени, которая с завода следит за температурой и проводит корректировку. Она может немного дороже чем два термосмесителя, в кухню и ванную, но тоже решёние. Но в моем случае я хочу обьеденить библиотеку пид и серво, это больше мне для развития, так как рабочий вариант тоже не плох.
     
  18. SergeiL

    SergeiL Оракул Модератор

    На кухню не нужен, руки не напрягаются, нужен на душ, и если есть - гигиенический.
    Стоят оба, на гигиенический нужны обратные клапана, чтобы не было перетока, когда смеситель открыт, а душик закрыт.
     
  19. parovoZZ

    parovoZZ Гуру

    Оно там не регулируется, а устанавливается пользователем.
     
  20. sedoy380

    sedoy380 Нуб

    Спутал, имел введу модуляцию http://teplota.kh.ua/07/modulyaciya-plameni-v-gazovyx-kolonkax/ там расписано красиво, сам такой я не пользовался. Но когда я покупал свою колонку, то колонки с модуляцией стоили дороже раза в два.