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

Altar
Offline
Зарегистрирован: 08.12.2017

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

Исходные данные: (цифры условно)

Отопление в комнате осуществляется двумя источниками: теплый пол и радиаторы.

Теплый пол является основным, радиаторы - дополнительным, когда теплый пол не справляется.

Необходимо управлять двумя источниками отопления раздельно при разных условиях.

Итак, отопление выключено, наступает осень температура в комнате Тк=+18, необходимо Тзад=+25. Включаем систему первый раз. Ардуино открывает сервоприводы подачи горячей воды в трубы пола и радиаторов и комната максимально быстро должна нагреться до +25, после чего пол и радиаторы выключаются. Такое действие должно выполниться один раз только для быстрого прогрева.

Дальше работает режим поддержания Тзад=+25 если температура в комнате начинает падать при отключенном отоплении и Тк стала +24, то включается только пол и нагревает Тк до +25, после чего пол отключается. Если пол включен а Тк продолжает падать (пол не справляется),  то, когда Тк=+23 дополнительно подключаются радиаторы и вместе работают до тех пор, пока Тк не станет +25 (вне зависимости справятся они или нет), при этом, когда Тк повысится с +23 до +24 (условие когда включен только пол) радиаторы должны греть дальше, пока не достигнет Тзад.

На словах вроде все понятно, но, когда я попытался нарисовать алгоритм (это еще до начала програмирования), то возник ряд вопросов по циклцу поддержания температуры: 1. пол включился - нагрел - выключился, надо вернутся опять к отслеживанию Тк, вопрос как? 2. пол не справляется включились радиаторы надо вернуться к отслеживанию Тк (опять вопрос как?) и когда достигнет Тзад отключить пол и радиаторы. 3. пол и радиаторы включены - нагрели комнату Тк=Тзад надо опять вернутся к отслеживанию Тк, опять вопрос как?

Эти вопросы на схеме я обозначил красным. Правильная ли эта схема? И какие олператоры в каждом ромбе лучше использовать?

Заранее благодарен

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вы бы еще спросили, как черточки в кельтских рунах рисовать. Блок-схемы это конечно хорошо. Но это только для маленьких устройств. Для больших это уже устарело. Как минимум структурные надо использовать.

ПС: Отопление в доме происходит только с помощью радиаторов. Теплый пол это современный аналог ковров. Что бы с бетонного пола холодом не тянуло. Греть с помощью теплого пола помещение это как со встроеныеми в стену батареями или наружными батареями "греть улицу".

Altar
Offline
Зарегистрирован: 08.12.2017

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

ПС: По поводу теплого пола не согласен, если разница температур между улицей и комнатой небольшая, то теплый пол вполне справляется, если разница большая, тотогда конечно нужно включать дополнительное отопление радиаторами. Но это вопрос отопления, а не програмирования. К моему вопросу можно вместо теплого пола поставить дополнительный радиатор и греть комнату либо одним либо двумя в зависимости от температуры.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Для успеха в выполненной работе надо 3 веши: 1- ясно составленое задание 2- разобраться в ключевых моментах и 3- просто ее выполнить. С 1 и 3 можно просто справится, то на 2 обычно люди ложат болт, что приводит их к непрятностям. Почему холодно зимой. Не потому что холодный воздух. Теплоемкость воздуха очень низка. Так что прогреть воздух не трудно. Но зимой холодна еще земля. И ее прогреть не реально.  Вот и греют дом, а точнее что бы стены и пол не тянули тепло из тела человека.  Думаю вам надо ставить очень много датчиков температуры как на воздух, так и на стены и пол. И еще вы не поверите, но и снаружи дома как на воздух, так и на стены. И вот тогда глядя на это все и организовывать вам обогрев.  

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

qwone пишет:

ПС: Отопление в доме происходит только с помощью радиаторов. Теплый пол это современный аналог ковров. Что бы с бетонного пола холодом не тянуло. Греть с помощью теплого пола помещение это как со встроеныеми в стену батареями или наружными батареями "греть улицу".


15 лет грею первый этаж тёплым полом и второй - радиаторами.
На первом чувствую себя комфортнее.
Хожу в носках, тапочки- вред, в них с лестницы падаю.....

Маленький нюанс- тёплый  не надо включать- выключать.
Совсем не надо.
Надо регулировать температуру подачи в зависимости от наружной температуры.
Например сейчас  у нас на улице около нуля и  в пол идёт 25-27 градусов.
Будет 10-15 минуса- пойдёт 30-35
А там где пол кажется "слишком горячим"- снижать проток закручивая регулировку на рейке.

Altar
Offline
Зарегистрирован: 08.12.2017

Qwone у меня складывается впечатление, что Вы не верите в эффективность отопления теплыми полами (ТП) и возможность регулировки температуры в комнате, отапливаемой этими ТП. Все что Вы написали - факт и спорить с этим глупо. Можно много рассуждать об отоплении: утепление ограждающих конструкций дома, фундамента, крыши и т.п., утепленные отмостки, энергоэффективные стекла в стеклопакетах, расчет системы отопления и т.д. Я задал вопрос с учетом, что все уже сделано. Дом построен, утеплен, окна установлены правильно, система отопления смонтирована и работает хорошо. В комнатах уложены теплые полы и обогреваемый плинтус (радиатор в моем примере) Красота! Но есть одно но! Я хочу снизить затраты на обогрев. Итак, есть комнаты, в которых нет необходимости держать температуру +22, можно +18. Не хочу греть дом до +22, когда все на работе с 9.00 до 17.00. А когда я прихожу домой или удаленно через интернет, то ставлю заданную температуру +22 и там где нужно включается ТП + радиатор и нагревает мне его за короткое время и поддерживает данную температуру путем включения то одного, то вместе двух. Да, температура воздуха не определяющий показатель в комфорте, но один из тех, которые можно регулировать. И в таком случае один термометр на комнату. Ну скажите, если взять классическую радиаторную систему отопления, то мы же ставим термоголовки для регулировки отопления, они же оценивают температуру воздуха.

А ТП с регулировкой сервоприводами не моя идея, они существуют и работают термомтат для них стоит ок. 1000 р. плюс сервопривод столько же, но меня интересует несколько более глобальная задача, возможности обогрева двумя источниками и с максимально возможным сокращением времени. Плюс в каждой комнате отдельно. На каждую комнату подразумевается установка одной ардуино, 1 датчик температуры возуха, 1 датчик температуры пола (для исключения его перегрева и только) два сервопривода на гребенке (1 ТП 1 радиатор) Пока вроде все, дальше информация с каждой ардуино собирается на один сервер с которого идет управление ими (конкретно изменение Т зад и все) Как то так

Да и спасибо за ответы.

Altar
Offline
Зарегистрирован: 08.12.2017

Trembo, спасибо,

Вы тоже все говорите правильно, но вопрос касается автоматизации в каждой отдельной комнате. Плюс два режима "в доме" "не дома"

По поводу включать-выключать Вы мне подсказали такую идею: если систему отопления настроить на +22, а на ардуино Тзад поставить +23, то ТП не будет включаться-выключаться а будет постоянно работать и только при перегреве воздуха до +23 отключится (к примеру от солнечного излучения через окно). Ну и при уходе из дома он выключится и будет конечно вкл-выкл до +18.

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Altar, у Вас в алгоритме серьезая ошибка. Даже не в самом алгоритме, а в подходе к построению алгоритмов.

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

Действтиельно, скажем, при температуре 24.5 градуса может быть минимум 4 разных варианта:

- мы осуществляем первоначальный нагрев - нужны оба источника тепла,

- тепло выключено, температура падает, но еще не достигла 24 градусов,

- включен только пол,  температура падает, но еще не достигла 24 градусов,

- включен только пол,  температура растет, но еще не достигла 25 градусов,

который из этиих вариантов реализуется на самом деле - определяется предысторией. Ее надо помнить. А для этого нужно завести под нее переменную.

Собственно, Вам нужна переменная состояния, которая будет полностью характеризовать текущее состояние. Для этого Вам нужно выписать и пронумеровать все возможные состояния системы, а после этого срставить таблицу, пи каких условиях система переходит из одного состояния в другое.

Например:

0 - система выключена,

1 - первоначальный нагрев обоими нагревателями с низкой температуры (-273 : +25),

2 - остывание без нагревателей (24 : 25),

3 - остывание с одним нагревателем (24 : 25),

4 - нагрев с одним нагревателем (24 : 25),

5 - состояние, в которое попадаем из "1" при достижении температуры 25 градусов, когда отключаем второй нагреватель и еще неизвестно, "3" или "4",

6 - нагрев с одним нагревателем  (25 : 26),

7 - остывание с одним нагревателем (25 : 26).

 

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

Ну и переходы:

- из "0" в "1" при включении,

- из "1" в "5" при достижении 25 градусов,

- из "5" в "2" или "6" по истечении некоторого времени после перехода "1"-"5" в зависимости от измеренной температуры,

- из "3" в "1" при достижении 24 градуса,

...

 
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Altar, я вам говорю не как организовать обогрев дома, а о бесмыслености использовать блок-схему. Вот вы командующий легионом, или когоротой . И что упраление через блоксхему поможет. Нет разумеется. Вот идет команда построить черепаху и что? Как это изобразить в блоксхемах. На все пдразделение целиком или на каждого отдельно. Обычно каждый солдату отведено свое места и по своему месту он знает свои маневр. А командир просто командует общее построение. Так и у вас . Построение"Лето"- все отключено. "Осень"- частиное включение, "Холодная Зима"- все включено. Разумеется может быть "Зимний День","Зимняя Ночь". Вот выработайте варианты общих построений и пусть части системы в этом режиме работают. И никаких блок-схем не надо городить.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Altar пишет:

Trembo, спасибо,

Вы тоже все говорите правильно, но вопрос касается автоматизации в каждой отдельной комнате. Плюс два режима "в доме" "не дома"

По поводу включать-выключать Вы мне подсказали такую идею: если систему отопления настроить на +22, а на ардуино Тзад поставить +23, то ТП не будет включаться-выключаться а будет постоянно работать и только при перегреве воздуха до +23 отключится (к примеру от солнечного излучения через окно). Ну и при уходе из дома он выключится и будет конечно вкл-выкл до +18.

А я вам отвечу!

Тёплый пол нельзя надолго выключать - он потом долго разогревается.
У меня часа 3-4.
Потому что я стабилизирую подачу.
Термоголовкой с капилляром. На 20 - 50 градусов
http://herz-armaturen.at/welt/katalog.php?prodID=23&lng=eng
Некоторые ставят регулировку по обратке, прогревается немного быстрее,
но зато на входе будет большая температура что  не рекомендуется.
Выход один - устроить ему супермедленный ШИМ.
Допустим полчаса ВКЛ- полчаса ВЫКЛ в то время когда вы желаете снизить температуру.
Хотя я считаю что экономия не будет большой так как на повторный разогрев её и потратите.
Поэтому регулирую только по погоде.
Комнатные ( настенные) регуляторы отключены сразу и нафик.
Клапана с рейки снимаю для ремонта соседям, тем кто ещё верит что им так удобно

 

 

Altar
Offline
Зарегистрирован: 08.12.2017

