Перейти к публикации
iT4iT.CLUB
svchekalin

Счетчик воды esp8266

Рекомендованные сообщения

Есть у китайцев замечательный не дорогой девайс для подсчета количества потребляемой жижи из водоканала

HTB1OhG1IFXXXXbtapXXq6xXFXXXi.jpg

стоит такая приблуда около 200р что по сравнению с отечественным готовым решением минимум в два раза дешевле.

Так вот есть у меня такой код

Скрытый текст

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

#include <ESP8266mDNS.h>

volatile int flow_frequency;               // Water flow
unsigned int l_hour, f_val;                // Water flow
unsigned long ctTime, flow_val, cloopTime; // Water flow

// Имя хоста
const char* host = "Hot_water";
// Вместо звездочек свои параметры WiFi сети
const char* ssid = "dd-wrt";
const char* password = "qwerty";

ESP8266WebServer server(80);

void flow () //  Water flow Interrupt function
{
  flow_frequency++;  f_val++;
}

void setup()
{
  Serial.begin(115200);
  attachInterrupt(1, flow, RISING);  sei();   ctTime = millis();  cloopTime = ctTime; // Water flow
}

void loop ()
{
  ctTime = millis();
  if (ctTime >= (cloopTime + 1000))
  {
    cloopTime = ctTime;
    l_hour = (flow_frequency * 60 / 7.5);
    flow_frequency = 0; // Сброс счётчика
    Serial.print(l_hour, DEC);     Serial.print(" L/hour");    // Литров в час
  }

  if (f_val >= 450) {
    flow_val++;
    f_val = 0;
  }
  Serial.println(flow_val); Serial.println("L"); // Всего литров
}

 

который я хочу приспособить под esp8266 которая в данный момент на Али стоит в районе 100р а учитывая то что на одну есп можно повесить и холодную и горячую воду решение видится довольно бюджетным ! Cкидывать данные в Mysql и это уже дорогого стоит p.s. не чуть не сомневаюсь в решении данного вопроса на этом форуме ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я бы брал за основу механический счетчик воды с импульсным выходом.

VLF-R-I.jpg

Для меня они имеют следующие преимущества:

  • прибор сертифицирован
  • может быть официально поставлен на учет и опломбирован
  • механически дублирует показания (необходимо для калибровки ESP)
  • имеет паспорт средства измерения и все измерения производит только он, следовательно, ESP становится исключительно транспортом для передачи данных

И так, все довольно просто. Нам необходимо знать количество импульсов на 1 кубический метр жидкости проходящей через счетчик. Настроить прерывание ESP на срабатывание при переходе от высокого уровня с низкому. Импульсный выход счетчика использовать для подтягивания пина прерывания на землю (так мы можем использовать очень длинный кабель от счетчика, и на нем не будет никакого питания). Считать сколько было прерывания, при достижения числа равному количеству импульсов на 1 кубометр, увеличивать общий счетчик прошедшей воды, а счетчик прерываний обнулять. Данные с общего счетчика можно передавать в MySQL или по MQTT на сервер умного дома, ну или на худой конец просто выводить в браузер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да это уже вопрос второй чем счетать я обратил внимание на китайскую приблуду по причине того что счетчики стоят и опломбированны и есть возможность подключится до них . Ну да как я говорил это не столь важно а вот библеотека для работы с мусколом на есп не работает !

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Все доброго времени суток.

Набросал тестовую программу для учета расхода воды при использовании счетчиков с импульсным выходом. На данный момент программа очень простая и основная её задача - это отловить все подводные камни при учете показаний. Если наше маленькое сообщество поможет это сделать, то выпустим полноценный вариант с собственным web сервером для наблюдения за текущими показаниями, графиками, отправкой данных на внешние сервера и разными дополнительными настройками. В общем приведем это все к реализации похожей на ту, что используется в метеостанции в соседней теме.

Помощь нужна по одной простой причине, у меня дома не подключены счетчики с импульсным выходом. Естественно, что в будущем это будет исправлено, но на данный момент инструмент накрутки импульсов отсутствует. А если у кого-то уже имеются подключенный счетчик, энтузиазм и свободное время, то это может пойти на общее благо.

В тестовой программе реализован необходимый минимум для учета показаний:

  1. Учет показаний по двум канал (горячая, холодная) с счетчиков, обладающих импульсным выходом, работающим по принципу сухого контакта.
  2. Подключение (переподключение) к домашней точке доступа
  3. Передача показаний счетчиков на удаленный MQTT сервер
  4. Корректировка показаний счетчиков через публикацию сообщений в специализированных топиках на MQTT сервера
  5. Корректировка количества импульсов на единицу значения счетчика через специализированный топик на MQTT сервере
  6. Хранение показаний в энергонезависимой памяти на случай пропажи питающего напряжения

Теперь немного по программе.

