millis в условии
- Войдите на сайт для отправки комментариев
Ср, 01/07/2020 - 08:32
Всем привет, проблема такая - хочу сделать на скважину датчик сухого хода т.е. когда вода кончается в скважине (а такое бывает) не спалить насос а отключить его на заданный период.
Алгоритм - если кнопка с фиксацией нажата, запустить таймер отсчитать 15 сек (для того что бы вода поднялась по трубе до датчика), считать состояние датчика, если true то качаем дальше, если false то вырубаем насос и ждём 30мин, после опять запускаем насос ждём 15сек меняем состояние датчика и так по циклу.
Ка ни пытался не получается, подскажите пожалуйста
Показывайте, как пытались, и что именно в попытках работает не так.
Обычно для решения таких задач используется конечный автомат.
тайминги уменьшил для проверки, работает это так поплавок true, поток false, светодиод (насос) загорется и не тухнет через секунду хотя должен
А строки 1, 11 и 19 ничего не навевают?
И эта программа не компилируется по определению. Вру, может, но бредово.
Для наглядности из кода выкидывал лишние функции, и напартачил но сути это не меняет он ведет себя так же
В 30 строке замени условия на "больше"
заменил, ничего не поменялось
еще в 33 и 38
пробовал, не помогает(
А теперь о главном! Конструкция с миллис ВСЕГДА должна выглядеть как "настоящее_время-предыдущее_время> интервал". Другие конструкции ведут к херне. Читайте на форуме "Великое переполнение миллис"
И еще - у Вас нет момента наполнения бака. Хорошо - в баке появилась вода, а потом что?
Спасибо, буду знать, но в данном случае ничего не изменилось
Вы в каждом цикле обновляете пороговое время,
поэтому и не можете его достигнуть.
if (woter_level == true && enable_nasos == true){
t1 = millis() + 1000; // t1 - момент когда вода
Я это уже понял, но не могу придумать как сделать по другому...
Добавить третье && - если насос еще не включен.
Тогда засечь время и включить.
Я это уже понял, но не могу придумать как сделать по другому...
А если уровень воды чуть поднялся и уже не тру, то что будет?
А где датчик наполнения бака?
А если уровень воды чуть поднялся и уже не тру, то что будет?
А где датчик наполнения бака?
НА самом деле будет два датчика нижнего и верхнего уровня, код упрощен дабы не возникало лишних вопросов
Добавить третье && - если насос еще не включен.
Тогда засечь время и включить.
тоже самое
По моему у вас путаница с nasos и enable_nasos
31, 34, 39 - переведи?
31, 34, 39 - переведи?
это флаг для условия, если он есть то насос при надобности можно включить, а если нет то значит был "сухой ход" насоса а время отдыха еще не прошло... как то так)
Прям глаз режет "woter_level", "potok","nasos", "enable_nasos"...
Определись на каком языке пишешь.
water_lvl, flow_sensor ,pomp_on и тд
Добавьте перед или после 34
nasos = false;
Добавление. БЫЛ НЕПРАВ. это не надо.
Это точно поможет )))
Это точно поможет )))
Конечно.
Порядок должен быть как в коде, так и в названиях переменных.
Как вы яхту назовёте, так она и поплывет :-)
31, 34, 39 - переведи?
это флаг для условия, если он есть то насос при надобности можно включить, а если нет то значит был "сухой ход" насоса а время отдыха еще не прошло... как то так)
ой, а я и не туда... понял, исправил
Это точно поможет )))
Так беспорядок у тя с глазами, займись лучше ими.
А именования идентификаторов автор кода выбирает понятными для себя и соответствующие синтаксису языка. Тебе они не ясны - твои проблемы. Но я пожалуй готов даже поспорить с тобой, что замена наименований никак не скажется на работе кода.
Без обид. Когда человек не шарит в алгоритме, не понимает код он цепляется к именам, орфографии и пробелам. Это считай закон. Зачем ты это делаешь? Хочешь помочь - найди ошибку, а придираться к мелочам - себя в дурном свете выставлять.
может я принципиально не правильно делаю, подскажите в какую сторону копать
Мне woter_level тоже глаз резанул, но главное, что его значение не понятно без комментария
// грубо говоря поплавок в баке (true когда уровень воды упал)
Да и с комментарием не очень понятно - упал ниже верхнего ограничения или достиг нижнего ограничения.
копай в отладку. Например мне не очень понятно что творится в условии стр.22-28. Поставь в стр.24 и 27 вывод в сириал. Проверь, ты так предполагал работу? И дальше проверяй сириалом в подозрительных местах.
проблема в первом if'е, я t1 присваиваю millis, каждый проходящий цикл, над этой проблемой думаю второй день и до сих пор не придумал как обойти ее
не каждый. Через раз. Раз делаеш
nasos =
true
;
и устанавливаеш t1, а на следующем проходе делаешьnasos =
false
;
. Не похоже чтоб так надо было.Это точно поможет )))
Так беспорядок у тя с глазами, займись лучше ими.
А именования идентификаторов автор кода выбирает понятными для себя и соответствующие синтаксису языка. Тебе они не ясны - твои проблемы. Но я пожалуй готов даже поспорить с тобой, что замена наименований никак не скажется на работе кода.
(см. #20, #31)
Не запутаться в этом достаточно тяжело.
так чЁ? меняем "nasos" на "pump" и все заработает? ;)
Или еще что переименовать требуется? Действительно, так же проще чем багу искать. ))))
есть прогресс! теперь работает все, но не без косяков - при поплавке - false, а потоке - true, включается насос
сначала подумал что это никак не помешает работе устройства, но потом вспомнил что датчик потока механический и он может залипнуть, так что нужно это решать
так чЁ? меняем "nasos" на "pump" и все заработает? ;)
Или еще что переименовать требуется? Действительно, так же проще чем багу искать. ))))
Вот тут согласен. Смысл - все, буковки - херня, только чтоб найти где эта переменная заюзана. Ctrl+F одинаково nasos там, или pump, pumpe, pompe.
Мне например куда больше не нравится конструкция
if
(millis() - t1 > timer_zaderzhki && potok ==
true
){...}
else
if
(millis() - t1 > timer_zaderzhki && potok ==
false
&& enable_nasos ==
true)...
как ИМХО
if
(millis() - t1 > timer_zaderzhki
) {
if
(potok ==
true
){...}
else
if
(
enable_nasos ==
true)...
} облегчит понимание смысла в 100500 раз больше чем любое переименование.На мой взгляд, по сравнению с #13 сейчас код стал более запутанным. Раньше насос включался - выключался только в одном блоке условий, а сейчас в нескольких, что и приводит к "но не без косяков - при поплавке - false, а потоке - true, включается насос".
Возможно имеет смысл доработать вариант #13 сделав вместо третьего условия - вложенное.
Примерно так
Или полностью переделать структуру условий, сделав ее более понятной и предсказуемой
Например два больших блока
Если насос выключен - то какие действия
Если насос включен - то какие действия
Но все это - ИМХО.
На мой взгляд, по сравнению с #13 сейчас код стал более запутанным. Раньше насос включался - выключался только в одном блоке условий, а сейчас в нескольких, что и приводит к "но не без косяков - при поплавке - false, а потоке - true, включается насос".
Возможно имеет смысл доработать вариант #13 сделав вместо третьего условия - вложенное.
Примерно так
Или полностью переделать структуру условий, сделав ее более понятной и предсказуемой
Например два больших блока
Если насос выключен - то какие действия
Если насос включен - то какие действия
Но все это - ИМХО.
примерно так:
// если насос включен И датчик чего-то там равен нулю ....и т.д.
а потом под этой строкой писать всякие ифы с эльзами - уже вражескими буквами.
Отмучался))
Всем спасибо за советы!!!