Andriano, поправьте меня если я ошибаюсь. Ваше утверждение по поводу 24.5 верно если программа периодически отслеживает температуру.
Как я вижу этот процесс (может я не прав, но именно поэтому я и пишу здесь, что хочу разобраться):
1-й цикл: питание ардуино включается и оба нагревателя работают до тех по, пока не нагреют до 25, затем оба отключаются. Больше этот цикл до следующего включения не выполняется.
Дальше вступает в работу второй цикл: ардуино постоянно отслеживает температуру, температура начинает падать и по достижении 24 градусов включает один нагреватель и продолжает отслеживать температуру.
3-й цикл: проверяются два условия, если стало 25, то отключается первый нагреватель( можно в принципе прописать что оба нагревателя отключаются, несмотря на то, что второй и так отключен) и ардуино опять переходит ко второму циклу, если стало 23, то включается второй нагреватель и ардуино переходит в начало третьего цикла (для этого и нужно отключение двух нагревателей). Соответственно проверив что температура стала 25 отключаются об и ардуино опять переходит в начало второг цикла и так далее. Таким образом при 24.5 ардуино будет знать, что ей делать дальше, так как из предыдущего цикла она вышла, а в данный момент она "крутится" в другом определенном цикле и при выполнении его условий на очереди следующий определенный цикл.
Как я это вижу у ардуино в единицу времени будет только одна задача: греть до 25 двумя нагревателями или греть до 25 одним нагревателем или отслеживать снижение температуры до заданного значения.
Возможно я вбил себе в голову, что так будет работать, но на самом деле все по-другому. Разъясните, пожалуйста.

Altar
Offline
Зарегистрирован: 08.12.2017

Да, я знаю по поводу долгого прогрева, для этого и нужен второй нагреватель для быстрого нагрева воздуха. Я не говорю прополное охлаждение ТП. Даже когда не дома система будет работать, только температура будет задана ниже.

bwn
Offline
Зарегистрирован: 25.08.2014

Вы пытаетесь запихнуть все в одну кучу и начинаете в ней путаться, в Ардуино один основной цикл - loop(), он крутится всегда. А из него по мере надобности надо вызывать требуемые функции-подпрограммы (замер температуры, опрос кнопок, управление чем либо и т.д). Чтобы не гонять все на каждом проходе, а он очень-очень быстрый, нужные подпрограммы предваряем собственным таймером который говорит о необходимости совершения действий в данный момент (требуемый интервал не прошел - вернулись обратно, прошел - вошли в тело подпрограммы и выполнили требуемые действия).
Система отопления инерционная, для отслеживания динамики и проведения корректирующих действий интервалы между замерами должны быть большими (минуты), здесь и потребуются таймеры. 
В итоге: перешли к ПП замера температуры, если пора, замерили и перешли к ПП контроля температуры, проверили наши состояния (как писали выше), выполнили необходимые действия и вернулись в loop, крутимся ждем окончания интервала. В это время можем мигать гирляндами, наигрывать музыку и что там сами придумаете. И логику работы в небольших подпрограммах отлаживать на порядок легче. ИМХО.
Да, и по опыту использования ТП, у меня работали электрические, пока газ не подключил. Если пол и стены теплые, температура воздуха роли не играет, да и не может она быть низкой. Поэтому вопрос необходимости радиаторов весьма спорный и имеет право на жизнь только в случае недостаточной тепловой мощности подводимой к полу. ИМХО.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

0 - предварительное зачечание: коль скоро qwone уже дважды высказался против блок-схем, замечу, что я его точку зрения не разделяю. Блок-схему нужны всегда, доугое дело, что при наличии некоторого опыта отпадает необходимость рисовать их на бумаге (компьютере), но в голове они должны присутствовать.

1 - давайте определимся с терминологией: цикл - это нечто циклическое. Если температура изменилась с -5 до +25, то это не цикл. Цикл будет тогда, когда температура снова снизится до -5.

2 - Вы сами интуитивно понимаете, что Вам нужно знать предысторию, но пока не понимаете, что в программе это реализуется дополнительной переменной (или несколькими). Без этого Вы никак не сможете узнать, поднимается у Вакс температура или опускается. Допустим, Вы достигли температуры 24 градуса, сам факт достижения Вы зафиксировали, но т.к. не знаете, сверху Вы подошли к этой температуре или снизу, не можете определить, что именно нужно сделать. Да и факт достижения может пройти мимо Вас, скажем, перед этим было 23.9, а потом стало 24.1, а 24.0 Вы по факту не зафиксировали.

3. Системе присуща инерционность. Температура нагревательного элемента при работе выше температуры воздуха. Когда он отключен, воздух еще некоторое время продолжает нагреваться. Аналогично и, наоборот, при включении температура воздуха будет опускаться некоторое время, пока нагреватель не преодолеет собственную теплоемкость. Эти моменты тоже надо отслеживать.

4. Любому измерению присущи шумы т.е. случайные погрешности. Чтобы на них не реагировать, нужен гистерезис. Гистерезис тоже не организовать без запоминания текущего (прошлого) состояния.

То есть Вам нужно ввести список состояний. При работе контролировать, не сложились ли условия для перехода в другое состояние. Если не сложились - ничего не далеть. Если сложились, выполнить нужные в данном случае действия и перейти в другое состояние (в зависимости от условий - в одно из нескольких возможных).

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

SLKH
Offline
Зарегистрирован: 17.08.2015

andriano пишет:

0 - предварительное зачечание: коль скоро qwone уже дважды высказался против блок-схем, замечу, что я его точку зрения не разделяю. Блок-схему нужны всегда, доугое дело, что при наличии некоторого опыта отпадает необходимость рисовать их на бумаге (компьютере), но в голове они должны присутствовать.

именно так. 

SLKH
Offline
Зарегистрирован: 17.08.2015

На самом деле решение может оказаться проще.

Например, таким:

==================

if t <= (t0-0.5); включаем пол; endif

if t => (t0); выключаем пол; endif

if t <= (t0-1); включаем радиаторы; endif

if t => (t0-0.5); выключаем радиаторы; endif