Для снятия показаний используются прерывания по спаду логического сигнала на каждом из каналов. Это означает, что сухой контакт (импульсный выход) счетчика воды будет коммутировать землю и порт микроконтроллера, последний, в свою очередь, будет настроен как вход с внутренней подтяжкой к питанию. Это позволит использовать очень длинные провода от счетчика до микроконтроллера, что довольно полезно для тех, кто хочет снять показания с счетчика воды установленного в колодце частного дома (на улице) или в любых схожих ситуациях.

Программа контроллера не использует спящий режим или другие энергосберегающие приемы, что подразумевает питание от внешнего источника, например, блока питания от старого телефона. Но можно взять у наших братьев с востока контроллер с DC-DC преобразователем и картриджем для литиевого аккумулятора 18650.

IMG_3338.JPG IMG_3339.JPG

Вообще резервирование питания не обязательно, я просто перестраховываюсь на случай отключения электроэнергии в то время, когда будет иметь место фактический расход воды.

В первую очередь для реализации Вам понадобится дополнительная библиотека PubSubClient использующаяся для связи с MQTT сервером. Она доступна в каталоге библиотек среды разработки Arduino IDE.

Что касаемо настроек, то в первой версии оставим их в самом коде.

Сетевые настройки

/* Настройки подключения */
String ssid   = "AP_Name";          // Имя домашней точки доступа
String pass   = "AP_Pass";          // Пароль к домашней точки доступа
String server = "mqtt.it4it.club";  // Адрес MQTT сервера
String device = "waterCounter";     // Обязательно уникальное имя для каждого MQTT клиента

Если вы пользуетесь собственным MQTT сервером, то имя устройства можно не менять, в противном случае укажите иное имя или оставьте его пустым и в таком случае будет использован WiFi идентификатор устройства, содержащий два последний байта MAC адреса устройства.

Настройки используемых портов

/* Порты для подключения импульсного выхода с счетчиков */
byte HPort = 12;
byte CPort = 14;

Таблица соответствия портов ESP, плат WeMos и NodeMCU указана в комментариях в самом коде.

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

/*
  Устанавливаем какое количество импульсов требуется для сохранения данных и отправки их на сервер.
  1 импульс = 0,01 куб.м (10 литров), 100 импульсов = 1 куб.м (1000 литров) оптимальное значение.
*/
uint16_t ppuv = 10;

Обычно на счетчиках указано какое количество литров расхода соответствует одному импульсу и в большинстве случаев это 10 литров на 1 импульс. По умолчанию в программе используется значение в 10 импульсов, что равняется 100 литрам расхода воды. Это означает, что за 1 куб.м. расхода контроллер 10 раз передаст показания на сервер. Это также означает, что переданные значения будут содержать не только целое количество израсходованных кубов, но и десятую нового куба. (00000.1), по сути точность показаний при ppuv равным 10 будет 0.1 куба. Подправьте это значение под Ваш счетчик.

Программа сохраняет показания в энергонезависимую память одновременно с передачей показаний на внешний сервер, важно это помнить т.к если использовать малое значение ppuv, например 1, то Flash память микроконтроллера будет очень часто перезаписываться, что приведет к быстрому выходу её из строя. В большинстве модулей ESP используется Flash память с минимальным количеством циклов перезаписи равным 100000. Это не мало, но вопрос в том, как расходовать. При ppuv равном 10 и средним расходом воды 10 куб.м. по каждому из каналов в месяц, микросхема выработает первые свои 100000 циклов через 4 года. В принципе мы легко повысим срок службы Flash памяти в следующих версиях, но на данный момент имеем эти показания.

Если я где-то ошибся в математике при расчетах, то прошу меня ссаными тряпками не бить.

Передача показаний на удаленный MQTT сервер

Данные передаются в топик начинающийся с имени устройства указанного в конфигурации или WiFi идентификатора если имя не используется. Далее идут субтопики с именами hot и cold для обозначения горячей и холодной воды соответственно. Данные публикуются в виде целых чисел, и на самом деле может не быть целым числом т.к зависит от переменной ppuv. Просто имейте это в виду и отбрасывайте десятичную и т.п часть в голове. В будущей версии все это будет учтено.

  1. waterCounter/hot
  2. waterCounter/cold

Корректировка показаний

При подключении микроконтроллера к сети происходит подписка на топик MQTT сервера через который можно производить изменение текущих показаний и не только.

  1. waterCounter/settings/#

По сути подписка оформляется на все субтопики родителем которых является субтопик settings. Это означает, что чтобы изменить показания горячей, холодной воды или значения ppuv можно опубликовать нужное значение в следующих топиках:

  1. waterCounter/settings/hot
  2. waterCounter/settings/cold
  3. waterCounter/settings/ppuv

Значения должны быть целым числом и учитывать конфигурацию ppuv, а значит иметь дополнительные значения для чисел после запятой. То есть при значении счетчика в 555 кубов и ppuv равным 10 для стандартного счетчика, публикуемое значение для настроек должно быть 5550.

