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

Ракетный котел - 2

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

Статус темы:
Закрыта.
  1. alarin
    Регистрация:
    29.07.16
    Сообщения:
    8.661
    Благодарности:
    3.751

    alarin

    Живу здесь

    alarin

    Живу здесь

    Регистрация:
    29.07.16
    Сообщения:
    8.661
    Благодарности:
    3.751
    Адрес:
    Казахстан, Алма-Ата
    @_Монолит_, чистка выходит за пределы ТЗ, только пепел пылесосить предусматривалось. По поводу дозатора: сообществом рассматривался вариант длительного горения и автоматической догрузки топлива. Но тогда еще опытов с температурой горения не было и обсуждение закончилось ничем, но было предложено к одному райзеру прикрутить два топливника, водном процесс идет, а во втором можно сушку делать, топливо загружать и пр. подготовительные работы. В час Х (по показаниям датчиков) происходит переключение топливников, например переключаем ПВ во второй бункер, но так, чтобы тепло от углей первого вынесло во второй. Дозатор топлива понятие условное, например можно подачу воздуха по вертикалиуправляемым сделать. Сначала воздух вниз подается, потом выше, а внизу соответственно перекрывается и т д. Соответственно можно добиться условий, когда внизу топливо выйдет из горения. Это просто варианты...
     
  2. Perelesnik
    Регистрация:
    01.02.13
    Сообщения:
    991
    Благодарности:
    4.614

    Perelesnik

    Живу здесь

    Perelesnik

    Живу здесь

    Регистрация:
    01.02.13
    Сообщения:
    991
    Благодарности:
    4.614
    Адрес:
    Черкассы
    Прошу прощения, что сейчас не участвую в этой увлекательной беседе - ушел в программирование.
    Собственно, "скелет" закончил, хотя и не перечитывал код, чтобы привести его в красивое состояние. Пересмотрю уже на финише. Теперь начинается самая интересная часть - создание алгоритма управления заслонками на основе совокупности всех данных с датчиков.

    Коды пока очень сырые, и больше напоминают коллаж, однако, проверены в работе и признаны работоспособными.

    Если кому это что-то скажет, то вот такое накодилось на сегодня:
    #include "max6675.h"
    #include <OneWire.h>
    #include <DHT.h>
    #include <Adafruit_SSD1306.h>
    #include <RCSwitch.h>

    #define POWER_MODE 0
    #define DHTTYPE DHT11 / DHT 11

    #define OLED_RESET 4
    Adafruit_SSD1306 display (OLED_RESET);

    /Servo servo;

    RCSwitch mySwitch = RCSwitch();

    OneWire sensDs (7); /куда подключен ds18b20
    const byte dht_pin = 4; /куда подключен датчик влажности

    DHT dht (dht_pin, DHTTYPE);
    int thermoDO1 = 2; /он же SO
    int thermoDO2 = 3; /он же SO
    int thermoCS = 5;
    int thermoCLK = 6; /он же SCK
    byte bufData[9]; / буфер данных
    float temperature; / измеренная температура ds18b20
    float therm1; /райзер
    float therm2; /бункер
    int s1 = 0; /угол для сервы вторички
    int t1; /ограниченная температура датчика в райзере
    unsigned long currentTime;
    unsigned long loopTime;

    MAX6675 thermocouplea (thermoCLK, thermoCS, thermoDO1);
    MAX6675 thermocoupleb (thermoCLK, thermoCS, thermoDO2);

    void setup() {
    Serial. begin (9600);
    currentTime = millis();
    loopTime = currentTime;
    pinMode (13, INPUT);
    display. begin (SSD1306_SWITCHCAPVCC, 0x3C);

    dht. begin();
    display. clearDisplay();

    mySwitch. enableTransmit (12);

    delay (500);
    }

    void loop() {
    if (digitalRead (13) = HIGH)
    {
    currentTime = millis();
    loopTime = currentTime;
    }

    / управление приводом заслонки вторичного воздуха

    /s1 = map (t1, 500, 1000, 0, 180);

    if (t1 <= 450) {
    s1 = 0;
    }
    if (t1 > 450 && t1 <= 600) {
    s1 = 90;
    }
    if (t1 > 600 && t1 <= 800) {
    s1 = 120;
    }
    if (t1 > 800) {
    s1 = 180;
    }

    Serial. print (String (s1, DEC);

    long time = (millis() - currentTime) / 1000;

    float h = dht. readHumidity();
    float t = dht. readTemperature();
    sensDs. reset(); / сброс шины
    sensDs. write (0xCC, POWER_MODE); / пропуск ROM
    sensDs. write (0x44, POWER_MODE); / инициализация измерения
    delay (200); / пауза 0,2 сек
    sensDs. reset(); / сброс шины
    sensDs. write (0xCC, POWER_MODE); / пропуск ROM
    sensDs. write (0xBE, POWER_MODE); / команда чтения памяти датчика
    sensDs. read_bytes (bufData, 9); / чтение памяти датчика, 9 байтов

    if (OneWire: crc8 (bufData, 8) = bufData[8])

    temperature = (float)(int) bufData[0] | (int) bufData[1]) < 8) * 0.0625 + 0.03125;

    therm1 = thermocouplea. readCelsius();
    therm2 = thermocoupleb. readCelsius();

    t1 = constrain (therm1, 300, 1000);

    display. setTextSize (1);
    display. setTextColor (WHITE);
    display. setCursor (0, 0);
    display. println (therm1);

    /if (time/60/60<10) {
    / display. setCursor (70,0);
    / display. println ("00"); }
    / else{
    display. setCursor (70, 0);
    display. println (time / 60 / 60);
    display. setCursor (85, 0);
    display. println (":");
    / if (time/60%60<10) {
    / display. setCursor (90,0);
    / display. println ("00"); }
    / else{
    display. setCursor (90, 0);
    display. println (time / 60) % 60);
    display. setCursor (110, 0);
    display. println (":");
    / if (time%60<10) {
    / display. setCursor (115,0);
    / display. println ("00"); }
    / else{
    display. setCursor (115, 0);
    display. println (time % 60);

    display. setCursor (110, 24);
    display. println (s1);

    display. setCursor (0, 12);
    display. println (therm2);
    display. setCursor (70, 12);
    display. println (temperature);
    display. setCursor (0, 24);
    display. println (t);
    display. setCursor (70, 24);
    display. println (h);
    display. display();
    display. clearDisplay();

    mySwitch. send (s1, 13);
    delay (100);
    mySwitch. send (h * 100, 14);
    delay (100);
    mySwitch. send (t * 100, 15);
    delay (100);
    mySwitch. send (temperature * 100, 16);
    delay (100);
    mySwitch. send (therm2 * 100, 17);
    delay (100);
    mySwitch. send (therm1 * 100, 18);
    delay (100);
    mySwitch. send (time, 19);
    delay (100);

    }

    Этот контроллер передает данные через беспроводную связь на комнатный девайс:

    #include <RCSwitch.h>

    RCSwitch mySwitch = RCSwitch();

    float h;
    float t;
    float temperature;
    float therm2;
    float therm1;
    int s1; /угол поворота сервы вторички

    long timing;

    int led1 = 4;
    int led2 = 5;
    int led3 = 6;
    int led4 = 7;

    int alarm = 520; / частота звука тревоги
    int alarmtemp1 = 450; / тревога по температуре в райзере
    int alarmtemp2 = 300; / тревога по температуре в бункере
    int normtemp = 600; / приемлемая температура райзера
    int hightemp = 800; / высокая температура райзера
    int extratemp = 950; / повышенная температура райзера
    int loadtemp = 420; / температура бункера для загрузки

    unsigned long currentTime;
    unsigned long loopTime;

    const int Pin_tone = 3; / номер порта зуммера

    void setup() {
    Serial. begin (9600);

    currentTime = millis();
    loopTime = currentTime;

    pinMode (Pin_tone, OUTPUT);
    pinMode (led1, OUTPUT);
    pinMode (led2, OUTPUT);
    pinMode (led3, OUTPUT);
    pinMode (led4, OUTPUT);

    digitalWrite (led1, HIGH);
    delay (200);
    digitalWrite (led2, HIGH);
    delay (200);
    digitalWrite (led1, LOW);
    delay (200);
    digitalWrite (led3, HIGH);
    delay (200);
    digitalWrite (led2, LOW);
    delay (200);
    digitalWrite (led4, HIGH);
    delay (200);
    digitalWrite (led3, LOW);
    delay (200);
    digitalWrite (led4, LOW);
    delay (200);

    mySwitch. enableReceive (0); / Receiver on inerrupt 0 => that is pin #2

    }

    void loop() {

    digitalWrite (led4, LOW);

    if (mySwitch.available() {

    int value = mySwitch. getReceivedValue();

    if (value = 0) {
    Serial. print(" ");
    }

    else {

    if (mySwitch. getReceivedBitlength() = 13)
    {
    s1 = mySwitch. getReceivedValue();
    }

    if (mySwitch. getReceivedBitlength() = 14)
    {
    h = mySwitch. getReceivedValue() * 0.01;
    }

    if (mySwitch. getReceivedBitlength() = 15)
    {
    t = mySwitch. getReceivedValue() * 0.01;
    }

    if (mySwitch. getReceivedBitlength() = 16)
    {
    temperature = mySwitch. getReceivedValue() * 0.01;
    }

    if (mySwitch. getReceivedBitlength() = 17)
    {
    therm2 = mySwitch. getReceivedValue() * 0.01;
    if (therm2 < alarmtemp2 && therm1 < alarmtemp1 && timing > 1200)
    {
    digitalWrite (led3, HIGH);
    tone (Pin_tone, alarm);
    delay (400);
    digitalWrite (led3, LOW);
    noTone (Pin_tone);
    delay (100);
    }
    }

    if (mySwitch. getReceivedBitlength() = 18)
    {
    therm1 = mySwitch. getReceivedValue() * 0.01;
    analogWrite (led4, 140);

    if (therm1 > normtemp)
    {
    digitalWrite (led1, HIGH);
    }
    else
    {
    digitalWrite (led1, LOW);
    }

    if (therm1 > hightemp)
    {
    digitalWrite (led2, HIGH);
    }
    else
    {
    digitalWrite (led2, LOW);
    }

    if (therm1 > extratemp)
    {
    digitalWrite (led3, HIGH);
    }
    else
    {
    digitalWrite (led3, LOW);
    }
    if (therm1 < normtemp && therm2 < loadtemp && timing > 1200)
    {
    digitalWrite (led1, HIGH);
    delay (200);
    digitalWrite (led2, HIGH);
    delay (200);
    digitalWrite (led1, LOW);
    delay (200);
    digitalWrite (led3, HIGH);
    delay (200);
    digitalWrite (led2, LOW);
    delay (200);
    digitalWrite (led3, LOW);
    }

    }

    if (mySwitch. getReceivedBitlength() = 19)
    {
    timing = mySwitch. getReceivedValue();
    }

    currentTime = millis();
    if (currentTime >= (loopTime + 5000)
    {
    loopTime = currentTime;

    if (timing / 60 / 60 < 10) {
    Serial. print ("0");
    }
    Serial. print (timing / 60 / 60);
    Serial. print (":");
    if (timing / 60 % 60 < 10) {
    Serial. print ("0");
    }
    Serial. print (timing / 60) % 60);
    Serial. print (":");
    if (timing % 60 < 10) {
    Serial. print ("0");
    }
    Serial. print (timing % 60);

    Serial. print ("; ");
    Serial. print (therm1);
    Serial. print ("; ");
    Serial. print (therm2);
    Serial. print ("; ");
    Serial. print (temperature);
    Serial. print ("; ");
    Serial. print (t);
    Serial. print ("; ");
    Serial. print (h);
    Serial. print ("; ");
    Serial. println (s1);

    }

    }

    mySwitch. resetAvailable();
    }

    }

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

    / скетч для Arduino, который принимает данные
    #include <Servo.h>

    Servo servo;

    String s1;
    int sint;
    int presint;
    byte dev;
    long previousMillis = 0;

    void setup() {

    Serial. begin (9600);
    presint = 180;
    }

    void loop() {

    unsigned long currentMillis = millis();

    if (Serial.available() > 0) {

    s1 = Serial. readString();
    sint = s1.toInt();
    if (sint < 5) {
    sint = 5;
    }

    if (sint > 180) {
    sint = 180;
    }

    }
    Serial. println (currentMillis - previousMillis);

    dev = (presint - sint);

    if (dev > 5)
    {
    servo. attach (10);
    servo. write (sint);

    }
    if (currentMillis - previousMillis > dev * 25)
    {
    previousMillis = currentMillis;
    presint = sint;
    servo. detach();
    }
    }

    Но это по сути только оболочка, интерфейс, а из алгоритма пока вот такой примитив в коде контроллера на котле:
    if (t1 <= 450) {
    s1 = 0;
    }
    if (t1 > 450 && t1 <= 600) {
    s1 = 90;
    }
    if (t1 > 600 && t1 <= 800) {
    s1 = 120;
    }
    if (t1 > 800) {
    s1 = 180;
    }

    Написал, просто "чтобы было что-то", в коде t1 - температура в райзере, s1 - угол поворота сервопривода.

    Завтра уже буду вписывать зависимости от бункерной температуры, от воды, от времени с момента загрузки и так далее.

    Сегодня было даже лень ходить к котлу - поэтому под обед забросил пару маленьких поленьев для затравки и одну огромную корягу сверху (коряга горела 6 часов, и еще не догорела), и недавно еще одну корягу добавил сверху - это до полуночи хватит.

    Да, вчера вечером загрузил чуть больше половины бункера и прикрутил котловый регулятор по воде на минимум - всего загрузки хватило на 13 часов.

    Пока нет устойчивых "минусов", буду только крупняк бросать - в горячем бункере и совершенно одинокое бревно отлично работает.

    Вот состояние на сейчас:
    Снимок.JPG
    Первое - время с момента загрузки одинокой коряги в бункер.
    Крайнее справа - угол поворота сервопривода (сам привод пока не установлен, это я для отладки вывел, ну и в логе потом будет видно, как работает все, когда механику привода доделаю).

    ЗЫ: приятно - младшая дочка давно уже интересовалась, то сегодня подарил ей одну Ардуинку, дисплей, ну и кучу всякого для обучения: (бредборд, соединители, кнопочки, пригоршню светодиодов... и прочая, и прочая). На скорую руку собрали несколько схем и запустили. Пусть дитё учится. Оно в жизни всякое может пригодится. Особенно, девочке.

    ЗЫЗЫ: чуть приморился от этой электронной мелкоты, сейчас возникло желание немного отдохнуть - попробую сделать приложение для Винды, чтобы был типа терминал с показаниями от котла, а то в одном окошке PuTTY как-то не празднично смотреть. А так будет удобно иметь аккуратную "плашечку" где-то в углу рабочего стола.
     
    Последнее редактирование: 03.12.17
  3. _Монолит_
    Регистрация:
    30.01.17
    Сообщения:
    15
    Благодарности:
    3

    _Монолит_

    Участник

    _Монолит_

    Участник

    Регистрация:
    30.01.17
    Сообщения:
    15
    Благодарности:
    3
    Адрес:
    Одесса
    @alarin, спасибо за разъяснение. Мне кажется, что это все слишком сложно и дорого и приведет к увеличению габаритов. И если даже будет хорошо работать, то мало найдется желающих повторить такой конструктив из-за его сложности.
     
  4. Алексаендр
    Регистрация:
    06.08.14
    Сообщения:
    446
    Благодарности:
    382

    Алексаендр

    Живу здесь

    Алексаендр

    Живу здесь

    Регистрация:
    06.08.14
    Сообщения:
    446
    Благодарности:
    382
    Не так и страшен второй бункер. И стартовать не только заслонками, но и электро\газо розжигом можно. Зато раз в сутки обслуживание.
     
  5. sergMinsk
    Регистрация:
    08.10.09
    Сообщения:
    4.484
    Благодарности:
    2.363

    sergMinsk

    Живу здесь

    sergMinsk

    Живу здесь

    Регистрация:
    08.10.09
    Сообщения:
    4.484
    Благодарности:
    2.363
    Адрес:
    Минск
  6. alarin
    Регистрация:
    29.07.16
    Сообщения:
    8.661
    Благодарности:
    3.751

    alarin

    Живу здесь

    alarin

    Живу здесь

    Регистрация:
    29.07.16
    Сообщения:
    8.661
    Благодарности:
    3.751
    Адрес:
    Казахстан, Алма-Ата
    Ну вот, совсем не фантастика, если оценить плюсы и минусы двухбункерности, то вполне приличное решение может получится. А сложность не такая уже и большая, вместо одного большого сделать пару мелких. Да хоть просто перегородке, хоть райзер посредине, я то и в угол хорошо вписывается можно сказать даже гармоничнее фэншуев всяких. Опять же мусора меньше на виду, один горит в другой складываем... Вот сам уже плюсы описывать начал, может кто продолжит...
     
  7. King1972
    Регистрация:
    12.06.12
    Сообщения:
    708
    Благодарности:
    267

    King1972

    Живу здесь

    King1972

    Живу здесь

    Регистрация:
    12.06.12
    Сообщения:
    708
    Благодарности:
    267
    Адрес:
    Донбасс
    на избушку на курьей ножке похоже)
    Была у меня книга по печным работам, там тоже
    вариант двухбункерной печи под уголь приводился,
    из набора бетонных элементов заводского изготовления.
     
  8. arsenty
    Регистрация:
    15.01.15
    Сообщения:
    3.095
    Благодарности:
    1.079

    arsenty

    Живу здесь

    arsenty

    Живу здесь

    Регистрация:
    15.01.15
    Сообщения:
    3.095
    Благодарности:
    1.079
    ..Один ехидный вопрос...А как, в случае ракеты, второй бункер готовить для полёта .если райзер уже гоячий.?Переходный процесс, каков он?
     
  9. King1972
    Регистрация:
    12.06.12
    Сообщения:
    708
    Благодарности:
    267

    King1972

    Живу здесь

    King1972

    Живу здесь

    Регистрация:
    12.06.12
    Сообщения:
    708
    Благодарности:
    267
    Адрес:
    Донбасс
    В одном горит - в другом загруженное топливо подсыхает, ждёт старта ..

    Ну так коллективный мозговой штурм, начинают, по морской традиции, юнги ..
     
  10. alarin
    Регистрация:
    29.07.16
    Сообщения:
    8.661
    Благодарности:
    3.751

    alarin

    Живу здесь

    alarin

    Живу здесь

    Регистрация:
    29.07.16
    Сообщения:
    8.661
    Благодарности:
    3.751
    Адрес:
    Казахстан, Алма-Ата
    @arsenty, А не будет переходного процесса если ниже критической температуры райзер не упадет
     
  11. King1972
    Регистрация:
    12.06.12
    Сообщения:
    708
    Благодарности:
    267

    King1972

    Живу здесь

    King1972

    Живу здесь

    Регистрация:
    12.06.12
    Сообщения:
    708
    Благодарности:
    267
    Адрес:
    Донбасс
    @arsenty, @alarin, вот двухходовой кран между бункерами
    в керамическом исполнении и соответствующего сечения.
    Для затравки.
     
  12. alarin
    Регистрация:
    29.07.16
    Сообщения:
    8.661
    Благодарности:
    3.751

    alarin

    Живу здесь

    alarin

    Живу здесь

    Регистрация:
    29.07.16
    Сообщения:
    8.661
    Благодарности:
    3.751
    Адрес:
    Казахстан, Алма-Ата
    Да можно и простой вариант, перекрываемые заслонкой "ГО верх" и "ГО" низ в перегородке между бункерами. В левом +400, в правом + 50, открываем заслонки... правильно при одинаковом объеме температура должна стать одинаковой, как раз, чтобы началась 1 стадия пиролиза
     
  13. arsenty
    Регистрация:
    15.01.15
    Сообщения:
    3.095
    Благодарности:
    1.079

    arsenty

    Живу здесь

    arsenty

    Живу здесь

    Регистрация:
    15.01.15
    Сообщения:
    3.095
    Благодарности:
    1.079
    Вот у меня в опытах два года назад (начало эпопеи) вылезла проблемка с переключением между источниками ПГ. Так вот дымосос пришлось придумать инжекторный...Это как в двигателе переход с газа на бензин. Что то сильно похожее. Кто это уже решил или хотя б пытался поделитесь. хоть в личку, и то б не плохо было.
     
  14. Кольчугин
    Регистрация:
    04.07.15
    Сообщения:
    9.670
    Благодарности:
    2.890

    Кольчугин

    Живу здесь

    Кольчугин

    Заблокирован

    Живу здесь

    Регистрация:
    04.07.15
    Сообщения:
    9.670
    Благодарности:
    2.890
    Адрес:
    Новосибирск
    Есть готовое решение - Дымоход Вермилоджик. Модули длиной 1000мм, 500мм, 330мм. Толщина стенки 40мм. Снаружи 430 феритка или оцинковка. Производят в Новосибирске.
     
  15. Алексаендр
    Регистрация:
    06.08.14
    Сообщения:
    446
    Благодарности:
    382

    Алексаендр

    Живу здесь

    Алексаендр

    Живу здесь

    Регистрация:
    06.08.14
    Сообщения:
    446
    Благодарности:
    382
    Повторюсь: на время перехода и розжига энергонезависимостью и экономичностью можно пренебречь.
    В переводе на простой язык: на 5-15 минут можно включить строительный фен или паяльную лампу. от датчика.
     
Статус темы:
Закрыта.