===================
естественно, пороги включения/отключения нуждаются в подборке.

 

Ильхом
Offline
Зарегистрирован: 09.12.2017

Здравствуйте! Я совсем новичок в Адруине. Я купил оптический дальномер и реле. Я сидел 2 для и сделал, но мне нужно чтобы реле включалось после примерно 10 секунд. Или после того как человек отойдет от ИК луча. Куда что вписать?  СПАСИБО!!! PS это задача для писсуара если не понятно написал 

 unsigned long time;
 void setup(){
 Serial. begin (9600);
 }
 void loop(){
  pinMode (5, OUTPUT);
 
 
  
 Serial.println(analogRead(A0));  
 if(analogRead (A0) >300)
  digitalWrite (5, HIGH);
 if(analogRead (A0) <200)
 digitalWrite (5, LOW);
  delay(3000);
  
  } 
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ильхом, а как бы Вы лично решали такую задачу?

Что бы Вы стали делать, оказавшись на месте контроллера?

Распишите алгоритм своих действий по-русски.

Ильхом
Offline
Зарегистрирован: 09.12.2017

Я постоянно вижу расстояние дальномером допустим 3 метра как только расстояние уменьшалось до 40 сантиметров я понимая что сейчас станет расстояние опять 3м я должен включить реле на +-5 секунд и отключить. )) 

Ну или проще. Я постоянно вижу расстояние дальномером допустим 3 метра как только расстояние уменьшалось до 40сантиметров я отчитываю 15 секунд и включаю реле на +-5 секунд и отключаю ели расстояние стало 3 метра, а если нет то держу включенным реле.  

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
const byte SensPin =/*пин*/A0;
const byte RelPin =/*пин*/5;
bool Rel;
const unsigned int interval =/*10 секунд*/10000;
unsigned long past, mill;
//-----main-------------
void setup() {
  Serial. begin (9600);
  pinMode (RelPin, OUTPUT);
  digitalWrite (RelPin, Rel = LOW);
}
void loop() {
  mill = millis();
  if (analogRead (SensPin) > 300) {
    past = mill;
    digitalWrite (RelPin, Rel = HIGH);
  }
  if ( Rel && mill - past >= interval) {
    digitalWrite (RelPin, Rel = LOW);
  }
}
/*Скетч использует 1870 байт (6%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 191 байт (9%) динамической памяти, оставляя 1857 байт для локальных переменных. Максимум: 2048 байт.
*/

ПС: Ну и как вы такой скетч увяжите в блок-схему.

Ильхом
Offline
Зарегистрирован: 09.12.2017

Не понял вопроса. Ну у меня получилось почти но там я выставил задержку считывания датчика. Я поэтому прошу и людей кто не первый день занимается этим

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ильхом пишет:

Я постоянно вижу расстояние дальномером допустим 3 метра как только расстояние уменьшалось до 40 сантиметров я понимая что сейчас станет расстояние опять 3м я должен включить реле на +-5 секунд и отключить. )) 

Ну или проще. Я постоянно вижу расстояние дальномером допустим 3 метра как только расстояние уменьшалось до 40сантиметров я отчитываю 15 секунд и включаю реле на +-5 секунд и отключаю ели расстояние стало 3 метра, а если нет то держу включенным реле.  

Распишите подробнее, что Вы подразумеваете под "отсчитываю 15 секунд".

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

qwone пишет:


ПС: Ну и как вы такой скетч увяжите в блок-схему.

Элементарно: один цикл и два условных блока.

Ильхом
Offline
Зарегистрирован: 09.12.2017

Ну реле времени. Задержка на включения. 

Это писсуар автоматический был, его спалили. Нужно сделать. Мужчина подошел по сикать, чтобы он не сразу лил воду а по истечении 15 секунд и отключился спустя 5 секунд как мужчина уйдет 

Ильхом
Offline
Зарегистрирован: 09.12.2017

Я начал изучать с нуля вчера и такие термины пока не знаю )) 

Что и где изменить? 

 

unsigned long time;
void setup(){
Serial. begin (9600);
}
void loop(){
  pinMode (5, OUTPUT);
 
 
  
Serial.println(analogRead(A0));  
if(analogRead (A0) >300)
 digitalWrite (5, HIGH);
 if(analogRead (A0) <200)
 digitalWrite (5, LOW);
  delay(5000);
  
  }  
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

andriano пишет:
Элементарно: один цикл и два условных блока.
И все мимо. Из-за этого у новичков millis() и не выходит. Здесь надо думать с помощью событий, а не блок-схем.

Anonymous_06
Offline
Зарегистрирован: 08.01.2014

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

Logik
Offline
Зарегистрирован: 05.08.2014

///без ПИД-регулятора не обойтись

Причем сразу 2-х. Один для ТП, второй для радиатора и настроенных по разному. Коэффициент П для радиатора больше чем для ТП, а И - наоборот. Можна для радиатора П-регулятор (или даже релейное регулирование), а для ТП - ПИД. Тогда радиатор будет реагировать на быстрые изменения. Возможно при отклонении температуры менее дельты радиатор прийдется просто отключать. Непонятно, а котел вобще один у ТП и радиатора? Если да, то этот факт нужно учитыват.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

qwone пишет:

andriano пишет:
Элементарно: один цикл и два условных блока.
И все мимо. Из-за этого у новичков millis() и не выходит. Здесь надо думать с помощью событий, а не блок-схем.

Одно другому не противоречит. Это пргосто разные уровни абстракции, но осовоить необходимо и тот и другой. 

Без блок-схем никакие события обрабатываться не будут.

Logik
Offline
Зарегистрирован: 05.08.2014

О чем вы спорите! Блок-схема это один из удобных способов представления алгоритма. Если конкретно взятому человеку удобно - так наздорове. Кому удобно другим способом, а хоть бонсай или станцует алгоритм -  ну и ладно. Главное  чтоб по алгоритму код написал и работало без глюков. Правда блок-схема еще и  в ГОСТ прописана, значить общеприменима, в отличии от языка танца. Событийная модель описывается блок-схемой великолепно,  что не отменяет сиквенс-диаграммы. Что удобней в конкретном случае - то и малюем.

ПС. Надо отдать должное ТС. Не приторбенил чужой код и не выложил что попало с криками "ПАМАГИТЕ И БЫСТРО!". С алгоритма начал, молодцем! Редкая птица на нашем форуме. 

Anonymous_06
Offline
Зарегистрирован: 08.01.2014

Logik пишет:

О чем вы спорите! Блок-схема это один из удобных способов представления алгоритма. Если конкретно взятому человеку удобно - так наздорове. Кому удобно другим способом, а хоть бонсай или станцует алгоритм -  ну и ладно. Главное  чтоб по алгоритму код написал и работало без глюков. Правда блок-схема еще и  в ГОСТ прописана, значить общеприменима, в отличии от языка танца. Событийная модель описывается блок-схемой великолепно,  что не отменяет сиквенс-диаграммы. Что удобней в конкретном случае - то и малюем.


Это все понятно, но мы своими рассуждениями пытаемся направить автора в нужное русло. Понятно что проще всего написать digitalWrite(какой-то пин, HIGH) по событию , но задачу в корне это не решит. Завтра автор прийдёт с другим вопросом, почему у меня радиаторы включаются вместе с ТП, хотя я написал if(temperature=25) или что-то в этом духе.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

У блок-схемы есть блоки начало и конец. Разумеется можно зациклить блок, убрав конец. Но все равно придется делать отвод с середины зацикленной цепочки. Опять же блок-схема может легко описать процедуру. Но процерура это не вся система, особенно если система адатирующая, развивающая. И процерура получися если не с одним выходом, так с несколькими , которые не учены раннее.  А что вы будете делать если система состоит из нескольких взаимодействующих но внутренне независимых систем. Рисовать паралельно блоксхемы каждой. Опять же если блоков с цепи много с 100 или 1000 , то она буквально на бумаге не поместится. И тогда по ней будет сложно ориентироваться. Даже больше.Сейчас системы так усложнились, что появились языки, которые не основаны на блок-схемах.

 ПС: Вот те же самые классы. Там нет блок-схем, только свойства и методы. Ну да методы могут оформлены в виде блок-схем, но в целом класс уже совершено другое по сущности. 

Altar
Offline
Зарегистрирован: 08.12.2017

Спасибо за советы.

Я так понимаю пора отойти в доказательную базу. Иннерционность ТП это факт. Но данный факт, главным образом, относится к начальному прогреву полов. К примеру если дом это дача и в зимнее время используется только по выходным. То да, конечно, приехать и три часа ждать, чтобы полы прогрелись и начали давать тепло. Система, которую я задумал, будет использоваться в домке с постоянным проживанием. В таких домах автоматическое управление теплыми полами используется и очень активно. Вот к примеру. Можно купить что-то подобное и регулировать. Исполнительный механизм что угодно: реле для электроконвекторов или электрических полов, сервопривод шарового крана с электроприводом и т.п. Поэтому говорить о невозможности регулировки ТП это как минимум некорректно. Даже если на полчаса в течении одного часа полы будут отключаться, экономия будет ощутима. Но мне нужны два отопителя. Для чего? Ну во-первых, хочется, чтобы было два, чтобы когда два дня в году будет -30 не ходить в валенках, во-вторых, хочется , чтобы была возможность быстрого прогрева, в-третьих, блажь и т.п.

Итак, температура подачи теплоносителя в ТП 29-33 градуса, необходимая температура воздуха в комнате (обращаю внимание воздуха, а не ощущения) 22 град. Полы температурой около 30 градусов греют комнату до 22 в нормальном режиме, соответственно охладившись всего на несколько градусов(ок. 6) начнет падать и температура в комнате, и когда она упадет всего на 1 град. по моей задумке должны включится ТП и нагрется всего на 6, чтобы начать греть воздух с 24 до 25. В одной комнате +22, в другой (к примеру гостевой, пока гостей нет) +18, в душевой, комнате отдыха и парной банного узла +18 и т.д.  Я согласен, что ипользуя датчик полов можно не только контралировать перегрев, но и не давать полам остывать более чем на 4-6 град, но это дальнейшее усовершенствование программы.

Уходят все на работу, нажали кнопку и во всем доме заданная температура стала +18, все нагреватели отключились и ждут температуру +18, опустилась везде началось поддержание ее в этом режиме. Наступило 17.00 (за час до прихода всех с работы) система перезагрузилась и установила где надо +22, где надо оставила +18 и вот этот нагрев должен быть быстрым двумя нагревателями, так как муж (тобишь Я) может вернуться с работы раньше:), а дома холодно, нажал кнопку не дожидаясь 17.00 и в течение получаса прогрел дом. Вот она моя хотелка.

Altar
Offline
Зарегистрирован: 08.12.2017

А теперь в чем суть вопроса.

Как я писал раньше циклы должны выполняться последовательно, не параллельно, в некоторых случаях цикл в цикле, но тоже последовательно после выполнения первого условия. Вот я и не понимаю (пока) как это реализовать на ардуино. Если это не возможно, то напишите мне и отговорите. Для этого я здесь. Я твердо убежден, что прежде чем начинать писать код я должен разобраться как оно должно работать. У меня уже есть мысли какие операторы использовать, но эти мысли пока не упорядочены и да, кроме блок-схем я ничего не знаю другого (смотрите на первое слово в заголовке темы), я не програмист, я пытаюсь постичь как можно управлять ардуино, я учюсь здесь. Такое представление алгоритма для меня понятно.