Тестируйте, высказывайте предложения, делитесь идеями и наработками.

Скачать исходник можно тут

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну я понимаю что насиловать память контроллера не нужно но вот в mqtt можно по подробней сбрасывать . На данный момент нахожусь в состоянии бетатестера , вроде считает только что пока не понятно похоже сотнями литров хотя я так воду не лью ... Будем тестить дальше . А да настройки по дефолту. Внесу свою лепту ; собираю данные через node-red группирую через переменные данные с двух счетчиков дополнив текстом холодная вода и горячая вода а потом отправляю на мыло.

Код для импорта в node-red watercounter 

Скрытый текст

[{"id":"2c7de2c3.9bc00e","type":"mqtt in","z":"da66859c.abc4c8","name":"","topic":"waterCounter/hot","qos":"2","broker":"54e6c737.26fcc8","x":426.58331298828125,"y":318.33334159851074,"wires":[["29b449ae.c601e6"]]},{"id":"ce313c65.e51fe","type":"mqtt in","z":"da66859c.abc4c8","name":"","topic":"waterCounter/cold","qos":"2","broker":"54e6c737.26fcc8","x":420.83331298828125,"y":378.33335876464844,"wires":[["896559df.03e9f8","d63099a.696fc68"]]},{"id":"29b449ae.c601e6","type":"function","z":"da66859c.abc4c8","name":"variables_hot","func":"flow.set(\"water_hot\",msg['payload']); // установить значение\nreturn msg;","outputs":1,"noerr":0,"x":782.7380676269531,"y":317.61903190612793,"wires":[[]]},{"id":"896559df.03e9f8","type":"function","z":"da66859c.abc4c8","name":"Variables_cold","func":"flow.set(\"water_cold\",msg['payload']); // установить значение\nreturn msg;","outputs":1,"noerr":0,"x":797.5000305175781,"y":379.5238609313965,"wires":[[]]},{"id":"d63099a.696fc68","type":"function","z":"da66859c.abc4c8","name":"hot+cold","func":"var vc_name, vh_hame, water_cold, water_hot, vhn, vcn, water_counter;\nvc_name = 'холодная вода:';\nvh_hame = ' горячая вода:';\nwater_cold = flow.get(\"water_cold\");\nwater_hot = flow.get(\"water_hot\");\nvhn = vc_name + water_cold;\nvcn = vh_hame + water_hot;\nwater_counter = vhn + vcn;\nmsg['payload'] = water_counter;\nnode.send([msg]);\n","outputs":1,"noerr":0,"x":792.8333625793457,"y":444.6666431427002,"wires":[["80435cd6.ace54"]]},{"id":"80435cd6.ace54","type":"blynk-api-out-email","z":"da66859c.abc4c8","name":"","x":795.0000076293945,"y":520.0000133514404,"wires":[]},{"id":"54e6c737.26fcc8","type":"mqtt-broker","z":"","broker":"127.0.0.1","port":"1883","clientid":"nodered","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","willTopic":"","willQos":"0","willPayload":""}]

 

scr.jpg

Изменено пользователем svchekalin

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что-то у меня не получилось, залил скетч в nodemcu все ок, но постоянно мигает лампочка и в Мониторинг порту это:

>>>stack>>>

ctx: cont
sp: 3ffffda0 end: 3fffffc0 offset: 01b0
3fffff50:  00000000 ff000000 00000200 402037a9  
3fffff60:  3ffe891b 00000051 3fffff40 3ffee854  
3fffff70:  3ffee7ec 3ffe84df 3ffe84de 40100426  
3fffff80:  3ffee7ec 3ffee7c0 3ffee68c 4020185c  
3fffff90:  feefeffe feefeffe feefeffe feefeffe  
3fffffa0:  3fffdad0 00000000 3ffee824 40204208  
3fffffb0:  feefeffe feefeffe 3ffe850c 40100711  
<<<stack<<<

 ets Jan  8 2013,rst cause:2, boot mode:(3,7)

load 0x4010f000, len 1384, room 16 
tail 8
chksum 0x2d
csum 0x2d
v8b899c12
~ld

Нет сохраненных показаний счетчиков
Горячая: 0
Холодная: 0
Контрольная сумма: 0x0
ISR not in IRAM!

Abort called

Что не так я делаю ?

Изменено пользователем emaus

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В код нужно добавить две строчки:

void ICACHE_RAM_ATTR HSignal();
void ICACHE_RAM_ATTR CSignal();

 

Такая правка нужна для ардуино старше 2.5.0. для исправления ошибки 

ISR not in IRAM!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тема для нас очень интересная. Готовы участвовать в разработке полноценного учета не только водяных счетчиков, но и электрических с импульсным выходом. Kitsum  прошу откликнуться !!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пожалуйста, войдите для комментирования

Вы сможете оставить комментарий после входа



Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...