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

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

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

Статус темы:
Закрыта.
  1. Сергей247
    Регистрация:
    30.04.12
    Сообщения:
    6.161
    Благодарности:
    1.867

    Сергей247

    Живу здесь

    Сергей247

    Живу здесь

    Регистрация:
    30.04.12
    Сообщения:
    6.161
    Благодарности:
    1.867
    Адрес:
    Минск
    Пессимистичненько. :) С такими "материалами" в космос не полетишь...
     
  2. glory24
    Регистрация:
    08.01.14
    Сообщения:
    205
    Благодарности:
    102

    glory24

    Живу здесь

    glory24

    Живу здесь

    Регистрация:
    08.01.14
    Сообщения:
    205
    Благодарности:
    102
    Адрес:
    Киев
    Вот это правильно!
    Вот спасибо за ссылку, а то у меня, зараза, дорогой стоит MAX31855. Надо переходить на такой как у Вас.
    Как по мне, так слишком маленький и не информативный.
    У меня такой: QC12864B.
    так IMAG0800(1).jpg
    На мой взгляд, прекрасный выбор! У меня такие же. Правда из-за того что они все время "подрагивают", микросхемки управления в них греются. У меня в прошлом отопительном сезоне умер один. Мы после этого переделать управление так, чтобы питание на них подавалось перед управлением и снималось через 5 сек. после последнего движения. После этого они стали вечными.
    А мониторинг у Вас как осуществляется, где графики строятся?
    У меня тут.
    Мое устройство называется "Котельная."

    .
     
  3. alarin
    Регистрация:
    29.07.16
    Сообщения:
    8.662
    Благодарности:
    3.751

    alarin

    Живу здесь

    alarin

    Живу здесь

    Регистрация:
    29.07.16
    Сообщения:
    8.662
    Благодарности:
    3.751
    Адрес:
    Казахстан, Алма-Ата
    А герметичность нужна, может быть избыточная газация в топливнике, будет задымление. Явление практически штатное, если котел без управления. Еще был реверс тяги, когда большое количество газов заполнило колпак и райзер "встал". При перекрытой ПВ, горение шло со стороны подачи ВВ, но факел вышел через забитые пеплом колосники, почистил их и ушел обратно в райзер.
     
  4. Perelesnik
    Регистрация:
    01.02.13
    Сообщения:
    991
    Благодарности:
    4.616

    Perelesnik

    Живу здесь

    Perelesnik

    Живу здесь

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

    Но сейчас делаю контроллер с большим экраном (просили), да вообще, все программно и компонентно делаю по новому.

    По поводу управления сервами, то я же код выкладывал. Там прописано, что каждая серва подключается на 2 секунды для отработки положения, а потом отключается в ожидании новой команды. Кроме того, сервоприводы не могут работать одновременно, чтобы не перегружать питание.
    Ну, еще раз выложу, посмотрите, как реализовано:
    / скетч для Arduino, который принимает данные
    #include <Servo.h>

    Servo servo1;
    Servo servo2;

    String s1;
    int sighn;
    int sint1;
    int sint2;
    int presint1;
    int presint2;
    int angle1;
    int angle2;
    byte dev1;
    byte dev2;
    byte flag1;
    byte flag2;
    unsigned long previousMillis = 0;
    unsigned long currentMillis = 0;
    unsigned long previousMillis2 = 0;
    unsigned long currentMillis2 = 0;
    int worktime = 2000;

    void setup() {

    Serial. begin (9600);
    presint1 = 200;
    presint2 = 200;
    }

    void loop() {

    if (Serial.available() > 0) {

    s1 = Serial. readString();
    sighn = s1.toInt();

    if (sighn <= 180){
    sint1 = sighn;
    }
    else {
    sint2 = sighn/100;
    }

    angle1 = constrain (sint1, 0, 175);
    angle2 = constrain (sint2, 0, 175);

    }
    dev1 = (presint1 - sint1);
    dev2 = (presint2 - sint2);

    if (dev1 > 5)
    {
    flag1 = 1;
    previousMillis = millis();
    presint1 = sint1;
    }

    if (flag1 = 1)
    {

    servo1.attach (10);

    servo1.write (180 - angle1);
    currentMillis = millis();

    if (currentMillis - previousMillis > worktime)
    {

    flag1 = 0;
    servo1.detach();
    }

    }

    if (dev2 > 5)
    {
    flag2 = 1;
    previousMillis2 = millis();
    presint2 = sint2;
    }

    if (flag2 = 1)
    {

    servo2.attach (11);

    servo2.write (180 - angle2);
    currentMillis2 = millis();

    if (currentMillis2 - previousMillis2 > worktime)
    {

    flag2 = 0;
    servo2.detach();
    }

    }
    / Serial. println (sighn);
    }

    Графики у меня автоматически не строятся - просто пишется лог всех параметров. Если мне что-то интересно посмотреть в форме графика, то беру соответствующий кусок лога и перевожу в график.
    Но уже и не особо интересно... Вот когда алгоритм управления налаживал, то было полезно, а сейчас уже не особо.
    Сейчас котел стал более самодостаточным, и в дополнительном контроле с моей стороны уже не нуждается.

    Выкладывать параметры в сеть мне тоже нет нужды - я из дома редко отлучаюсь, поэтому удаленно смотреть не нужно...

    Да и толку смотреть? Единственный реально полезный для меня сигнал - это когда котел решает, что пора делать очередную загрузку топлива. Я вот сейчас только на этот сигнал и обращаю внимание.

    Прочее... ну, это как когда-то были дополнительные функции у телефона с АОНом - всякие калькуляторы, планировщики, тонкие настройки... на целую книжку с инструкциями по применению. А реально просто работал один определитель номера, а остальное испытывалось только в день покупки аппарата, из любопытства, а затем уже никогда.

    Да, еще одно полезное - это счетчик времени с момента загрузки топлива.

    Вот и все, что реально полезно для меня.

    Да, тут предлагали сделать планировщик суточной динамики температуры - ну, чтобы когда хозяева на работе, то не сильно грело, а когда дома - то грело нормально... Ну, не знаю, на термостате газового котла такая функция есть, только я ею за много лет ни разу не пользовался. Попробовал только из любопытства.

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

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

    Ну код будет всего на 2-3 десятка строк.

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

    MAX31855K может быть здесь полезным разве что для удовлетворения любопытства или чтобы похвастаться "насколько я райзер разогнал". Практически, при повышении температуры выше 1К градусов приходится открывать прямой ход вторичного воздуха на максимум, и вопрос "насколько там выше 1000 гралусов" не имеет значения.
     
    Последнее редактирование: 03.01.18
  5. Perelesnik
    Регистрация:
    01.02.13
    Сообщения:
    991
    Благодарности:
    4.616

    Perelesnik

    Живу здесь

    Perelesnik

    Живу здесь

    Регистрация:
    01.02.13
    Сообщения:
    991
    Благодарности:
    4.616
    Адрес:
    Черкассы
    Вот что вынес на главный экран котлового девайса:
    20180103_185951.JPG

    Set: Установленная температура,
    Water: большими цифрами подача, маленькими ниже - обратка.
    Рядом - значок, который указывает, растет ли температура воды или падает.
    В верхнем правом углу - время с момента загрузки топлива.
    Бункер, райзер - понятно, показания термопар.
    Рядом иконка, сигнализирующая о том, что в райзере идет горение (если нет, то там "снежинка" рисуется).
    И в правом нижнем углу - иконка, указывающая, что SD карточка подключена, и идет запись лога.
    Между этими иконками будет какой-то значок, который будет указывать на действие, требуемое от пользователя: пора грузить топливо, или еще что-то... пока не знаю. Или если какая ошибка возникнет (например, обрыв термопары), то тоже туда выводить.

    Вот решил, что такой информации на экране будет достаточно. Если нужно подробнее - то можно посмотреть лог на карточке, или посмотреть на экране компьютера - полный список параметров постоянно передается по радио. Запись лога на карточку происходит не постоянно, а всего раз в 1 минуту.
    Выглядит лог сейчас так:
    Снимок.JPG
    По порядку:
    - время с момента загрузки
    - температура в райзере
    - температура в бункере
    - установленная температура
    - подача
    - обратка
    - угол сервы первички
    - угол сервы вторички

    По радио передается примерно то же, плюс Id передающего устройства, ну еще будет всякая служебная информация.

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

    Да, раньше данные на экране немного не помещались, поэтому я сделал прокрутку экрана тем же энкодером, но потом нашел, как всё поместить, и прокрутку убрал.

    Если кому интересно глянуть код, то вот такой он сейчас:
    #define INTERVAL_GET_DATA 2000 / интервала измерений, мс
    #define DS18B20PIN 23 / пин подключения контакта DATA
    #include <OneWire.h>

    #include "U8glib.h"
    #include <TimerOne.h>
    #include <Button.h>
    #include <EEPROM.h>

    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>

    #include <SdFat.h>

    OneWire ds (DS18B20PIN);

    int speakerPin = 5;
    int groundPin = 22;

    unsigned long millis_int1 = 0;
    float pretemp;
    float rew_water = 0;
    float forv_water = 0;
    float pre_forv_water = 0;

    const uint8_t SOFT_MISO_PIN = 12;
    const uint8_t SOFT_MOSI_PIN = 11;
    const uint8_t SOFT_SCK_PIN = 13;
    /
    / Chip select may be constant or RAM variable.
    const uint8_t SD_CHIP_SELECT_PIN = 9;
    const uint8_t RF_CHIP_SELECT_PIN = 7;

    byte inSD;

    / SdFat software SPI template
    SdFatSoftSpi<SOFT_MISO_PIN, SOFT_MOSI_PIN, SOFT_SCK_PIN> sd;

    / Test file.
    SdFile file;

    #define Butt 2 / пин кнопки

    RF24 radio (RF_CHIP_SELECT_PIN, 8); / CE, CSN

    const byte address1[6] = "00001";
    const byte address2[6] = "00002";

    Button encoderA (3, 4); / сигнал A
    Button encoderB (4, 4); / сигнал B

    int pos = 0; / пооложение энкодера
    byte settherm = 60; / установка температуры воды
    byte presetthermradio;
    byte presettherm = 60;
    bool buttflag = LOW; / перебираем положение кнопки
    bool thermmenuflag = LOW;
    int menu = 0; / входим в меню по такту кнопки
    int submenu = 0;
    int prepos = 0; / предыдущее положение
    int L = 0; / положение по вертикали на главном экране
    int LCDledPin = 44; / Светодиод подключен к выходы 44
    byte LCDled = 120;
    bool LCDflag = LOW;
    byte preLCDled = 120;
    int preposLED = 0;
    byte id = 1;

    int counter = 0;
    int counterwrite = 0;

    float riser;
    float bunker;

    byte servoprim = 11;
    byte servosec = 22;

    long worktime;
    unsigned long currentTime; / таймер загрузки
    /float water = 66;

    unsigned long presentTime;
    unsigned long preMillisRadioWrite;
    long RadioWriteOFF = 900;
    long RadioWriteON = 100;

    U8GLIB_ST7920_128X64 u8g (38, 40, 42, U8G_PIN_NONE); /иннициализация дисплея

    static unsigned char u8g_sd_bits[] = {0xFC, 0x03, 0xAA, 0x02, 0xA9, 0x02, 0x01, 0x02, 0x01, 0x02, 0x69, 0x02, 0xA5, 0x02, 0xA9, 0x02, 0x65, 0x02, 0x01, 0x02, 0xFF, 0x03, 0x00, 0x00};
    static unsigned char u8g_rize_bits[] = {0x00, 0x00, 0x38, 0x00, 0x44, 0x08, 0x44, 0x14, 0x44, 0x22, 0x44, 0x08, 0x44, 0x14, 0x54, 0x22, 0x54, 0x08, 0x92, 0x14, 0xBA, 0x22, 0x92, 0x08, 0x44, 0x14, 0x38, 0x22, 0x00, 0x00, 0x00, 0x00};
    static unsigned char u8g_foll_bits[] = {0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0x84, 0x44, 0x84, 0x28, 0x84, 0x10, 0x84, 0x44, 0x84, 0x28, 0x84, 0x10, 0x84, 0x44, 0x02, 0x29, 0x32, 0x11, 0x32, 0x45, 0x84, 0x28, 0x78, 0x10, 0x00, 0x00};
    static unsigned char u8g_fire_bits[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0xE8, 0x0B, 0x78, 0x0F, 0x78, 0x1E, 0xDC, 0x1C, 0x9C, 0x18, 0x0C, 0x18, 0x08, 0x08, 0x10, 0x04, 0x00, 0x00};
    static unsigned char u8g_snow_bits[] = {0x00,0x00,0xFE,0x0F,0xFE,0x0F,0x0E,0x0E,0xAE,0x0E,0x06,0x0C,0x56,0x0D,0x06,0x0C,0xAE,0x0E,0x0E,0x0E,0xFE,0x0F,0xFE,0x0F,0x00,0x00,0x00,0x00};

    void Button() {

    if (digitalRead (Butt) = LOW) { /проверка нажатия на кнопку
    if (buttflag = LOW) {
    menu+;
    tone (speakerPin, 800, 200);

    if (menu >= 3) {
    menu = 0;
    L = 0;
    EEPROM. write (0, settherm);
    EEPROM. write (1, LCDled);

    }
    if (menu = 1) {
    pos = 0;
    L = 0;
    }
    }
    buttflag = HIGH;

    }
    if (digitalRead (Butt) = HIGH) { /проверка нажатия на кнопку
    buttflag = LOW;
    }

    }

    / обработчик прерывания 250 мкс
    void timerInterrupt() {
    encoderA. filterAvarage(); / вызов метода фильтрации
    encoderB. filterAvarage(); / вызов метода фильтрации
    if (encoderA. flagClick = true) {
    encoderA. flagClick = false;
    if (encoderB. flagPress = true) {
    / против часовой стрелки
    pos-;
    tone (speakerPin, 1200, 100);

    }
    else {
    / по часовой стрелке
    pos+;
    tone (speakerPin, 1400, 100);

    }
    }
    }

    / рисуем меню
    void menudraw (void) {
    u8g.drawBox (0, submenu * 12, 5, 10);
    u8g.drawHLine (0, submenu * 12 + 10, 120);
    u8g.setFont (u8g_font_7x14Br);
    u8g.setPrintPos (10, 10);
    u8g.print("Back");
    u8g.setPrintPos (10, 22);
    u8g.print("Start");
    u8g.setPrintPos (10, 34);
    u8g.print("Set Therm");
    u8g.setPrintPos (10, 46);
    u8g.print("Brightness %");
    u8g.setPrintPos (98, 46);
    u8g.print (map (LCDled, 0, 255, 0, 100);

    if (thermmenuflag = LOW) {
    u8g.setPrintPos (98, 34);
    u8g.print (settherm);
    u8g.setPrintPos (62, 22);
    u8g.print (worktime / 60 / 60);
    u8g.setPrintPos (75, 22);
    u8g.print(":");
    u8g.setPrintPos (80, 22);
    u8g.print (worktime / 60) % 60);
    u8g.setPrintPos (93, 22);
    u8g.print(":");
    u8g.setPrintPos (98, 22);
    u8g.print (worktime % 60);
    }
    if (menu = 1) {
    submenu = pos;
    if (submenu >= 4) {
    pos = 0;
    }
    if (submenu < 0) {
    pos = 0;
    }
    }

    if (submenu = 0 && menu = 2) {
    menu = 0;
    submenu = 1;
    }
    if (submenu = 1 && menu = 2) {
    menu = 0;
    currentTime = millis();
    pos = 1;
    }
    if (pos = 2 && menu = 2 && thermmenuflag = LOW && LCDflag = LOW) {
    prepos = pos;
    presettherm = settherm;
    thermmenuflag = HIGH;
    }

    if (thermmenuflag = HIGH && LCDflag = LOW) {
    u8g.drawFrame (78, 6, 45, 28);
    u8g.drawFrame (77, 5, 47, 30);
    u8g.setFont (u8g_font_gdb20n);
    u8g.setPrintPos (84, 30);
    u8g.print (settherm);
    settherm = presettherm + pos - prepos;
    if (settherm >= 100 | settherm < 40) {
    prepos = pos;
    }

    }

    if (menu != 2) {
    thermmenuflag = LOW;
    LCDflag = LOW;
    }

    if (pos = 3 && menu = 2 && LCDflag = LOW && thermmenuflag = LOW) {
    preposLED = pos;
    preLCDled = LCDled;
    LCDflag = HIGH;
    }

    if (LCDflag = HIGH && thermmenuflag = LOW) {
    u8g.drawBox (120, submenu * 12, 5, 11);
    LCDled = preLCDled + (pos - preposLED) * 2.55);
    if (LCDled >= 255 | LCDled < 0) {
    preposLED = pos;
    }

    }
    }

    void workdraw (void) {
    u8g.setFont (u8g_font_7x14Br);
    u8g.setPrintPos (77, 12);
    u8g.print (worktime / 60 / 60);
    u8g.setPrintPos (90, 12);
    u8g.print(":");
    u8g.setPrintPos (95, 12);
    u8g.print (worktime / 60) % 60);
    u8g.setPrintPos (108, 12);
    u8g.print(":");
    u8g.setPrintPos (113, 12);
    u8g.print (worktime % 60);
    u8g.drawFrame (74, 0, 54, 14);
    u8g.drawFrame (0, 0, 34, 38);
    u8g.drawLine (35, 0, 72, 0);
    u8g.drawLine (35, 0, 35, 37);
    u8g.drawLine (72, 0, 72, 15);
    u8g.drawLine (72, 15, 127, 15);
    u8g.drawLine (35, 37, 79, 37);
    u8g.drawLine (79, 37, 79, 51);
    u8g.drawLine (79, 51, 127, 51);
    u8g.drawLine (127, 15, 127, 51);

    u8g.setPrintPos (4, 12);
    u8g.print("Set:");
    u8g.setPrintPos (37, 12);
    u8g.print("Water");
    u8g.setFont (u8g_font_gdb20n);
    u8g.setPrintPos (1, 36);
    u8g.print (settherm);
    u8g.setPrintPos (38, 36);
    u8g.print (forv_water);
    u8g.setFont (u8g_font_7x14Br);
    u8g.setPrintPos (87, 49);
    u8g.print (rew_water);

    if (riser - bunker >= 20) {
    u8g.drawXBM (78, 50, 15, 15, u8g_fire_bits);
    }
    else {
    u8g.drawXBM (78, 52, 13, 14, u8g_snow_bits);
    }

    if (inSD = HIGH) {
    u8g.drawXBM (118, 53, 11, 12, u8g_sd_bits);
    }
    else {

    u8g.print(" ");
    }

    if (pre_forv_water <= forv_water) {
    u8g.drawXBM (111, 18, 16, 16, u8g_rize_bits);
    }
    else {
    u8g.drawXBM (111, 18, 16, 16, u8g_foll_bits);
    }

    u8g.drawFrame (0, 39, 78, 25);
    /u8g.drawFrame (0, 51, 78, 13);

    u8g.setFont (u8g_font_5x7r);
    u8g.setPrintPos (2, 49);
    u8g.print("Bunker");
    u8g.setPrintPos (2, 60);
    u8g.print("Riser");

    u8g.setFont (u8g_font_7x14Br);
    u8g.setPrintPos (35, 51);
    u8g.print (bunker);
    u8g.setPrintPos (28, 62);
    u8g.print (riser);
    }

    void setup() {

    Serial. begin (9600);
    if (EEPROM.read (0) >= 100) {
    settherm = 60;
    }
    else {
    settherm = EEPROM. read (0);
    }

    LCDled = EEPROM. read (1);

    radio. begin();
    radio. openWritingPipe (address1);
    radio. openReadingPipe (1, address2);
    radio. setPALevel (RF24_PA_MIN);

    pinMode (2, INPUT);
    pinMode (LCDledPin, OUTPUT);
    attachInterrupt (0, Button, CHANGE); /прерывание по изменению пина №2 (для Arduino UNO)
    Timer1.initialize (250); / инициализация таймера 1, период 250 мкс
    Timer1.attachInterrupt (timerInterrupt, 250); / задаем обработчик прерываний

    pinMode (SD_CHIP_SELECT_PIN, OUTPUT);
    pinMode (RF_CHIP_SELECT_PIN, OUTPUT);

    analogWrite (LCDledPin, LCDled);
    rew_water = 0;
    forv_water = 0;

    u8g.firstPage();
    do {
    workdraw();
    } while (u8g.nextPage();
    sd. begin (SD_CHIP_SELECT_PIN, SPI_HALF_SPEED);

    pinMode (speakerPin, OUTPUT);
    pinMode (groundPin, OUTPUT);
    digitalWrite (groundPin, LOW);
    }

    void loop()
    {
    float temp = get_data_ds18b20();

    if (millis() - millis_int1 >= INTERVAL_GET_DATA) {
    if (temp < 100) {
    if (pretemp - temp >= 2) {
    rew_water = temp;
    }
    if (temp - pretemp >= 2) {
    pre_forv_water = forv_water;
    forv_water = temp;
    }

    pretemp = temp;
    }

    millis_int1 = millis();
    }
    }

    float get_data_ds18b20() {
    byte i;
    byte present = 0;
    byte data[12];
    byte addr[8];
    int Temp;
    float fTemp = 0.0;

    if (!ds.search (addr) {
    ds. reset_search();
    }

    ds. reset();
    ds. select (addr);
    ds. write (0x44, 1);
    present = ds. reset();
    ds. select (addr);
    ds. write (0xBE);

    for (i = 0; i < 9; i+) {
    data = ds. read();
    }
    Temp = (data[1] < 8) + data[0]);

    fTemp = 1.0 * Temp / 16 + (float (Temp % 16) * 1.0 / 16;

    presentTime = millis();
    worktime = (presentTime - currentTime) / 1000; / таймер времени горения закладки топлива
    analogWrite (LCDledPin, LCDled);

    if (menu >= 1) {
    u8g.firstPage();
    do {
    menudraw();
    } while (u8g.nextPage();
    }

    if (menu = 0) {
    u8g.firstPage();
    do {
    workdraw();
    } while (u8g.nextPage();

    struct Datamain {
    byte id;
    long worktime;
    float riser;
    float bunker;
    int settherm;
    float forv_water;
    float rew_water;
    byte servoprim;
    byte servosec;
    } text;

    struct LowDevice {
    byte id;
    int settherm;
    float riser;
    int bunker;
    } text1;

    text. id = id;
    text. worktime = worktime;
    text. riser = riser;
    text. bunker = bunker;
    text. settherm = settherm;
    text. forv_water = forv_water;
    text. rew_water = rew_water;
    text. servoprim = servoprim;
    text. servosec = servosec;

    if (presentTime - preMillisRadioWrite >= RadioWriteOFF) {

    digitalWrite (SD_CHIP_SELECT_PIN, HIGH);
    digitalWrite (RF_CHIP_SELECT_PIN, LOW);
    radio. stopListening();

    radio. write(&text, sizeof (text);
    }

    if (presentTime - preMillisRadioWrite >= RadioWriteOFF + RadioWriteON) {

    radio. startListening();
    if (radio.available() {
    radio. read(&text1, sizeof (text1);
    if (text1.settherm > 40 && text1.settherm != presetthermradio) {
    settherm = text1.settherm;
    presetthermradio = text1.settherm;
    EEPROM. write (0, settherm);
    }
    riser = text1.riser;
    bunker = text1.bunker;
    }
    preMillisRadioWrite = presentTime;
    counter+;
    }

    if (counter >= 2) {
    counterwrite+;
    digitalWrite (RF_CHIP_SELECT_PIN, HIGH);
    digitalWrite (SD_CHIP_SELECT_PIN, LOW);

    if (counterwrite >= 30) {

    file. open("Log.txt", FILE_WRITE);

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

    file. print("; ");
    file. print (riser);

    file. print("; ");
    if (bunker > 0 && bunker < 1030) {
    file. print (bunker);
    }
    else {
    file. print("0");
    }

    file. print("; ");
    file. print (settherm);

    file. print("; ");
    file. print (forv_water);

    file. print("; ");
    if (rew_water < 100 && rew_water > 0) {
    file. print (rew_water);
    }
    else {
    file. print("0");
    }

    file. print("; ");
    file. print (servoprim);

    file. print("; ");
    file. println (servosec);

    file. close();
    counterwrite = 0;
    }

    file. open("Log.txt", FILE_READ);

    if (file.read() >= 0) {
    inSD = HIGH;
    }
    else {
    inSD = LOW;
    sd. begin (SD_CHIP_SELECT_PIN, SPI_HALF_SPEED);
    }
    file. close();

    counter = 0;
    }
    }
    return fTemp;
    }

    Ну пока так, в рабочем процессе, без комментариев и немножко беспорядочно написано... Но работоспособно)

    Вот, отвлекаюсь писанием кода и рисованием иконочек пикселями в Paint, так как точно под Новый Год заболел - плоховато, температура и всё такое... Вместо праздничных блюд бульон и овсяночка...
     
    Последнее редактирование: 03.01.18
  6. StarykovMih
    Регистрация:
    13.11.12
    Сообщения:
    522
    Благодарности:
    176

    StarykovMih

    Живу здесь

    StarykovMih

    Живу здесь

    Регистрация:
    13.11.12
    Сообщения:
    522
    Благодарности:
    176
    Адрес:
    Киев
    Думаю, стоит, тем более, что "лишние" выводы МЕГИ могут быть использованы для сигнализации аварийных режимов и для управления насосами...
     
  7. StarykovMih
    Регистрация:
    13.11.12
    Сообщения:
    522
    Благодарности:
    176

    StarykovMih

    Живу здесь

    StarykovMih

    Живу здесь

    Регистрация:
    13.11.12
    Сообщения:
    522
    Благодарности:
    176
    Адрес:
    Киев
    Значит их надо ставить в холодной зоне.
     
  8. Сергей247
    Регистрация:
    30.04.12
    Сообщения:
    6.161
    Благодарности:
    1.867

    Сергей247

    Живу здесь

    Сергей247

    Живу здесь

    Регистрация:
    30.04.12
    Сообщения:
    6.161
    Благодарности:
    1.867
    Адрес:
    Минск
    Будут от холода дубеть. :)
     
  9. StarykovMih
    Регистрация:
    13.11.12
    Сообщения:
    522
    Благодарности:
    176

    StarykovMih

    Живу здесь

    StarykovMih

    Живу здесь

    Регистрация:
    13.11.12
    Сообщения:
    522
    Благодарности:
    176
    Адрес:
    Киев
    Зашёл в Википедию, чтобы не лезть в дебри:
    "...при адиабатическом сжатии (то есть при уменьшении [​IMG]) газ нагревается ([​IMG] возрастает), а при расширении — охлаждается, что всегда верно и для реальных газов."
    (https://ru.wikipedia.org/wiki/%D0%90%D0%B4%D0%B8%D0%B0%D0%B1%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81)
     
  10. StarykovMih
    Регистрация:
    13.11.12
    Сообщения:
    522
    Благодарности:
    176

    StarykovMih

    Живу здесь

    StarykovMih

    Живу здесь

    Регистрация:
    13.11.12
    Сообщения:
    522
    Благодарности:
    176
    Адрес:
    Киев
    от мороза
    :)]
     
  11. StarykovMih
    Регистрация:
    13.11.12
    Сообщения:
    522
    Благодарности:
    176

    StarykovMih

    Живу здесь

    StarykovMih

    Живу здесь

    Регистрация:
    13.11.12
    Сообщения:
    522
    Благодарности:
    176
    Адрес:
    Киев
    там есть смысл заказывать 130 грн. против 190 в Киеве...
    Кстати, краткий даташит:
     

    Вложения:

    Последнее редактирование: 04.01.18
  12. Оксфорд
    Регистрация:
    12.04.12
    Сообщения:
    9.432
    Благодарности:
    1.871

    Оксфорд

    Живу здесь

    Оксфорд

    Живу здесь

    Регистрация:
    12.04.12
    Сообщения:
    9.432
    Благодарности:
    1.871
    Адрес:
    Уфа
    Осталось малость дочитать. Расширение сопровождается уменьшением статического давления и уменьшением площади поперечного сечения (для дозвукового течения). А увеличение площади сечения- это торможение и увеличение давления и температуры.
    Можно еще посмотреть "диффузор" и "конфузор".
     
  13. alarin
    Регистрация:
    29.07.16
    Сообщения:
    8.662
    Благодарности:
    3.751

    alarin

    Живу здесь

    alarin

    Живу здесь

    Регистрация:
    29.07.16
    Сообщения:
    8.662
    Благодарности:
    3.751
    Адрес:
    Казахстан, Алма-Ата
    Термодинамика перебежала дорогу газодинамике, запасаемся попкорном, сейчас будет покраска белой краской в черный цвет...:)]
     
  14. StarykovMih
    Регистрация:
    13.11.12
    Сообщения:
    522
    Благодарности:
    176

    StarykovMih

    Живу здесь

    StarykovMih

    Живу здесь

    Регистрация:
    13.11.12
    Сообщения:
    522
    Благодарности:
    176
    Адрес:
    Киев
    я уже спрашивал, не поленюсь спросить еще раз:
    о каком давлении (или его составляющей) у вас идет речь?
     
  15. Оксфорд
    Регистрация:
    12.04.12
    Сообщения:
    9.432
    Благодарности:
    1.871

    Оксфорд

    Живу здесь

    Оксфорд

    Живу здесь

    Регистрация:
    12.04.12
    Сообщения:
    9.432
    Благодарности:
    1.871
    Адрес:
    Уфа
    А вы когда википедию цитируете про расширение газа - как это понимаете?
     
Статус темы:
Закрыта.