evgta
Offline
Зарегистрирован: 02.09.2016

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

Altar
Offline
Зарегистрирован: 08.12.2017

Да, все правильно, ТП жидкостный и узел подмеса используется для снижения температуры подачи теплоносителя в пол, т.к. из котла выходит минимум 50 град, а то и все 70, а в ТП можно подавать не выше 33 град. И повторюсь автоматическая регулировка температуры путем включения/отключения ТП используется, ссылку я прикрепил и могу повторить: РЕГУЛЯТРОР. В качестве второго нагревателя планируется использовать теплый плинтус (тот же конвектор) у котрого подключение такое же как и ТП по лучевой (коллекторной) схеме. На гребенке устанавливаются электрически управляемые сервоприводы, к примеру ТАКИЕ. Там же кстати и принцип регулирования, только в зависимости от температуры теплоносителя, но так же открыть/закрыть.

Altar
Offline
Зарегистрирован: 08.12.2017

Andriano, по поводу предистории. Попробую объяснить на знакомом мне примере.

По дороге из Москвы в Ярославль мы проезжаем следующие города: Москва - Сергиев Посад - Переславль - Ростов - Ярославль. Если я еду в Москву из Ярославля и в настоящий момент проезжаю Переславль, то мне не важно проехал ли я до этого Ростов или Сергиев Посад так как я знаю, что я еду в Москву. И еду я в одном направлении.

Так вот и вопрос можно ли так запрограммировать ардуино, чтобы она знала что в данный момент она проверяет чтобы температура достигла (в моем первоначальном примере) +24 так как до этого прошел и завершился цикл, по которому температура стала +25 и следующий цикл начал выполняться и не закончится до тех пор, пока температура не станет +24.

Altar
Offline
Зарегистрирован: 08.12.2017

Как то так, извиняюсь если не понятно написал.

evgta
Offline
Зарегистрирован: 02.09.2016

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

ВсЯ программа по сути состоит из: ЕСЛИ (IF), ТО ({}), ИНАЧЕ(ELSE) вот их и представляю в голове.
Ещё надо понять работу millis и научиться пропускать или наоборот выполнять действия по прошествии определенного времени.

bwn
Offline
Зарегистрирован: 25.08.2014

Altar пишет:

Andriano, по поводу предистории. Попробую объяснить на знакомом мне примере.

По дороге из Москвы в Ярославль мы проезжаем следующие города: Москва - Сергиев Посад - Переславль - Ростов - Ярославль. Если я еду в Москву из Ярославля и в настоящий момент проезжаю Переславль, то мне не важно проехал ли я до этого Ростов или Сергиев Посад так как я знаю, что я еду в Москву. И еду я в одном направлении.

Так вот и вопрос можно ли так запрограммировать ардуино, чтобы она знала что в данный момент она проверяет чтобы температура достигла (в моем первоначальном примере) +24 так как до этого прошел и завершился цикл, по которому температура стала +25 и следующий цикл начал выполняться и не закончится до тех пор, пока температура не станет +24.

Цикл это кольцо и оно замкнуто, но в этом кольце есть условия, которые либо выполняются, либо пропускаются (для вашего случая, здесь не нужно организовывать какие то дополнительные циклы). Чтобы корректно выполнять условия требуется знать предысторию, по вашей аналогии: едем мы в Ярославль или из него, так же по ней: если предположить, что вы чудом ночью оказались в середине трассы, то куда вы направляетесь сможете определить как раз по последовательности проезжаемых населенных пунктов и это не прикол, сам лично осенью, ночью, в тумане покинул Сталинград из Красноармейска на Ростов и вернулся через 100км в него же со стороны Астрахани, звезд нет, солнца нет, ориентиров нет, там еще и населенных пунктов нет.
В программировании для этой цели применяются т.н. флаги, достигли предела повышения температуры, подняли флаг, пока он поднят, можем только снижать. Снизилось до минимального предела, сбросили флаг, теперь можем повышать. И из этих элементарных действий (if - else) формируете всю требуемую последовательность

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Altar пишет:

Andriano, по поводу предистории. Попробую объяснить на знакомом мне примере.

По дороге из Москвы в Ярославль мы проезжаем следующие города: Москва - Сергиев Посад - Переславль - Ростов - Ярославль. Если я еду в Москву из Ярославля и в настоящий момент проезжаю Переславль, то мне не важно проехал ли я до этого Ростов или Сергиев Посад так как я знаю, что я еду в Москву. И еду я в одном направлении.

А еще Пушкино и Петровск :)

Так вот, Вашей программе тоже нужно знать, в каком направлении она едет. И это "знать" реализуется переменной. В данном простейшем случае это может быть логическая переменная (часто называемая флагом), которая принимает значени true на пути из Ярославля в Москву и false - в обратном направлении.

Цитата:

Так вот и вопрос можно ли так запрограммировать ардуино, чтобы она знала что в данный момент она проверяет чтобы температура достигла (в моем первоначальном примере) +24 так как до этого прошел и завершился цикл, по которому температура стала +25 и следующий цикл начал выполняться и не закончится до тех пор, пока температура не станет +24.

Не "можно", а "нужно". Вы можете завести несколько переменных: одна будет указывать направление изменения температуры, другая - поддиапазон температуры, третья - включен или выклюяен пол и т.д. Поддиапазон температуры - важный параметр - имено по нему Вы будете отслеживать переход через границу поддиапазона, и именно при этих перехлодах включать или отключать обогреватели. Но я бы советовал перечислить все возможные значения параметров в одной сплошной нумерации. Теоретически, у нас есть 2 направления изменения температуры, по два состояния каждого из нагреватеолей и 4 поддиапазона темпетатуры. Значит, количество состояний будет не более 2*2*2*4=32. Часть из этих состояний никогда не будет реализовываться (например, все состояния, когда пол выключен, а батареи включены, или когда все выключено, а температура растет), поэтому реально состояний вряд ли будет больше десятка. Из каждого состояния мы при достижении температурной границы можем попасть в другое состояние, причем далеко не любое. Вот все подобные случаи (когда состояние находится в одном температурном диапазоне, а измеренная температура соответствует другому, т.е. произошел переход через границу) нам нужно отслеживать и реагировать на них сменой состояния и включением либо выключением нагревателей.

