то ли Millis то ли руки
- Войдите на сайт для отправки комментариев
Вс, 04/02/2018 - 00:54
Добрый вечер, помогите разобраться!
Есть емкость в которой вода, пополняется автоматически, как появится давление в питающей системе, должен включиться таймер который отсчитает 5 минут и откроет электромагнитный клапан. в реальности получается что таймер живет своей жизнью. Отсчет 5ти минут не начинается в момент когда давление появилось. А таймер просто обнавляет каждые 5 минут (previousMillis) с самого включения контроллера.
#define Valve 12 // электромагнитный клапан #define PressureIn A3 // датчик давление в питающей линии int PressureFilling; // переменная с датчика давления в питающей воде int Pressure; // давление в питающей воде boolean FillingWater = 0; // флаг давления в питающей воде unsigned long previousMillis = 0; const long interval = 300000; void setup() { pinMode(Valve, OUTPUT); } void loop() { PressureFilling = analogRead(PressureIn); // флаг на разрешение пополнения воды Pressure = map(PressureFilling, 90 , 920, 0, 4); if (Pressure < 1) { FillingWater = 0; } if (Pressure >= 2) {unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; FillingWater = 1; } } }
sharkman89.Я вам точно говорю. Виноваты только ваши руки, или голова. Потому что умная голова кривой код не напишет.
Добрый вечер, помогите разобраться!
Есть емкость в которой вода, пополняется автоматически, как появится давление в питающей системе, должен включиться таймер который отсчитает 5 минут и откроет электромагнитный клапан. в реальности получается что таймер живет своей жизнью. Отсчет 5ти минут не начинается в момент когда давление появилось. А таймер просто обнавляет каждые 5 минут (previousMillis) с самого включения контроллера.
Дык выведите все Ваши переменный в монитор порта, и контролируйте состояние. Там и поймете чего куда.
С 20 по 26 строчки лишние. Достаточно в 28 вместо 2 написать 512 или сколько там получается в19 при нормальном давлении. В 30 надо не if a while и соответственно поправить чтобы 5минут ждал. Можно просто delay использовать. По алгоритму не предполагается в это время что то делать и millis() явно лишний. Потом включить клапан. Вот на сколько не понятно, но можно тоже на делее или опять цикл while с проверкой условия давления или чего ещё.
все немного сложнее)
и все же в чем беда? ведь я приравниваю
unsigned long currentMillis = millis();
только после того как появилось давление???
Есть емкость в которой вода, пополняется автоматически, как появится давление в питающей системе, должен включиться таймер который отсчитает 5 минут и откроет электромагнитный клапан. в реальности получается что таймер живет своей жизнью. Отсчет 5ти минут не начинается в момент когда давление появилось. А таймер просто обнавляет каждые 5 минут (previousMillis) с самого включения контроллера.
По каким признакам вы понимаете, что отсчет не начался и в какой строчке он должен начинаться, по вашему мнению?
отсчет должен начинаться только после того как появилось давление
118
else
if
(Pressure >=2)
119
{unsigned
long
currentMillis = millis();
120
if
(currentMillis - previousMillis >= interval)
121
122
123
{
124
previousMillis = currentMillis;
125
FillingWater = 1;
// пополнение разрешено
126
}
я подключал вместо датчика давления фоторезистор (таким образом что если датчик видит свет условие выполняется)
таймер ставил не 5 минут , а 30 секунд
запускал контроллер с накрытым фоторезистором, ждал 20 секунт и открывал его, в моем понимании спустя 30 секунд на экране должна появиться индикация (^^)
258
lcd.print(
"^^"
);
но индикация появляется через 10 секунд, то есть контроллер начинае отсчет сразу с момента запуска.
если запустить и держать фоторезистор накрытым дольше интервала, то при открытии фоторезистора, индикация наполнения появляется сразу.
отсчет должен начинаться только после того как появилось давление
запускал контроллер с накрытым фоторезистором, ждал 20 секунт и открывал его, в моем понимании спустя 30 секунд на экране должна появиться индикация (^^)
258
lcd.print(
"^^"
);
но индикация появляется через 10 секунд, то есть контроллер начинае отсчет сразу с момента запуска.
если запустить и держать фоторезистор накрытым дольше интервала, то при открытии фоторезистора, индикация наполнения появляется сразу.
Давайте на коротком скетче разбираться для начала. На том, что в сообщении #1. Куда нужно воткнуть этот print() (обойдемся Serial.println()), в какую строку?
запускал контроллер с накрытым фоторезистором, ждал 20 секунт и открывал его, в моем понимании спустя 30 секунд на экране должна появиться индикация (^^)
Не, от чо мне нравится, так это изобретательность для эмуляции событий.
Помню на закате СССР, служил в Красной Армии и на подхвате у телефонистов монтировал сигналку пожарную и от воров в новом магазине строителей РоАЭС. Комиссия значит усе принимает, вдруг нас кличут, а я один в этот момент на узле был. Ну, собрался, пошел. Прихожу и оуеваю, посреди магаза лестница четырехметровая стоит и пожарную этот хрен-председатель уже зажигалкой проверил.))) Теперь размышляет, как проверить от воров. Говорю, так зачем же дело стало, бери стул и в витрину его, в витрину. Не соглашается, дорого типа, не должно так быть. На вопрос, вот прежде чем лестницу переть и лезть наверх костры разводить, может лучше позвонить было и я бы тебе два выключателя контрольных в подсобке показал, задумался.
получается то же самое,
через 30 секунд даже если первых 15 секунд условие
небыло соблюдено(((
qwone спасибо за код, буду пытаться интегрировать его в свой, правда пока сложновато для меня в понимании)
Обычное событийное программирование. Правда реализовано примитивно . Событие ValveON взводится , если давление превысило границу , и сбрасывается если давление упало или же истекло время для открытия кланана. Разумеется при низком давлении кланан закрывается и если событие ValveON было вкл, то сбрасывается. Можно описать в классах, но это для вас окажется сложнее.
ЗАРАБОТАЛО!!! ОГРОМНОЕ СПАСИБО)