Дистанционное снятие показаний счетчиков воды arduino
Добрый вечер!
Я нуб! И в программировании и железки собирать, но есть желание разобраться по быстрому))) стал собирать на Arduino nano счётчик с выводом на дисплей, но не очень понял, как это работает((( вроде и схема есть и картинка, не получается ((((
Помогите пошаговой инструкцией или ссылку на тему . Ну очень надо)))
Собирать стал по следующей инструкции
1. Читать показания со счетчика горячей и холодной воды их состояние и выводить их на экран;
2. Хранить состояние счетчиков в энергонезависимой памяти микроконтроллера на случай пропадания питания;
3. Предусмотреть возможность корректировки показаний;
4. Предусмотреть возможность масштабирования (например, если в будущем мы захотим передавать данные по радиоканалу).
Что нам понадобится:
1. Arduino Nano - 1 шт.
120-170 рублей.
2. Беспаечная макетная плата размера Half+ (хотя, подойдет и большая) – 1 шт.
70 рублей.
3. ЖК-дисплей 2004 или 1602 с I2C-модулем. Если у Вас уже есть такой дисплей без I2С, то можно купить отдельно модуль и подключить его к дисплею. Да и, в принципе, можно обойтись без I2C – но в этом случае существенно увеличится количество проводов. Различие между 2004 и 1602 только в количестве строк и символов: 20x4 и 16x2 соответственно. Можем использовать любой, но я бы рекомендовал 2004 – на него еще и часы выведем) – 1 шт.
350 рублей за 2004 с I2C
4. Модуль часов реального времени. В моем случае использую DS1307. – 1 шт.
45 рублей.
5. Соединительные провода male-male или перемычки – примерно 20 штук длиной около 10 см.
50-140 рублей. Если жаба не подписывает – можно купить моток одножильного тонкого провода и нарезать самим.
6. Клемники для подключения импульсных выводов счетчиков – 2 шт.
10 рублей
7. Тактовая кнопка для включения подсветки дисплея с колпачком на нее – 1 шт.
20 рублей
8. Необязательно: Модуль питания, позволяющий подключить обычный сетевой адаптер 6-12 вольт. Если Вы будете использовать питание через USB или от батареи – то без него можно обойтись. 1 шт.
80 рублей.
9. Необязательно: Предусмотрите коробку, в которой разместите собранный блок. По моему опыту одним из лучших вариантов является бокс для монтажа электрощитков. Размер и стоимость их колеблются от 50 до 700 рублей.
Подключаем Arduino к счетчикам воды
Уже достаточно давно я не писал на тему Arduino – как-то со временем не складывалось. Месяц назад знакомый решил установить водосчетчики, но, ввиду очень неудобно расположенных вводов труб в квартиру, считывать их показания приходилось чуть ли не с фонарем и в крайне неудобной позе. Возник вопрос – а можно ли как-то вывести показания с них на более удобное место или, в дальнейшем, автоматизировать сбор и отправку данных? Дело осложнялось тем, что нужен был бюджетный вариант (не более 1000 рублей) и в крайне короткие сроки. Я решил помочь, и вот что из этого получилось.
Что мы хотим получить:
1. Читать показания со счетчика горячей и холодной воды их состояние и выводить их на экран;
2. Хранить состояние счетчиков в энергонезависимой памяти микроконтроллера на случай пропадания питания;
3. Предусмотреть возможность корректировки показаний;
4. Предусмотреть возможность масштабирования (например, если в будущем мы захотим передавать данные по радиоканалу).
Что нам понадобится:
1. Arduino Nano - 1 шт.
2. Беспаечная макетная плата размера Half+ (хотя, подойдет и большая) – 1 шт.
3. ЖК-дисплей 2004 или 1602 с I2C-модулем. Если у Вас уже есть такой дисплей без I2С, то можно купить отдельно модуль и подключить его к дисплею. Да и, в принципе, можно обойтись без I2C – но в этом случае существенно увеличится количество проводов. Различие между 2004 и 1602 только в количестве строк и символов: 20x4 и 16x2 соответственно. Можем использовать любой, но я бы рекомендовал 2004 – на него еще и часы выведем) – 1 шт.
350 рублей за 2004 с I2C
4. Модуль часов реального времени. В моем случае использую DS1307. – 1 шт.
5. Соединительные провода male-male или перемычки – примерно 20 штук длиной около 10 см.
50-140 рублей. Если жаба не подписывает – можно купить моток одножильного тонкого провода и нарезать самим.
6. Клемники для подключения импульсных выводов счетчиков – 2 шт.
7. Тактовая кнопка для включения подсветки дисплея с колпачком на нее – 1 шт.
8. Необязательно: Модуль питания, позволяющий подключить обычный сетевой адаптер 6-12 вольт. Если Вы будете использовать питание через USB или от батареи – то без него можно обойтись. 1 шт.
9. Необязательно: Предусмотрите коробку, в которой разместите собранный блок. По моему опыту одним из лучших вариантов является бокс для монтажа электрощитков. Размер и стоимость их колеблются от 50 до 700 рублей.
Итого, менее чем за 1000 рублей мы можем собрать довольно удобное устройство для считывания и хранения показаний счетчиков воды.
Принцип работы импульсных счетчиков
На данный момент большинство счетчиков воды снабжены импульсными выходами. Если у вашего такого выхода нет – советую при следующей поверке озаботится их заменой на импульсные. Тем более что, как это ни странно, цена импульсных счетчиков обычно не отличается от простых той же модели (правда, встречал варианты с разницей цены в 100 рублей). Визуально такие счетчики отличаются наличием двухжильного провода. Собственно, внутри счетчика провод подключен к геркону и при проходе через счетчик очередных 10 литров геркон замыкается, а при проходе еще трех – размыкается. Как раз момент замыкания мы и будем ловить.
Описание принципов работы и подключения блока
Импульсные выводы счетчиков подключаем через клемники к нашей Arduino. При замыкании соответствующего выхода счетчик десятков литров увеличивается, соответственно, на 10, а при наборе 1000 литров – обнуляется счетчик литров и увеличивается на 1 счетчик кубометров. Все данные сразу же пишутся в энергонезависимую память EEPROM для того, чтобы при потере питания нам не пришлось бы выставлять начальные значения счетчиков заново.
Затем, при включенном дисплее (дисплей включается по кнопке примерно на 30 секунд) на экран выдаются обновленные значения показаний.
В отличие от предыдущих постов я не буду приводить код прошивки, а остановлюсь только на наиболее важных моментах, которые могут понадобиться при настройке.
Первый запуск, Обязательные параметры
При первом запуске нам надо установить ряд параметров, чтобы считыватель счетчиков верно работал. Таких параметра всего два:
1. Текущее время.
Для автоматической установки времени с компьютера при прошивке микроконтроллера установите значение константы SETTIME в 1 (строка 65). После прошивки и перезапуска, когда время будет установлено, верните значение константы в 0 и прошейте микроконтроллер заново – время будет сохранено в модуле RTC и не потребует повторной установки при пропадании питания. Если все же время не восстановилось после отключения – возможно у Вас разряжена батарея, установленная на модуле RTC: проверьте, при необходимости замените ее и заново установите время через константу SETTIME.
2. Базовые показания счетчиков горячей и холодной воды.
Для этого существуют два массива в строках 30 и 31:
В CounterHighBase содержатся показания кубометров для обоих счетчиков (сначала для холодной, потом для горячей воды), в CounterLowBase – показания для литров (то, что на вашем счетчике обычно обозначается красными цифрами). По умолчанию, если эти значения равны нулям, они берутся из энергонезависимой памяти. Если же любое из этих четырех значений отлично от нуля – оно записывается в память и далее будет считаться как базовое при следующем запуске. Например, если Вам надо при первой установке запомнить уже существующие счетчиков (допустим 01342,234 на счетчике горячей воды и 01637,110 на счетчике холодной), то эти две строки будут выглядеть следующим образом:
Обратите внимание, что лидирующие нули не пишутся – по стандартам языка С с нуля начинается число в восьмеричной системе счисления. После заливки прошивки с этими значениями в Arduino, нам надо перезапустить микроконтроллер и убедиться что значения попали в память (в этом нам поможет константа DEBUG или просто посмотрите на подключенный экран). Затем выставляем эти значения обратно в нули и заново перепрошиваем микроконтроллер.
Следующие параметры не нуждаются в обязательной модификации и понадобятся Вам, например, в том случае, если Вы решили убрать или добавить какой-то модуль, а также если Вы, в силу каких-то причин, не смогли или не захотели использовать полностью аналогичные указанным в схеме компонентам:
1. За настройку параметров экрана отвечают следующие константы:
LED_DELAY – время в миллисекундах, через которое экран будет автоматически гаснуть.
MOD_LCD_AUTO_OFF – По умолчанию установлен в 1. Если сбросить эту константу в 0, то автоотключение экрана будет недоступно, экран будет гореть до тех пот, пока мы не нажмем на кнопку включения/выключения экрана.
LCD_COL и LCD_ROW – Устанавливает количество строк и символов в строке на LCD-дисплее. Если количество строк больше двух, то в последней строке будет отображаться текущая дата и время.
2. Константы MOD_LCD и MOD_RTC – отвечают LCD-дисплей и часы реального времени. По умолчанию установлены в 1(включено). Если выставим MOD_LCD в 0, то информация на дисплей выдаваться не будет, но будет обрабатываться и сохраняться в памяти. Для чего это надо? Ну, например, если мы будем передавать данные со счетчиков по радиоканалу на некий приемник (как организовывать радиоканал я описывал в одном из предыдущих постов) – в этом случае для уменьшения потребления энергии дисплей мы можем отключить.
Константа MOD_RTC во включенном состоянии (1) указывает, что в системе присутствует модуль часов реального времени. Все данные, полученные со счетчиков будут запоминаться с учетом времени изменения. Также при отключении питания часы не надо будет выставлять заново. При отключенных часах этот функционал будет недоступен.
3. Константа DEBUG. По умолчанию выключена. Если включить ее (установить в 1) то, при подключении к компьютеру через USB-порт, лог событий можно будет просматривать в реальном времени (например, через “Монитор порта” в ArduinoIDE).
4. Константы BUTTON_PIN, HOT_COUNTER_PIN, COLD_COUNTER_PIN указывают, к каким выходам Arduino подключены кнопка выключения дисплея, счетчики горячей и хоодной воды.
Итого, если Вы соберете схему в точности с представленной в данном посте, Вам, для успешного запуска будет достаточно двух вещей:
1. Правильно установить время;
2. Установить значения счетчиков на момент подключения.
В результате у нас получается вот такое устройство:
Как я уже сказал, данный скетч разрабатывался с целью дать возможность легко подключать и отключать функциональные модули. Например, воспользовавшись одним из моих предыдущих постов, Вы легко сможете модифицировать код так, чтобы данные, считанные со счетчиков передавались по радиоканалу на другую Arduino, допустим, подключенную к локальной сети, а оттуда выводились в базу данных или на веб-страницу. Также, подключив GSM-модем или GSM-модуль организовать автоматическую передачу данных, например, в Вашу управляющую компанию. Работа c GSM-модулем или модемом мной еще не описывалась и может быть рассмотрена позднее в отдельном посте.
Ссылки на компоненты, используемые в данном устройстве.
Как уже стало традицией, ниже приведены ссылки на всем известный китайский магазин, где эти компоненты можно заказать.
1. Arduino Nano: Рекомендовал бы вариант вариант с MicroUSB – визуально качество изготовления лучше.
5. Соединительные провода
Вместо послесловия или к тем, кто задался вопросом “Зачем это вообще здесь?”
1. Да, я видел кучу статей на тему “подключаем счетчики к микроконтроллерам”. Но данная статья рассчитана именно на новичков, по возможности я попытался написать ее так, чтобы человек, мало знакомый с микроконтроллерами все же смог вынести из нее какую-то пользу.
2. Да, я знаю о ESP8266, STM32 и прочих. Но данная статья именно про Arduino (К любителям работать напрямую с мк Atmel это тоже относится).
3. Да, я знаю, что вы напишете код лучше. Но, очевидно, этот код работает, и работает достаточно хорошо (по крайней мере выполняет свои функции). Хотите улучшить? Флаг Вам в руки, никто не помешает это сделать.
В конце традиционно даю ссылку на архив с библиотеками, кодом и схемой самого блока:
И вопрос к подписчикам: делать пост про управление Arduino через GSM? Или информации, наличествующей в сети достаточно?
Автоматизация снятия показаний со счетчиков воды
Все знают, что лень двигатель прогресса. Так случилось и в моем случае.
В квартире присутствует 6 точек раздачи воды (3 холодные и 3 горячие). На каждой из точек стоит счетчик.
Каждые 2 счетчика спрятаны за люками скрытого монтажа, один из люков находится за зеркалом, которое нужно снять, чтобы до него добраться.
Раз в месяц с 20 по 25 число необходимо снимать показания со всех счетчиков и отправлять данные в Управляющую Компанию на бланке определенного образца.
В какой-то момент мне надоело открывать люки, снимать зеркало и было решено автоматизировать снятие показаний.
Вот, для примера, пара люков (открытый и закрытый):
Сначала перерыл интернет на предмет существующих устройств автоматизации. Нашел только один для меня подходящий — Счетчик импульсов-регистратор «Пульсар» 6-ти канальный. Надо сказать, что стоит он почти 6000 рублей! На самом деле в розницу нигде я его не видел, так как слишком специфический продукт и предполагается, что закупать их будут ТСЖ на все квартиры в доме. Попытался его заказать через интернет в разных местах, но каждый раз, как только доходило до доставки, продавец пропадал. Как я понял, они не любят работать с «физиками», либо был не слишком настойчив.
Ну, нет, так нет — сделаем сами, да еще и дешевле.
Тут то и пригодилась Arduino Mega 2580 с Ethernet модулем, которая была когда-то куплена для различных экспериментов.
Когда делали ремонт в квартире, от каждой точки, где имеются счетчики, до щитка на лестничной клетке, были проложены кабели типа UTP cat 5e. Это было одно из требований контролирующей организации, чтобы в будущем снимать все показания централизованно. Будущее все никак не наступает, а провода пригодились.
Дополнительно из слаботочного щитка квартиры до щитка на лестничной клетке, было проложено много витых пар (для нескольких каналов интернета, телефон, домофон, резерв и прочее), и как раз нашлась парочка свободных, чтобы сигналы от счетчиков завести в назад в квартиру, а оттуда в шкаф с домашним сетевым оборудованием.
Экспериментальным путем было определено, что счетчики работают не просто, а очень просто. Когда последний разряд меняет свое значение с 9 на 0, замыкается геркон внутри счетчика и это значит, что утекло еще 10 литров воды. В таком состоянии он находится до того, пока значение последнего разряда не станет равным 3. Т.е. фактически нам надо фиксировать момент перехода из состояния «разомкнуто» в состояние «замкнуто». Заострю внимание, что мы фиксируем ТОЛЬКО факт перехода из одного состояния в другое, потому что система может обесточиться, да и вообще, мало ли какие могут быть коллизии.
Скетч Arduino с комментариями:
Mysql база с одной таблицей:
В таблице есть только два поля. Первое — название объекта (в нашем случае это номер счетчика). Второе — дата и время в формате TIMESTAMP, которые заполняются автоматически, когда происходит вставка строки.
Вот, собственно, и все. Теперь в любой момент я могу узнать какое значение имеют все счетчики, просто зайдя браузером на домашний сервер.
Что дальше?
Дальше хочется ежемесячную автоматическую распечатку на заполненном бланке.
Так же хочется подключить счетчик электроэнергии с передачей данных в Мосэнергосбыт, а потом и с их оплатой.
Статистика, графики и прочие радости работы с данными.
Подключаем Arduino к счетчикам воды
Уже достаточно давно я не писал на тему Arduino – как-то со временем не складывалось. Месяц назад знакомый решил установить водосчетчики, но, ввиду очень неудобно расположенных вводов труб в квартиру, считывать их показания приходилось чуть ли не с фонарем и в крайне неудобной позе. Возник вопрос – а можно ли как-то вывести показания с них на более удобное место или, в дальнейшем, автоматизировать сбор и отправку данных? Дело осложнялось тем, что нужен был бюджетный вариант (не более 1000 рублей) и в крайне короткие сроки. Я решил помочь, и вот что из этого получилось.
Что мы хотим получить:
1. Читать показания со счетчика горячей и холодной воды их состояние и выводить их на экран;
2. Хранить состояние счетчиков в энергонезависимой памяти микроконтроллера на случай пропадания питания;
3. Предусмотреть возможность корректировки показаний;
4. Предусмотреть возможность масштабирования (например, если в будущем мы захотим передавать данные по радиоканалу).
Что нам понадобится:
1. Arduino Nano - 1 шт.
2. Беспаечная макетная плата размера Half+ (хотя, подойдет и большая) – 1 шт.
3. ЖК-дисплей 2004 или 1602 с I2C-модулем. Если у Вас уже есть такой дисплей без I2С, то можно купить отдельно модуль и подключить его к дисплею. Да и, в принципе, можно обойтись без I2C – но в этом случае существенно увеличится количество проводов. Различие между 2004 и 1602 только в количестве строк и символов: 20x4 и 16x2 соответственно. Можем использовать любой, но я бы рекомендовал 2004 – на него еще и часы выведем) – 1 шт.
350 рублей за 2004 с I2C
4. Модуль часов реального времени. В моем случае использую DS1307. – 1 шт.
5. Соединительные провода male-male или перемычки – примерно 20 штук длиной около 10 см.
50-140 рублей. Если жаба не подписывает – можно купить моток одножильного тонкого провода и нарезать самим.
6. Клемники для подключения импульсных выводов счетчиков – 2 шт.
7. Тактовая кнопка для включения подсветки дисплея с колпачком на нее – 1 шт.
8. Необязательно: Модуль питания, позволяющий подключить обычный сетевой адаптер 6-12 вольт. Если Вы будете использовать питание через USB или от батареи – то без него можно обойтись. 1 шт.
9. Необязательно: Предусмотрите коробку, в которой разместите собранный блок. По моему опыту одним из лучших вариантов является бокс для монтажа электрощитков. Размер и стоимость их колеблются от 50 до 700 рублей.
Итого, менее чем за 1000 рублей мы можем собрать довольно удобное устройство для считывания и хранения показаний счетчиков воды.
Принцип работы импульсных счетчиков
На данный момент большинство счетчиков воды снабжены импульсными выходами. Если у вашего такого выхода нет – советую при следующей поверке озаботится их заменой на импульсные. Тем более что, как это ни странно, цена импульсных счетчиков обычно не отличается от простых той же модели (правда, встречал варианты с разницей цены в 100 рублей). Визуально такие счетчики отличаются наличием двухжильного провода. Собственно, внутри счетчика провод подключен к геркону и при проходе через счетчик очередных 10 литров геркон замыкается, а при проходе еще трех – размыкается. Как раз момент замыкания мы и будем ловить.
Описание принципов работы и подключения блока
Импульсные выводы счетчиков подключаем через клемники к нашей Arduino. При замыкании соответствующего выхода счетчик десятков литров увеличивается, соответственно, на 10, а при наборе 1000 литров – обнуляется счетчик литров и увеличивается на 1 счетчик кубометров. Все данные сразу же пишутся в энергонезависимую память EEPROM для того, чтобы при потере питания нам не пришлось бы выставлять начальные значения счетчиков заново.
Затем, при включенном дисплее (дисплей включается по кнопке примерно на 30 секунд) на экран выдаются обновленные значения показаний.
В отличие от предыдущих постов я не буду приводить код прошивки, а остановлюсь только на наиболее важных моментах, которые могут понадобиться при настройке.
Первый запуск, Обязательные параметры
При первом запуске нам надо установить ряд параметров, чтобы считыватель счетчиков верно работал. Таких параметра всего два:
1. Текущее время.
Для автоматической установки времени с компьютера при прошивке микроконтроллера установите значение константы SETTIME в 1 (строка 65). После прошивки и перезапуска, когда время будет установлено, верните значение константы в 0 и прошейте микроконтроллер заново – время будет сохранено в модуле RTC и не потребует повторной установки при пропадании питания. Если все же время не восстановилось после отключения – возможно у Вас разряжена батарея, установленная на модуле RTC: проверьте, при необходимости замените ее и заново установите время через константу SETTIME.
2. Базовые показания счетчиков горячей и холодной воды.
Для этого существуют два массива в строках 30 и 31:
В CounterHighBase содержатся показания кубометров для обоих счетчиков (сначала для холодной, потом для горячей воды), в CounterLowBase – показания для литров (то, что на вашем счетчике обычно обозначается красными цифрами). По умолчанию, если эти значения равны нулям, они берутся из энергонезависимой памяти. Если же любое из этих четырех значений отлично от нуля – оно записывается в память и далее будет считаться как базовое при следующем запуске. Например, если Вам надо при первой установке запомнить уже существующие счетчиков (допустим 01342,234 на счетчике горячей воды и 01637,110 на счетчике холодной), то эти две строки будут выглядеть следующим образом:
Обратите внимание, что лидирующие нули не пишутся – по стандартам языка С с нуля начинается число в восьмеричной системе счисления. После заливки прошивки с этими значениями в Arduino, нам надо перезапустить микроконтроллер и убедиться что значения попали в память (в этом нам поможет константа DEBUG или просто посмотрите на подключенный экран). Затем выставляем эти значения обратно в нули и заново перепрошиваем микроконтроллер.
Следующие параметры не нуждаются в обязательной модификации и понадобятся Вам, например, в том случае, если Вы решили убрать или добавить какой-то модуль, а также если Вы, в силу каких-то причин, не смогли или не захотели использовать полностью аналогичные указанным в схеме компонентам:
1. За настройку параметров экрана отвечают следующие константы:
LED_DELAY – время в миллисекундах, через которое экран будет автоматически гаснуть.
MOD_LCD_AUTO_OFF – По умолчанию установлен в 1. Если сбросить эту константу в 0, то автоотключение экрана будет недоступно, экран будет гореть до тех пот, пока мы не нажмем на кнопку включения/выключения экрана.
LCD_COL и LCD_ROW – Устанавливает количество строк и символов в строке на LCD-дисплее. Если количество строк больше двух, то в последней строке будет отображаться текущая дата и время.
2. Константы MOD_LCD и MOD_RTC – отвечают LCD-дисплей и часы реального времени. По умолчанию установлены в 1(включено). Если выставим MOD_LCD в 0, то информация на дисплей выдаваться не будет, но будет обрабатываться и сохраняться в памяти. Для чего это надо? Ну, например, если мы будем передавать данные со счетчиков по радиоканалу на некий приемник (как организовывать радиоканал я описывал в одном из предыдущих постов) – в этом случае для уменьшения потребления энергии дисплей мы можем отключить.
Константа MOD_RTC во включенном состоянии (1) указывает, что в системе присутствует модуль часов реального времени. Все данные, полученные со счетчиков будут запоминаться с учетом времени изменения. Также при отключении питания часы не надо будет выставлять заново. При отключенных часах этот функционал будет недоступен.
3. Константа DEBUG. По умолчанию выключена. Если включить ее (установить в 1) то, при подключении к компьютеру через USB-порт, лог событий можно будет просматривать в реальном времени (например, через “Монитор порта” в ArduinoIDE).
4. Константы BUTTON_PIN, HOT_COUNTER_PIN, COLD_COUNTER_PIN указывают, к каким выходам Arduino подключены кнопка выключения дисплея, счетчики горячей и хоодной воды.
Итого, если Вы соберете схему в точности с представленной в данном посте, Вам, для успешного запуска будет достаточно двух вещей:
1. Правильно установить время;
2. Установить значения счетчиков на момент подключения.
В результате у нас получается вот такое устройство:
Как я уже сказал, данный скетч разрабатывался с целью дать возможность легко подключать и отключать функциональные модули. Например, воспользовавшись одним из моих предыдущих постов, Вы легко сможете модифицировать код так, чтобы данные, считанные со счетчиков передавались по радиоканалу на другую Arduino, допустим, подключенную к локальной сети, а оттуда выводились в базу данных или на веб-страницу. Также, подключив GSM-модем или GSM-модуль организовать автоматическую передачу данных, например, в Вашу управляющую компанию. Работа c GSM-модулем или модемом мной еще не описывалась и может быть рассмотрена позднее в отдельном посте.
Ссылки на компоненты, используемые в данном устройстве.
Как уже стало традицией, ниже приведены ссылки на всем известный китайский магазин, где эти компоненты можно заказать.
1. Arduino Nano: Рекомендовал бы вариант вариант с MicroUSB – визуально качество изготовления лучше.
5. Соединительные провода
Вместо послесловия или к тем, кто задался вопросом “Зачем это вообще здесь?”
1. Да, я видел кучу статей на тему “подключаем счетчики к микроконтроллерам”. Но данная статья рассчитана именно на новичков, по возможности я попытался написать ее так, чтобы человек, мало знакомый с микроконтроллерами все же смог вынести из нее какую-то пользу.
2. Да, я знаю о ESP8266, STM32 и прочих. Но данная статья именно про Arduino (К любителям работать напрямую с мк Atmel это тоже относится).
3. Да, я знаю, что вы напишете код лучше. Но, очевидно, этот код работает, и работает достаточно хорошо (по крайней мере выполняет свои функции). Хотите улучшить? Флаг Вам в руки, никто не помешает это сделать.
В конце традиционно даю ссылку на архив с библиотеками, кодом и схемой самого блока:
И вопрос к подписчикам: делать пост про управление Arduino через GSM? Или информации, наличествующей в сети достаточно?
Счетчик воды, электричества. Arduino. TCP , Synology, PHP, MySQl.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Система учета и контроля помещения.
1.1 Система Учета и Контроля Адаптивная в дальнейшем «СУКА», (15/26 квартир) проектируется для решения следующих задач:
- Сбор показаний счетчиков: Электричества, счетчик холодной и горячей воды.
- Контроль температуры помещения.
- Контроль протечки воды.
- Контроль работоспособности кранов перекрытия воды.
- Тревоги: Протечки, Превышение комнатной температуры более 40С.
- Извещения.
- Все собранные данные должны быть переданы по локальной сети на устройство хранения информации NAS Synology 212 (в дальнейшем NAS).
- Хранение данных выполняется в базах данных Maria DB 10 (MySQL).
- На NAS развернут WEB server, который отображает:
- На первой странице: текущую температуру помещений 16 квартир. Тревоги.
- На второй странице показания счетчиков электроэнергии.
- На третьей страницы: счетчики холодной/горячей воды.
- Внизу каждой страницы графики аналитики за месяц. (за любой месяц, год).
- +1 Ошибки работы кранов перекрытия воды.
- +1 Количество перезагрузок «СУКА» или W5500 в месяц.
1.5 Каждая «СУКА» является самостоятельным WEB сервером. С возможностью чтения и записи текущих параметров.
- Термины:
- «1» - Логическая единица- +3,3-5V.
- «СУКА» - Система Учета и Контроля Адаптивная.
- «NAS» - Synology 212.
Работает автономно. Arduino раз в месяц проводит проверку работоспособности крана (см. проверка крана параграф 4).
GSM передатчик показаний счетчиков воды на базе модуля SIM800L (DIY)
Аппаратная часть
Коннектор P1 — вход для счетчиков горячей (ГВС) и холодной (ХВС) воды с общей землей.
В качестве питания идеально подойдет любой литиевый аккумулятор, т.к. GSM модуль как раз имеет диапазон входных напряжений под него — 3,4 — 4,2 В. Я использовал компактный АКБ от старого телефона Nokia.
Конденсатор С1 крайне желателен. И чем больше его ёмкость, тем лучше. Потребляемый модемом ток в импульсе достигает 2А и без конденсатора велика вероятность перезагрузки Atmega168 из-за просади напряжения (особенно если использовать старый АКБ с большим внутренним сопротивлением и/или тонкие провода).
Несмотря на то, что GSM-модуль поддерживает несколько различных режимов сна, минимальный потребляемый им ток составляет порядка 1 мА, что довольно много для устройства, рассчитанного на длительную автономную работы. Поэтому используется полевой транзистор для принудительного отключения модуля. Подойдет любой с низким пороговым напряжением открытия.
Ввиду простоты схемы и минимального количества компонентов, было решено выполнять все навесным монтажом. Итоговый вид платы на фото ниже (на фото еще нет конденсатора и используется другой полевик).
Программная часть
Большую часть времени заняло именно написание скетча, его отладка и минимизация энергопотребления устройства.
Используемые в моем случае счетчики ВСХд-15 и ВСГд-15 формируют один импульс (замыкание + размыкание геркона) на 1 л воды, при этом время замкнутого и разомкнутого состояний геркона за период примерно равны (полезный материал по теме). Алгоритм работы МК должен фиксировать замыкания/размыкания герконов с двух счетчиков, при этом фильтровать дребезг контактов. Причем делать это абсолютно независимо для двух каналов, а также минимально использовать ресурсы для экономии энергии. В итоге я пришел к следующей последовательности:
— подключаем выходы со счетчиков между двумя цифровыми пинами МК и землей;
— объявляем пины как выходы;
далее в цикле:
— подтягиваем пины к шине питания командой digitalWrite(pin, HIGH) через встроенный в Atmega168 резистор 20 кОм;
— опрашиваем состояние пинов и фиксируем изменения;
— убираем подтяжку digitalWrite(pin, LOW);
— загоняем МК в сон на 500 мс
повтор цикла.Т.е. подтяжка выходов счетчиков происходит непосредственно перед измерением на короткое время, что сильно экономит батарею.
Максимальная пропускная способность счетчика по паспорту 1л/с. То есть паузы в 500 мс как раз достаточно, чтобы не пропустить изменения состояния геркона.
Далее вышеописанный алгоритм был реализован в коде:
Я постарался максимально подробно закомментировать скетч. Помимо опроса счетчиков, в программе также реализовано измерение питающего напряжения и передача значения в СМС вместе с данными по расходу воды. Также непосредственно перед отправкой СМС текущие показания сохраняются в энергонезависимую память. Интервал отправки СМС в скетче — 1 неделя.
Итоговый вид устройства:
Расчет времени автономной работы
Используя приведенный выше код, а также отключив GSM-модуль аппаратно с помощью транзистора, мне удалось добиться среднего тока потребления вПри работе модуля, средний потребляемый ток составляет около 25-35 мА.
Также, с помощью самодельной электронной нагрузки, была измерена емкость батареи BL-6C, которая при разряде до 3,4 В составила 974 мАч:8,7 лет, что ж, неплохо! Конечно, ни о каких 8ми годах речь не идет. Саморазряд аккумулятора высадит его гораздо быстрее. Но на 2-3 года работы ориентироваться, думаю, можно.
Третью неделю устройство находится в работе. За это время получено три СМС (тестовое при установке и два интервальных). Показания совпадают со счетчиком вплоть до последнего знака. Осталось изменить интервал отправки на 1 смс в месяц и проект завершен. Напряжение на батарее за это время существенно не изменилось:
Идея: съём показаний водосчётчиков и передача "кому надо"
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Есть водомерные счётчики с импульсным выходом. Идея в том, чтобы снимать их показания и передавать раз в месяц "куда надо".
На импульс срабатывает прерывание. Пара счётчиков - два выхода - два прерывания.
Также хочется термистором мерять температуру горячей воды и всё это выводить на графики: расход и температуру. С помощью, например, RRD.
Теперь начинаются вопросы:
1) Справится ли с задачей Arduino с каким-нибудь IoT-обвесом, или без компа типа Raspberry/PI не обойтись?
2) У меня два стояка и, соответственно, две пары счётчиков. Но у Arduino Uno только 2 пина под прерывания. Брать ли ещё один Uno, чтобы держать их рядом со счётчиками, или взять что-то с 4+ прерываниями?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
RRD ардуина не потащит.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Значит, Raspberry нужен, или есть ещё что-то подобное?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
OrangePi, ещё там какие-то бананы.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Tatinek пишет: передавать раз в месяц "куда надо". "Где надо" у Вас не примут данные от несертифицированного устройства. Разве что, Вы будете переписывать на бумажку и передавать "куда надо" вручную.- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
На перефирии и емэйлом и вайбером показания принимают. Главное - бота завести правильного и не попасть в ситуацию, когда он 800 кубометров за месяц передаст.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
"Где надо" у Вас не примут данные от несертифицированного устройства. Разве что, Вы будете переписывать на бумажку и передавать "куда надо" вручную.
Будем решать проблемы по мере поступления. Даже если не придётся лазить за показаниями по сантехшкафам, и то хорошо.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Есть водомерные счётчики с импульсным выходом. Идея в том, чтобы снимать их показания и передавать раз в месяц "куда надо".
На импульс срабатывает прерывание. Пара счётчиков - два выхода - два прерывания.
Также хочется термистором мерять температуру горячей воды и всё это выводить на графики: расход и температуру. С помощью, например, RRD.
Теперь начинаются вопросы:
1) Справится ли с задачей Arduino с каким-нибудь IoT-обвесом, или без компа типа Raspberry/PI не обойтись?
2) У меня два стояка и, соответственно, две пары счётчиков. Но у Arduino Uno только 2 пина под прерывания.
вроде бы 23?Другой вопрос: что будет делать система при временном отсутствии электропитания? Насколько адекватными будут показания при нескольких отключениях в месяц?
смотреть показания счетчика воды
Кстати – это уже второе видео про счётчики воды. В первом я рассказывал как вывести показания воды на дисплей и сохранять данные во внутренней памяти Ардуино. Но тот урок показался подписчикам довольно сложным и меня попросили сделать что-нибудь попроще.
Вот вариант попроще. Как говорится "Лень – двигатель прогресса".
Если вы не знаете как работать с модулем WIFI ESP8266, то обязательно посмотрите предыдущее видео, там подробно всё рассказано.
Для работы нам понадобятся импульсные счётчики воды, то есть те из которых выходят 2 провода, а то что они болтаются без дела. И если эта тема вам интересна, то пишите в комментариях и я буду продолжать её усовершенствовать. Есть задумки что ещё можно сделать.
Принцип работы этого счётчика прост. При прохождении круга магнит замыкает контакты геркона и вот в этот момент мы и будем снимать показания со счётчика.
В принципе это обычная кнопка и работать мы будем с ней как с кнопкой. Примеры работы с кнопками можно посмотреть здесь.Какие данные мы будем выводить.
Так как нам нужно сдавать только кубометры, то и выводить будем только их. Я их сделал побольше чтобы можно было легко увидеть. Так же я их сделал разными цветами. Горячая вода – Красный, холодная вода- Синий.
На счётчике это 5 цифр. Чтобы не перегружать память я сделал переменные типа int, поэтому можно выводить цифры от 0 до 65535.
Но практика говорит, что вы не сможете использовать столько воды. Раньше счётчик сломается или придёт время его менять. Но если вам принципиально, то вы можете использовать переменные других значений и сохранять большее количество цифр.Давайте сначала посмотрим как это всё работает.
Сначала надо открыть браузер и ввести IP адрес что был присвоен вашему модулю ESP. Как это сделать рассказано в предыдущем видеоуроке.
На экране отобразятся 2 счётчика и на обоих будут значения ноль.
Имитировать счётчик я буду замыкая провода на землю.
В скетче я прописал, что к выводу 2 будет подключен счётчик горячей воды, а к четвёртому я подключил холодный.
Ещё я в скетче прописал небольшую задержку при срабатывании. Это необходимо потому, что счётчик – это не кнопка, и нажатие происходит очень медленно и дребезг контактов здесь очень заметен.
Так же я сделал обновление страницы в браузере что бы видеть результат сразу на экране. В реальной жизни это можно убрать, так как цифры меняться будут очень редко и вы не будете держать свой телефон во включенном состоянии так долго.
Для особо внимательных объясняю, что мигание светодиода на модуле WIFI происходит потому, что он подключен ко 2 выводу, как и горячая вода. Если вас это напрягает, то можете поменять вывод на другой, например пятый.
Это мы с эмулировали подключение к новому счётчику, но у вас может быть уже установленный счётчик и вы захотите подключиться к нему.
Для этого я предусмотрел в скетче пару переменных которым можно задать начальные значения. И установив их, вы запустите счётчик не с нуля, а с этих значений.
Давайте например вставим такие значения. Я выбрал вот такие. Через пару кликов мы сможем увидеть как обновляются большие цифры. Сотни и тысячи.
Как видите всё работает.Скетч для скачивания доступен Активным пользователям канала. Если вы хотите скачать этот скетч, то вам надо посмотреть полностью 5 последних видео и оставить под ними комментарии. Написать мне, и я вышлю ссылку на скетч.
Прошу меня понять. На каждое видео у меня уходит около недели и всё свободное время, а так же использование различных модулей, которые я покупаю на свои деньги, а вам всего лишь надо включить(и не обязательно смотреть) и написать комментарии. Это не так уж и сложно.
Вот и закончилось ещё одно видео. У меня есть ещё огромные планы и интересные уроки. Так что подписывайтесь, и нажимайте колокольчик чтобы не пропустит. А пока вы можете посмотреть вот эти видео. В конце каждого видеоурока я даю ссылки на видео со схожей тематикой. И рекомендую их посмотреть.Вот здесь показана схема соединения для прошивки кода. Как я говорил ранее, прошивать можно с помощью специального контроллера или с помощью Ардуино. Так как не у всех может быть контроллер поэтому мы будем использовать Ардуино.
RX Ардуино соединяем с RX на модуле
А TX с TX. То есть напрямую, а вот если прошивать с помощью контроллера, то соединять надо крест-накрест.
Ещё желательно использовать резистивный делитель напряжения, так как логика модуля работает от напряжения 3,3 вольт, а Ардуино от 5 вольт. И чтобы не сжечь модуль надо согласовать выходы.
И при прошивке надо нулевой вывод модуля соединить с землёй. И обязательно до подачи питания. А после прошивки отсоединить нулевой контакт от земли. И делать это надо при отключенном питании.Читайте также: