1 2 3 4 5 6 7 8 9 10 10/10 9,80оценок: 15

Автоматика управления ТТ котлами своими руками

Тема в разделе "Котлы, горелки, котельное об-е своими руками", создана пользователем Senkiivan, 28.03.14.

Метки:
  1. Senkiivan
    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503

    Senkiivan

    электронщик

    Senkiivan

    электронщик

    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503
    Адрес:
    Боровичи
    Регулятор оборотов вентилятора сделан на базе (допилите под свои нужды) :aga:

    #include <CyberLib.h> /Библиотека от Cyber-Place.ru
    volatile uint8_t tic, Dimmer1,
    uint8_t data;

    void setup()
    {
    Dimmer1=200;
    D4_Out; /Настраиваем порты на выход
    D4_Low; /установить на выходах низкий уровень сигнала
    D2_In; /настраиваем порт на вход для отслеживания прохождения сигнала через ноль
    /CHANGE – прерывание вызывается при любом изменении значения на входе;
    /RISING – вызов прерывания при изменении уровня напряжения с низкого (Low) на высокий (HIGH)
    /FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (Low)
    attachInterrupt (0, detect_up, LOW); / настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
    StartTimer1 (halfcycle, 40); /время для одного разряда ШИМ
    StopTimer1(); /остановить таймер

    }
    /*обработчики прерываний*
    void halfcycle() /прерывания таймера
    {
    tic+; /счетчик
    if (Dimmer1 < tic) D4_High; /управляем выходом

    }

    void detect_up() / обработка внешнего прерывания. Сработает по переднему фронту
    {
    tic=0; /обнулить счетчик
    ResumeTimer1(); /запустить таймер
    attachInterrupt (0, detect_down, HIGH); /перепрограммировать прерывание на другой обработчик
    }

    void detect_down() / обработка внешнего прерывания. Сработает по заднему фронту
    {
    StopTimer1(); /остановить таймер
    D4_Low; /логический ноль на выходы
    tic=0; /обнулить счетчик
    attachInterrupt (0, detect_up, LOW); /перепрограммировать прерывание на другой обработчик
    }
    /*
    void loop()
    {Start
    Dimmer1=Dimmer1-;

    delay_ms (100);
    if (Dimmer1<2){Dimmer1=200;}
    End}
     
  2. Senkiivan
    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503

    Senkiivan

    электронщик

    Senkiivan

    электронщик

    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503
    Адрес:
    Боровичи
    Пример пункта меню для изменения уставки и при выходе сохранение в памяти.
    При длительном нажатии ускоряется изменение значения. При отпускании и новом нажатии идёт перезапуск ускорения Удобно для набора;)
    с ограничением минимального и максимального значения.
    void setTemperature(){
    / выводим на дисплей заданое значение темп.
    lcd. init();
    lcd. setCursor (0,0);
    lcd. print("T (d) dym gazov");
    lcd. setCursor (0,1);
    lcd. print("Pred");
    lcd. setCursor (9,1);
    lcd. print("C");
    lcd. setCursor (5,1);
    lcd. print (setTmp4);
    int keyCode=0;
    int t=200;
    /опрашиваем клавиатуру, прибавить клавиша вверх +1, убавить клавиша вниз -1

    do{
    keyCode=ReadKey (KEYPAD_PIN);
    if (keyCode=1){setTmp4+;delay (t);lcd.setCursor (5,1);lcd.print (setTmp4);}
    if (keyCode=2){setTmp4-;delay (t);lcd.setCursor (5,1);lcd.print (setTmp4);}
    t=t-5;t=max (t,10);
    if (keyCode!=1&&keyCode!=2){t=200;}
    setTmp4=min (setTmp4,255);
    setTmp4=max (setTmp4,1);
    lcd. setCursor (5,1);lcd.print (setTmp4);
    }while (keyCode!=5);
    delay (100);
    EEPROM_write_byte (3,setTmp4);

    }
     
  3. Senkiivan
    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503

    Senkiivan

    электронщик

    Senkiivan

    электронщик

    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503
    Адрес:
    Боровичи
    Ну и использование millis в замен делай в основном цикле программы

    currentTime=millis();
    / останов котла по прогоранию
    if (pusk=HIGH&&pauza=LOW){if (temp2-temp1)>30){time2=currentTime;}
    else{if (currentTime>=(time2+600000){time2=currentTime;pusk=LOW;EEPROM_write_byte (7,pusk);}}}

    условие понятное. Если активен флаг Пуск и неактивен флаг Пауза, если разница между температурой дымовых газов и температурой теплоносителя на подаче меньше 30 градусов то отключаем флаг Пуск через заданное время и запоминаем.

    При этом основной цикл не останавливается
     
  4. pasko2680
    Регистрация:
    10.01.15
    Сообщения:
    9
    Благодарности:
    1

    pasko2680

    Участник

    pasko2680

    Участник

    Регистрация:
    10.01.15
    Сообщения:
    9
    Благодарности:
    1
    Спасибо огромное за то что откликнулся на мою просьбу!
    Сейчас буду разбираться и пробовать залить дуину.
     
  5. Senkiivan
    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503

    Senkiivan

    электронщик

    Senkiivan

    электронщик

    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503
    Адрес:
    Боровичи
    @pasko2680,
    Начни с библиотек. ;)

    / подключаем библиотеки
    #include <MAX6675.h>
    #include <PID_v1.h>
    #include <EEPROM2.h>
    #include <MsTimer2.h>
    #include <Servo.h>
    #include <CyberLib.h>

    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    #include <OneWire.h>
    #include <DallasTemperature.h>
     
  6. Senkiivan
    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503

    Senkiivan

    электронщик

    Senkiivan

    электронщик

    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503
    Адрес:
    Боровичи
    С DS18B20 и библиотекой DallasTemperature выплыл фокус. В ней прописан делай 750мс и программа получила циклический тормоз. пришлось обойти
    Использовать
    #include <MsTimer2.h>
    сделать подцикл

    void getTemp(){ / читаем температуру и заполняем массив
    temp1 = ds. getTempC (sensor1); / немного китайского кода
    temp3 = ds. getTempC (sensor2);
    temp4 = ds. getTempC (sensor3);
    temp5 = ds. getTempC (sensor4);
    ds. requestTemperatures();
    }

    и вытаскивать температуру раз в секунду не останавливая основной цикл.
    MsTimer2:set (1000, getTemp); / установка таймера на 1 сек. для изм. температуры
    MsTimer2:start();
     
  7. Senkiivan
    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503

    Senkiivan

    электронщик

    Senkiivan

    электронщик

    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503
    Адрес:
    Боровичи
    Пока унка в таком виде находится

    Размер скетча в двоичном коде: 24 008 байт (из 32 256 байт максимум)

    Процесс идёт:)]:)]:)]
     
  8. pasko2680
    Регистрация:
    10.01.15
    Сообщения:
    9
    Благодарности:
    1

    pasko2680

    Участник

    pasko2680

    Участник

    Регистрация:
    10.01.15
    Сообщения:
    9
    Благодарности:
    1
    Я тебя понял :pioner: бегу в библиотеку :)]
     
  9. Senkiivan
    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503

    Senkiivan

    электронщик

    Senkiivan

    электронщик

    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503
    Адрес:
    Боровичи
    Такой блок управления насосом отопления (вроде на все случаи жизни) :)]
    /блок управления насосом отопления
    if (pusk=HIGH){if (temp1>10&&temp1<95){
    if (ter=2){if (ter1=HIGH){if (temp1>setTmp3&&relayStatus3=LOW){relayStatus3=HIGH; digitalWrite (RELAY3_PIN,HIGH);} /пуск насоса отопления в режиме термостата
    if (temp1<(setTmp3-5)&&relayStatus3=HIGH){relayStatus3=LOW; digitalWrite (RELAY3_PIN,LOW);}}
    if (ter1=LOW){relayStatus3=LOW; digitalWrite (RELAY3_PIN,LOW);}}
    else{ if (temp1>setTmp3&&relayStatus3=LOW){relayStatus3=HIGH; digitalWrite (RELAY3_PIN,HIGH);} /пуск насоса отопления без термостата
    if (temp1<(setTmp3-5)&&relayStatus3=HIGH){relayStatus3=LOW; digitalWrite (RELAY3_PIN,LOW);}}}}
    if (temp1<10|temp1>95){relayStatus3=HIGH; digitalWrite (RELAY3_PIN,HIGH);}
     
  10. Senkiivan
    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503

    Senkiivan

    электронщик

    Senkiivan

    электронщик

    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503
    Адрес:
    Боровичи
    Насос ГВС по проще:aga:

    / включение насоса ГВС
    if (pusk=HIGH&&(temp4<50){if (temp3>51){
    if (temp1>setTmp2&&relayStatus4=LOW){relayStatus4=HIGH; digitalWrite (RELAY4_PIN,HIGH);}/пуск насоса по уставке котёл работает
    if (temp1<(setTmp2-5)&&relayStatus4=HIGH){relayStatus4=LOW; digitalWrite (RELAY4_PIN,LOW);}}}/ останов насоса по уставке котёл работает
    else{relayStatus4=LOW; digitalWrite (RELAY4_PIN,LOW);}/ останов насоса после команды выключить
     
  11. Senkiivan
    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503

    Senkiivan

    электронщик

    Senkiivan

    электронщик

    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503
    Адрес:
    Боровичи
    Ну и на закуску моргание экраном

    / моргание экрана при аварии
    if (avaria=HIGH){ lcd. noDisplay();delay (500);
    lcd. display();delay (500);}
     
  12. Senkiivan
    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503

    Senkiivan

    электронщик

    Senkiivan

    электронщик

    Регистрация:
    23.08.12
    Сообщения:
    2.634
    Благодарности:
    1.503
    Адрес:
    Боровичи
    Вариант использования погодо-зависимой части.
    не стал выводить график по задающим точкам сделал ступеньками. меняем уставку теплоносителя в зависимости от температуры на улице. Остальное сгладит термостат. при активировании температуру задаёт погода., в остальном согласно уставки.

    / Задание температуры теплоносителя
    if (pogoda=HIGH){if (temp5>=5){setTmp7=60;}
    if (temp5<5)&&(temp5>=-5){setTmp7=65;}
    if (temp5<-5)&&(temp5>=-10){setTmp7=70;}
    if (temp5<-10)&&(temp5>=-15){setTmp7=75;}
    if (temp5<-15)&&(temp5>=-20){setTmp7=80;}
    if (temp5<-20){setTmp7=85;}}
    else{setTmp7=setTmp1;}
     
  13. Оксфорд
    Регистрация:
    12.04.12
    Сообщения:
    9.401
    Благодарности:
    1.871

    Оксфорд

    Живу здесь

    Оксфорд

    Живу здесь

    Регистрация:
    12.04.12
    Сообщения:
    9.401
    Благодарности:
    1.871
    Адрес:
    Уфа
    image.jpg Написал свой первый скетч. На столе все работает как надо. Упаковать в коррбку и на натурные испытания. Сервопривод иногда при полном ходе дрожит в каком-нибудь положении. Это сервопривод китайский?
     
  14. pasko2680
    Регистрация:
    10.01.15
    Сообщения:
    9
    Благодарности:
    1

    pasko2680

    Участник

    pasko2680

    Участник

    Регистрация:
    10.01.15
    Сообщения:
    9
    Благодарности:
    1
    У меня печалька...:faq:, всю ночь пытался собрать в кучу всё это богатство и ничего.
    Бошка квадратная а результата нет.
    Простите за наглость но может кинете готовый скетч. :hello:
    Очень надо:hndshk:
     
  15. Оксфорд
    Регистрация:
    12.04.12
    Сообщения:
    9.401
    Благодарности:
    1.871

    Оксфорд

    Живу здесь

    Оксфорд

    Живу здесь

    Регистрация:
    12.04.12
    Сообщения:
    9.401
    Благодарности:
    1.871
    Адрес:
    Уфа
    Подал на серву повышенное напряжение - 9 в. Дребезг пропал и вроде не греется. Момент примерно 0.5 кг*см.