Нода - счетчик импульсов на DS2423

О программировании Arduino, использование библиотек, примеры и общие вопросы программирования.
Ответить
serghei
Сообщения: 10
Зарегистрирован: 05 апр 2018, 09:12
Откуда: Молдова

Нода - счетчик импульсов на DS2423

Сообщение serghei » 27 авг 2018, 20:02

Представляю Вашему вниманию скетч ноды - счетчика импульсов. Это мой первый опыт работы с MySensors.
Сам счетчик - это микросхема DS2423. Работает по протоколу 1-Wire. Имеет 2 канала подсчета. Код публикую с разрешения автора Berk .
Вложение My_SensorsDS2423.zip больше недоступно
Я его использую совместно с механическими счетчиками воды YF-S201 около 2-х лет. Один стоит перед бойлером на подаче и по факту меряет горячую воду , второй на стиральной машине. Точность измерений ( 1 тик ) - 2,5 грамма. На 3-х литровую банку делает в среднем 1280 оборотов. Что бы получить значение в литрах результат делим на 430 . Для других счетчиков подбирается по необходимости.

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

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

Исходные данные взял С этого сайта.


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

PS/ Изначально применял DS2423 в проекте AMS на ESP32. В качестве приемника шины выступал мост DS2482 - конвертор 1-wire - I2C. К ней подключено 4 DS18B20 и этот девайс. Длинна линии около 30 метров телефонной лапши.
Вложения
My_SensorsDS2423.zip
1-Wire счетчик на DS2423
(3.43 КБ) 19 скачиваний

serghei
Сообщения: 10
Зарегистрирован: 05 апр 2018, 09:12
Откуда: Молдова

Re: Нода - счетчик импульсов на DS2423

Сообщение serghei » 27 авг 2018, 20:09

Фото с просторов интернета ( их уже больше не продают).
Ds2423.gif
Ds2423.gif (22.65 КБ) 366 просмотров

serghei
Сообщения: 10
Зарегистрирован: 05 апр 2018, 09:12
Откуда: Молдова

Re: Нода - счетчик импульсов на DS2423

Сообщение serghei » 27 авг 2018, 20:10

Схема
DS2423.jpg
DS2423.jpg (96.24 КБ) 366 просмотров

serghei
Сообщения: 10
Зарегистрирован: 05 апр 2018, 09:12
Откуда: Молдова

Re: Нода - счетчик импульсов на DS2423

Сообщение serghei » 24 сен 2018, 15:11

Месяц работы прошел успешно. За это время можно сделать некоторые выводы.
Во первых в коде надо заменить строчку

Код: Выделить всё

  uint8_t counA = ((ds2423.getCount(DS2423_COUNTER_A)) / 430); 
  uint8_t counB = ((ds2423.getCount(DS2423_COUNTER_B)) / 430);
на

Код: Выделить всё

  uint16_t counA = ((ds2423.getCount(DS2423_COUNTER_A)) / 430);
  uint16_t counB = ((ds2423.getCount(DS2423_COUNTER_B)) / 430);
иначе считает до 255 и сбрасывает в 0. При uint16_t считает до 32 768 и при переполнении сбрасывает в - (минус)32 768.
430 это коэффициент преобразования. Водяные в счетчики YF-S201 делают в среднем 1280 оборотов на 3 литра. На электрических пишут сколько импульсов на 1 киловатт-час.
Во вторых скетч позволяет регулировать частоту отправки данных. За это отвечает

Код: Выделить всё

uint16_t const count_interval = 5000;
Тут можно подставить требуемое число.
И в развитии скетча можно перевести ноду в спящий режим. Это в случае , если интересуют данные за определённый период. Для этого в loop заменить

Код: Выделить всё

void loop() {
  if (millis() - previousMillis > count_interval) {
    if (flag == 1) {
      ds2423_read_ver1 ();
      flag = 0;
      previousMillis = millis();
    }
    else {
      ds2423_read_ver2 ();
      flag = 1;
      previousMillis = millis();
    }
  }
}
на

Код: Выделить всё

void loop() {
  if (flag == 1) {
    ds2423_read_ver1 ();
    flag = 0;
    }    else {
      ds2423_read_ver2 ();
      flag = 1;
    }
// sleep(count_interval, false);  
 sleep(count_interval, true); 
}
где за время сна отвечает

Код: Выделить всё

//sleep(count_interval*1000, false) // глупый сон  /// секунды
//sleep(count_interval*1000*60, false) // глупый сон  /// минуты
sleep(count_interval*1000*60*60, false) // глупый сон  /// часы
//sleep(count_interval*1000*60*60*24, false) // глупый сон  /// дни
//sleep(count_interval, true) // умный сон //
//sleep(count_interval*1000*60, true) // умный сон  /// минуты
//sleep(count_interval*1000*60*60, true) // умный сон  /// часы
//sleep(count_interval*1000*60*60*24, true) // умный сон  /// дни
PS/ код приведен с разрешения автора.

Ответить