Уже достаточно давно я не писал на тему Arduino – как-то со временем не складывалось. Месяц назад знакомый решил установить водосчетчики, но, ввиду очень неудобно расположенных вводов труб в квартиру, считывать их показания приходилось чуть ли не с фонарем и в крайне неудобной позе. Возник вопрос – а можно ли как-то вывести показания с них на более удобное место или, в дальнейшем, автоматизировать сбор и отправку данных? Дело осложнялось тем, что нужен был бюджетный вариант (не более 1000 рублей) и в крайне короткие сроки. Я решил помочь, и вот что из этого получилось.

Что мы хотим получить:
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 рублей.

Итого, менее чем за 1000 рублей мы можем собрать довольно удобное устройство для считывания и хранения показаний счетчиков воды.
Подключаем Arduino к счетчикам воды
Принцип работы импульсных счетчиков
На данный момент большинство счетчиков воды снабжены импульсными выходами. Если у вашего такого выхода нет – советую при следующей поверке озаботится их заменой на импульсные. Тем более что, как это ни странно, цена импульсных счетчиков обычно не отличается от простых той же модели (правда, встречал варианты с разницей цены в 100 рублей). Визуально такие счетчики отличаются наличием двухжильного провода. Собственно, внутри счетчика провод подключен к геркону и при проходе через счетчик очередных 10 литров геркон замыкается, а при проходе еще трех – размыкается. Как раз момент замыкания мы и будем ловить.
Описание принципов работы и подключения блока
Импульсные выводы счетчиков подключаем через клемники к нашей Arduino. При замыкании соответствующего выхода счетчик десятков литров увеличивается, соответственно, на 10, а при наборе 1000 литров – обнуляется счетчик литров и увеличивается на 1 счетчик кубометров. Все данные сразу же пишутся в энергонезависимую память EEPROM для того, чтобы при потере питания нам не пришлось бы выставлять начальные значения счетчиков заново.
Затем, при включенном дисплее (дисплей включается по кнопке примерно на 30 секунд) на экран выдаются обновленные значения показаний.
Код
В отличие от предыдущих постов я не буду приводить код прошивки, а остановлюсь только на наиболее важных моментах, которые могут понадобиться при настройке.
Первый запуск, Обязательные параметры
При первом запуске нам надо установить ряд параметров, чтобы считыватель счетчиков верно работал. Таких параметра всего два:

1. Текущее время.
Для автоматической установки времени с компьютера при прошивке микроконтроллера установите значение константы SETTIME в 1 (строка 65). После прошивки и перезапуска, когда время будет установлено, верните значение константы в 0 и прошейте микроконтроллер заново – время будет сохранено в модуле RTC и не потребует повторной установки при пропадании питания. Если все же время не восстановилось после отключения – возможно у Вас разряжена батарея, установленная на модуле RTC: проверьте, при необходимости замените ее и заново установите время через константу SETTIME.

2. Базовые показания счетчиков горячей и холодной воды.
Для этого существуют два массива в строках 30 и 31:
Подключаем Arduino к счетчикам воды
В CounterHighBase содержатся показания кубометров для обоих счетчиков (сначала для холодной, потом для горячей воды), в CounterLowBase – показания для литров (то, что на вашем счетчике обычно обозначается красными цифрами). По умолчанию, если эти значения равны нулям, они берутся из энергонезависимой памяти. Если же любое из этих четырех значений отлично от нуля – оно записывается в память и далее будет считаться как базовое при следующем запуске. Например, если Вам надо при первой установке запомнить уже существующие счетчиков (допустим 01342,234 на счетчике горячей воды и 01637,110 на счетчике холодной), то эти две строки будут выглядеть следующим образом:
Подключаем Arduino к счетчикам воды
Обратите внимание, что лидирующие нули не пишутся – по стандартам языка С с нуля начинается число в восьмеричной системе счисления. После заливки прошивки с этими значениями в 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 к счетчикам воды
Что дальше?
Как я уже сказал, данный скетч разрабатывался с целью дать возможность легко подключать и отключать функциональные модули. Например, воспользовавшись одним из моих предыдущих постов, Вы легко сможете модифицировать код так, чтобы данные, считанные со счетчиков передавались по радиоканалу на другую Arduino, допустим, подключенную к локальной сети, а оттуда выводились в базу данных или на веб-страницу. Также, подключив GSM-модем или GSM-модуль организовать автоматическую передачу данных, например, в Вашу управляющую компанию. Работа c GSM-модулем или модемом мной еще не описывалась и может быть рассмотрена позднее в отдельном посте.
Ссылки на компоненты, используемые в данном устройстве.
Как уже стало традицией, ниже приведены ссылки на всем известный китайский магазин, где эти компоненты можно заказать.

1. Arduino Nano: Рекомендовал бы вариант вариант с MicroUSB – визуально качество изготовления лучше.
a. C MiniUSB:
b. С MicroUSB:

2. Макетная плата: .

3. Часы DS1307: . Прошу обратить внимание – в этом лоте их 10 штук. Если нужны только для этой задачи, то лучше не переплачивать и купить одну штуку у другого продавца.

4. Дисплеи:
a. LCD 2004 I2C:
b. LCD 1602 I2C:
c. LCD 1602 без I2C:
d. LCD 2004 без I2C:
e. I2C-модуль:

5. Соединительные провода
a. Шлейф из 40 штук 10 см:
b. Набор перемычек – 140 штук разных размеров :

6. Клемники – 100 штук в упаковке: . Если нужны всего две – ищите у другого продавца, например вот:

7. Тактовая кнопка: . Если нужна всего одна – ищите у другого продавца.

8. Модуль питания MB-102:

9. Если Вы первый раз столкнулись со сборкой чего-то на Arduino, то проще всего будет сразу купить вот такой комплект , чем искать компоненты по отдельности.
Вместо послесловия или к тем, кто задался вопросом “Зачем это вообще здесь?”
1. Да, я видел кучу статей на тему “подключаем счетчики к микроконтроллерам”. Но данная статья рассчитана именно на новичков, по возможности я попытался написать ее так, чтобы человек, мало знакомый с микроконтроллерами все же смог вынести из нее какую-то пользу.

2. Да, я знаю о ESP8266, STM32 и прочих. Но данная статья именно про Arduino (К любителям работать напрямую с мк Atmel это тоже относится).

3. Да, я знаю, что вы напишете код лучше. Но, очевидно, этот код работает, и работает достаточно хорошо (по крайней мере выполняет свои функции). Хотите улучшить? Флаг Вам в руки, никто не помешает это сделать.
В конце традиционно даю ссылку на архив с библиотеками, кодом и схемой самого блока:
И вопрос к подписчикам: делать пост про управление Arduino через GSM? Или информации, наличествующей в сети достаточно?