И еще: не употребляйте, пожалуйста, слово "цикл", т.к. то, что Вы под ним подразумеваете в корне отличается от терминологии, принятой на данном форуме (и любом форуме, касающемся программирования).

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Altar пишет:
Итак, температура подачи теплоносителя в ТП 29-33 градуса, необходимая температура воздуха в комнате (обращаю внимание воздуха, а не ощущения) 22 град. Полы температурой около 30 градусов греют комнату до 22 в нормальном режиме, соответственно охладившись всего на несколько градусов(ок. 6) начнет падать и температура в комнате, и когда она упадет всего на 1 град. по моей задумке должны включится ТП и нагрется всего на 6, чтобы начать греть воздух с 24 до 25. В одной комнате +22, в другой (к примеру гостевой, пока гостей нет) +18, в душевой, комнате отдыха и парной банного узла +18 и т.д.  Я согласен, что ипользуя датчик полов можно не только контралировать перегрев, но и не давать полам остывать более чем на 4-6 град, но это дальнейшее усовершенствование программы.

Уходят все на работу, нажали кнопку и во всем доме заданная температура стала +18, все нагреватели отключились и ждут температуру +18, опустилась везде началось поддержание ее в этом режиме. Наступило 17.00 (за час до прихода всех с работы) система перезагрузилась и установила где надо +22, где надо оставила +18 и вот этот нагрев должен быть быстрым двумя нагревателями, так как муж (тобишь Я) может вернуться с работы раньше:), а дома холодно, нажал кнопку не дожидаясь 17.00 и в течение получаса прогрел дом. Вот она моя хотелка.

Так как вы описали систему, то это структурная схема , в которой уровень отопления дома целиком с датчиками определения температуры на улице(разумеется воздуха и земли), часов, системы задания режима отопления в ручную всего дома и каждой комнаты отдельно. И уровень датчиков. Где каждый датчик имеет свой индивидуальный термометр, или временной режим работы (стоко вкл и столько выкл). Понятно. Что некоторые датчики могут использоваться совместно и на уровне управления домом и на уровне каждого датчика. Так как важно, кто какими датчиками владеет, а их показания. Вот уже на каждом уровне и для каждого датчика надо составлять свои блок-схемы. Конечно из этого вытекает, что самое простой на каждый датчик повесить свою Ардуину и все их объединить в локальную сеть. Но это слижком жирно. Так как производительности Ардуины вполне хватает и одной. Надо только писать в режиме много-задачной системы. Как вы будете отделять каждую задачу друг от друга решать вам. Будет это ввиде строки комментариев, или же перейдете на классы, или же каждый элемент это отдельная библиотека. Но умоляю вас , смешивайте код из разных задач. Вы задолбаетесь искать ощибки в нем.

Altar
Offline
Зарегистрирован: 08.12.2017

Qwone, спасибо за совет. На данном этапе я хочу написать код для одной комнаты, где будет установлена одна ардуино nano, один датчик температуры воздуха, один температуры пола и один ethernet shield для общения с центральной. При неисправности в одной комнате, в остальных все будет работать, код будет идентичный для всех комнат, да и заменить легче будет, но это только на данном этапе. Конечно, в последствии я может и перейду к управлению с одной, но пока так. Датчик температуры улицы будет регулировать котел, а точнее температуру подачи теплоносителя в систему.

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Для решения вопроса ТС однозначно необходим регулятор (как уже выше предлогали).

В качестве исполнительных механизмов теплый и радиаторы (две ступени регулирования)

Допустим до 20% работает теплый пол, а если задание регулятора более 20% и пол, и радиаторы (процент границы включения  как и коэффициенты регулятора придется подбирать).

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Вы думаете регулировать это всё по температуре воздуха?
Ню-ню......
Вы не подумали о том что она достаточно быстро и надолго может вырасти
на несколько градусов от внешних источников тепла.
Например от камина или весной от солнца в окна.
И вы на весь день выключите подачу.
Зато вечером, как солнце сядет и вы заявитесь домой, температура резко упадет, вы будете ходить по ледяному полу и греть воздух радиаторами-калориферами.
А пол прогреется только тогда когда пора идти спать
А оно мне надо?
Поверьте, живу в комфорте 15 лет занимаясь только регулировкой температуры подачи в зависимости от погоды.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

У воздуха маленькая теплоемкость. Он быстро нагревается и быстро остывает. Опять же подвижен. Сквознячек, ветерок и теплый воздух выдуло. Если и мерять температуру, то только стен и пола, которые далеко от нагревательных элементов. Или же мерять температуру перед включением теплого пола, если не возможно удалить датчики .ПС: Самая холодное время суток это как раз время перед и при восходе солнца, когда за ночь все выстудилось, а сонце еще не начало нагревать

Altar
Offline
Зарегистрирован: 08.12.2017

trembo пишет:
Вы думаете регулировать это всё по температуре воздуха?
Ню-ню......
Вы не подумали о том что она достаточно быстро и надолго может вырасти
на несколько градусов от внешних источников тепла.
Например от камина или весной от солнца в окна.
И вы на весь день выключите подачу.
Зато вечером, как солнце сядет и вы заявитесь домой, температура резко упадет, вы будете ходить по ледяному полу и греть воздух радиаторами-калориферами.
А пол прогреется только тогда когда пора идти спать
А оно мне надо?
Поверьте, живу в комфорте 15 лет занимаясь только регулировкой температуры подачи в зависимости от погоды.

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

