• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Делюсь опытом Изобрел велосипед, точнее снятие показаний счетчиков воды на Wemos D1 mini :))

Slacky

Member
Если кто вдруг возьмет за основу мой код устранения дребезга, то я нашел там небольшой косяк, хотя ни на что это не влияет, но мало ли ... В функции прерывания os_timer_arm() может вызваться несколько раз. А документация гласит

For the same timer, os_timer_arm (or os_timer_arm_us) cannot be invoked repeatedly. os_timer_disarm should be invoked first.

Поэтому функции прерываний должны выглядеть так

Код:
void hotInterrupt() {
  if (hotInt == 0) {
    hotInt++;
    hotTimeBounce = millis();
  } else os_timer_disarm(&hotTimer);
  Serial.println("hotInterrupt");
  os_timer_arm(&hotTimer, TIME_BOUNCE, true);
}
 

Garichome

New member
вопрос-мысль вслух от ламера.... А если для варианта с анализом состояния входов (не с прерываниями) использовать тот факт, что замыкание все же длится достаточно большое время относительно длительности цикла? Т.е. берем переменную, зануляем на старте, определяем флаг "сигнал есть", сбрасываем его, дальше крутим цикл анализа входов, если при анализе входа видим там единицу - увеличиваем значение переменной на единицу, если там ноль - уменьшаем. Набрали значение выше условно сотни - проверяем флаг "сигнал есть", если он не был выставлен - ставим флаг "сигнал есть", передаем дальше в программу факт срабатывания, минусуем переменную на единицу, если флаг уже стоял - просто минусуем переменную. Если же переменная уходит в минус - снимаем флаг "сигнал есть", зануляем переменную. "Сотня" (граница) определяет минимальную длительность реального импульса.
 

Алексей.

Active member
Т.е. берем переменную, зануляем на старте, определяем флаг "сигнал есть", сбрасываем его, дальше крутим цикл анализа входов, если при анализе входа видим там единицу - увеличиваем значение переменной на единицу, если там ноль - уменьшаем.
Это называется интегрированием, я в школе проходил :)
Таким же образом (как мне кажется) я устраняю дребезг обыкновенного выключателя света, просто я в тамбуре свет забываю выключать, вот и поставил рядом с выключателем есп-01 с реле.
 

Garichome

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

SergeyTolkachv

New member
Привет всем. Есть предложения по улучшению модуля. Почему бы не сделать возможность записи показаний в память EEPROM или на SD.
 

Vampik

New member
Всем привет. Собрал счетчик по данной схеме с этой прошивкой. По результатам опытной эксплуатации выявилась проблема. Самопроизвольно накручивается счетчик. Изучение кода выявило недочет в алгоритме устранения дребезга - кратковременное падение сигнала приводит к инкрементированию счетчика. Переделал алгоритм, повесив прерывание не только на рост сигнала, но и на его падение, и модифицировал код с отслеживанием состояния. Единственный минус, полностью удалил поддержку спящего режима, т.к. не знаю, как его адаптировать к новому алгоритму.
Помимо этого, сделал еще несколько исправлений:
  • исправление ошибки компиляции
  • исправление ошибки "ISR not in IRAM" при запуске прошивки скомпилированной с последними версиями платформы
  • исправление SD пина по умолчанию (на актуальных платах теперь это D4)
  • исправление имени хоста (обрезалось из-за подставления номера версии с точкой в нем
Также удалил код поддержки mqttwarn и самодельного веб-интерфейса, упростил MQTT сообщения и сделал их периодическую посылку раз в 5 минут - для интеграции в Home Assistant. Самодельные костыли мне не понравились ;)
Репозиторий здесь - https://github.com/vampik/watermeter
 
Сверху Снизу