Добрый вечер, я рукожоп.. Сделал счетчик воды с выводом данных на страничку. При работе, особенно при большом расходе воды, счетчик холодной воды убегает вперед, т.е. есть ложные срабатывания. (С горячей водой несколько дней все хорошо, но там и расход меньше). Всю голову сломал. На макетной плате на кнопках все отрабатывает на отлично. Посмотрите свежим взглядом, может будут предположения, почему такое случается?
Счетчики VALTEC, подключены по релейной схеме в режиме INPUT_PULLUP с резистором на пин 1 кОм.
По паспорту счетчиков, максимальный расход через счетчик 2.5 куба в час (0,69 литров в секунду), срабатывание геркона каждые 10 литров.
При подключении счетчиков пользовался этим: http://www.bizkit.ru/2018/12/21/11181/
C++:
//--------------------------------Переменные-------------------------------
int Cold = 0; //Переменная холодной воды
int Hot = 0; //Переменная горячей воды
int ColdPin = 5; // Пин холодной
int HotPin = 4; // Пин горячей
int MillisHot; //таймер времени обновления горячей воды
int MillisCold; // таймер времени обновления холодной воды
bool PreviousPinCold; // Последний статус пина холодной воды
bool PreviousPinHot; // Последний статус пина горячей воды
//--------------------------------Код счета воды--------------------------------
if (millis() - MillisCold > 500 && digitalRead(ColdPin) == HIGH) { //Если прошло время И текущий сигнал HIGH (кнопка отпущена)
PreviousPinCold = 1; // меняем статус флага
}
if (millis() - MillisHot > 500 && digitalRead(HotPin) == HIGH) { //Если прошло время И текущий сигнал HIGH (кнопка отпущена)
PreviousPinHot = 1; // меняем статус флага
}
if (digitalRead(ColdPin) == LOW && millis() - MillisCold > 500 && PreviousPinCold == 1) { //Если на пине сигнал LOW И время прошло И предыдущий сигнал был 1 (HIGH)
Cold = Cold + 10; // Увеличиваем счетчик на величину литров тика счетчика
PreviousPinCold =0; // Устанавливаем флаг состояния в 0 (LOW)
MillisCold = millis(); // сбрасываем таймер срабатывания
}
if (digitalRead(HotPin) == LOW && millis() - MillisHot > 500 && PreviousPinHot == 1) { //Если на пине сигнал LOW И время прошло И предыдущий сигнал был 1 (HIGH)
Hot = Hot + 10; // Увеличиваем счетчик на величину литров тика счетчика
PreviousPinHot =0; // Устанавливаем флаг состояния в 0 (LOW)
MillisHot = millis(); // сбрасываем таймер срабатывания
}
По паспорту счетчиков, максимальный расход через счетчик 2.5 куба в час (0,69 литров в секунду), срабатывание геркона каждые 10 литров.
При подключении счетчиков пользовался этим: http://www.bizkit.ru/2018/12/21/11181/