Altar
Offline
Зарегистрирован: 08.12.2017

Всем здравствуйте!

На основе ваших советов написал свой первый скетч. Вроде попробовал - работает. Для имитации показаний с датчика температуры ввожу цифры с порта. Что думаете об этом?

[code]
 
int radiator=3; //подключаем радиатор на 3-й пин
int pol=4; //  подключаем pol на 4-й пин
int tempzad=25; // задаем необходимую температуру в комнате
 
void setup() {
 
Serial.begin(9600); // открываем порт для имитации показаний с датчика температуры
pinMode (radiator, OUTPUT); // режим работы 3 пина - выход
pinMode (pol, OUTPUT); // режим работы 4 пина - выход
 
}
 
void loop() {
  int temproom; //объявляем переменную текущая температура в комнате
  if (Serial.available () >0) // для работы с портом
  {
    temproom=Serial.parseInt (); // чтобы переменная принимала цифровые значения
    Serial.println (temproom); // чтобы видеть, что ввел
    Serial.flush (); // для очистки порта
  
  if (temproom >= tempzad) // если температура в комнате больше или равна необходимой 25 град
  {
    digitalWrite (radiator, LOW); // выключаем радиатор
    digitalWrite (pol, LOW); // выключаем пол
  }
    else if ( temproom <= tempzad-1) // температура меньше или равна 24 град
    {
      digitalWrite (pol, HIGH); // включаем пол
  }
   if ( temproom <= tempzad-2) // температура меньше или равна 23 град
    {
      digitalWrite (radiator, HIGH); // включаем радиатор
      if (temproom <= tempzad); // если температура ранее опускалась при включенном поле, то до тех пор, пока не достигнет нужного значения пол и радиаторы включены
      {
      digitalWrite (radiator, HIGH); // выключаем радиатор
      digitalWrite (pol, HIGH); // выключаем пол
      }
}
  }
   
}
[/code]
bwn
Offline
Зарегистрирован: 25.08.2014

Altar пишет:

Всем здравствуйте!

На основе ваших советов написал свой первый скетч. Вроде попробовал - работает. Для имитации показаний с датчика температуры ввожу цифры с порта. Что думаете об этом?

Думаем, пора учится код выкладывать.

Altar
Offline
Зарегистрирован: 08.12.2017

ДА, согласен, простите, говорю же новичок.

[code]

int radiator=3; //подключаем радиатор на 3-й пин
int pol=4; //  подключаем pol на 4-й пин
int tempzad=25; // задаем необходимую температуру в комнате

void setup() {

Serial.begin(9600); // открываем порт для имитации показаний с датчика температуры
pinMode (radiator, OUTPUT); // режим работы 3 пина - выход
pinMode (pol, OUTPUT); // режим работы 4 пина - выход

}

void loop() {
  int temproom; //объявляем переменную текущая температура в комнате
  if (Serial.available () >0) // для работы с портом
  {
    temproom=Serial.parseInt (); // чтобы переменная принимала цифровые значения
    Serial.println (temproom); // чтобы видеть, что ввел
    Serial.flush (); // для очистки порта
  
  if (temproom >= tempzad) // если температура в комнате больше или равна необходимой 25 град
  {
    digitalWrite (radiator, LOW); // выключаем радиатор
    digitalWrite (pol, LOW); // выключаем пол
  }
    else if ( temproom <= tempzad-1) // температура меньше или равна 24 град
    {
      digitalWrite (pol, HIGH); // включаем пол
  }
   if ( temproom <= tempzad-2) // температура меньше или равна 23 град
    {
      digitalWrite (radiator, HIGH); // включаем радиатор
      if (temproom <= tempzad); // если температура ранее опускалась при включенном поле, то до тех пор, пока не достигнет нужного значения пол и радиаторы включены
      {
      digitalWrite (radiator, HIGH); // выключаем радиатор
      digitalWrite (pol, HIGH); // выключаем пол
      }
}
  }
   
}
[/code]

 

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Altar пишет:

ДА, согласен, простите, говорю же новичок.

[code]

int radiator=3; //подключаем радиатор на 3-й пин
int pol=4; //  подключаем pol на 4-й пин
int tempzad=25; // задаем необходимую температуру в комнате

void setup() {

Serial.begin(9600); // открываем порт для имитации показаний с датчика температуры
pinMode (radiator, OUTPUT); // режим работы 3 пина - выход
pinMode (pol, OUTPUT); // режим работы 4 пина - выход

}

void loop() {
  int temproom; //объявляем переменную текущая температура в комнате
  if (Serial.available () >0) // для работы с портом
  {
    temproom=Serial.parseInt (); // чтобы переменная принимала цифровые значения
    Serial.println (temproom); // чтобы видеть, что ввел
    Serial.flush (); // для очистки порта
  
  if (temproom >= tempzad) // если температура в комнате больше или равна необходимой 25 град
  {
    digitalWrite (radiator, LOW); // выключаем радиатор
    digitalWrite (pol, LOW); // выключаем пол
  }
    else if ( temproom <= tempzad-1) // температура меньше или равна 24 град
    {
      digitalWrite (pol, HIGH); // включаем пол
  }
   if ( temproom <= tempzad-2) // температура меньше или равна 23 град
    {
      digitalWrite (radiator, HIGH); // включаем радиатор
      if (temproom <= tempzad); // если температура ранее опускалась при включенном поле, то до тех пор, пока не достигнет нужного значения пол и радиаторы включены
      {
      digitalWrite (radiator, HIGH); // выключаем радиатор
      digitalWrite (pol, HIGH); // выключаем пол
      }
}
  }
   
}
[/code]

 

Я уверен что при таком подходе будут значительные (ощущаемые) колебания температуры.

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