Рубрики
Схемы на Arduino

Умный измеритель электроэнергии на ESP12 и Arduino

Все мы знакомы со счетчиками электроэнергии, которые установлены сейчас в каждой квартире или домохозяйстве. Обычно мы смотрим их показания один раз в месяц когда заполняем квитанции на оплату коммунальных услуг. Но иногда количество потребленной электроэнергии становится для нас неожиданностью – мы обнаруживаем что потребили ее очень много. Поэтому в данной статье мы рассмотрим проект умного измерителя электроэнергии на ESP12 и Arduino, который будет информировать нас по SMS/E-mail когда количество потребленной энергии будет достигать определенного значения (границы). Данный проект относится к так называемой концепции интернета вещей (IoT – Internet of Things).

Рассматриваемый в данном проекте измеритель электроэнергии будет не только передавать вам SMS/Email при наступлении определенных ситуаций, но также с его помощью вы можете контролировать потребление электроэнергии из любой точки земного шара (где есть интернет). Для измерения электроэнергии мы будем использовать датчик тока ACS712.

Для передачи информации по WiFi мы будем использовать модуль ESP8266, а контроль потребления электроэнергии будем осуществлять с помощью приложения для Android.

Необходимые компоненты

  1. Плата Arduino Uno (купить на AliExpress).
  2. ESP12/NodeMCU (устройство управления многосторонней связью) (купить на AliExpress).
  3. ACS712-30Amp Current sensor (датчик тока) (купить на AliExpress).
  4. Любой потребитель электроэнергии переменного тока.
  5. Male-Female Wires (соединительные провода папа-мама).

Принцип работы датчика тока ACS712

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

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

Основным достоинством датчика тока ACS712 является то, что он может измерять как переменный (AC), так и постоянный ток (DC) и он также обеспечивает изоляцию между нагрузкой и измерительным устройством (в нашем случае это будет плата Arduino. Как показано на следующем рисунке, датчик тока ACS712 имеет три контакта – Vcc (питающее напряжение), Vout (выход) и Ground (земля).

Слева на рисунке показаны два контакта, которые подсоединяются к тому месту, где необходимо измерить ток. Датчик работает от напряжения +5V – его необходимо подать на контакт Vcc датчика. Контакт Ground датчика необходимо подсоединить к земле схемы. Если сила измеряемого тока равна нулю, то на выходном контакте датчика напряжение равно 2500mV, если протекающий ток положителен, то напряжение на выходе датчика будет больше 2500mV, если отрицателен – то меньше 2500mV.

Для считывания напряжения с этого контакта мы будем использовать один из аналоговых входов Arduino – на выходе его АЦП (аналогово-цифровой преобразователь) будет значение 512 когда на входе контакта будет напряжение 2500mV – то есть когда ток не протекает. Это значение будет уменьшаться когда ток будет протекать в обратном (отрицательном) направлении, и увеличиваться когда ток будет протекать в прямом (положительном) направлении. В следующей таблице представлены примеры значений на выходе АЦП аналогового контакта Arduino в зависимости от величины протекающего через датчик тока.

Эти значения были рассчитаны на основе даташита на датчик ACS712. Вы их также можете рассчитать по следующим формулам:

Vout Voltage(mV) = (ADC Value/ 1023)*5000
Ток через проводник (A) = (Vout(mv)-2500)/185

Работа схемы

Схема измерителя электроэнергии на основе ESP12 и Arduino представлена на следующем рисунке.

Для модуля ESP12/NodeMCU необходимо сделать следующие соединения:

  • подсоединить контакт Rx ESP12 к контакту Tx платы Arduino;
  • подсоединить контакт Tx ESP12 к контакту Rx платы Arduino.

У NodeMCU (ESP12) нет аналоговых контактов, поэтому для связи с данным модулем мы использовали порт последовательной связи. Но данный модуль работает с напряжениями 3.3 Вольта, поэтому чтобы не повредить его напряжением 5 В с контактов Arduino мы использовали делитель напряжения.

Выходной контакт датчика тока в схеме подключен к аналоговому контакту A0 платы Arduino.

Внешний вид собранной схемы показан на следующем рисунке.

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

  1. Зарегистрировать себе аккаунт на AdaFruit для хранения и считывания данных потребления электроэнергии.
  2. Создать Applet (прикладную программу) в сервисе IFTTT для формирования сообщений при помощи SMS/Email.
  3. Написать коды программ для Arduino и ESP12 Wi-Fi модуля.

Более подробно все эти процессы описаны далее в статье.

Регистрация аккаунта в AdaFruit

Здесь вам необходимо выполнить следующие шаги:

Шаг 1. Зарегистрировать аккаунт на Adafruit IO или войти в свой аккаунт если вы там уже зарегистрированы.

Шаг 2. Кликните на My account -> Dashboard.

Шаг 3. Кликните на Actions и создайте новую приборную доску (Dashboard).

Шаг 4. Введите имя и название для вашего проекта и нажмите Create (создать).

Шаг 5. Нажмите на Key button (кнопка с изображением ключа – см. рисунок) и запишите ключи, которые предоставит вам этот сервис (см. рисунок). Далее эти ключи будут использоваться в коде программы.

Шаг 6. Кликните на кнопку ‘+’ чтобы создать новый блок и кликните на Gauge (масштаб) чтобы отобразить уровень расходования электроэнергии. Вы можете использовать простое текстовое поле для отображения этой информации.

Шаг 7. Далее введите имя фида (Name of Feed) и нажмите на Create (создать). Затем выберите фид и кликните на Next step (следующий шаг).

Шаг 8. В настройках блока (block settings) введите минимальное (в нашем случае 0) и максимальное значения (в нашем случае 100). В дальнейшем вы можете изменить эти введенные значения.

Шаг 9. Ваш вид для учета электроэнергии (Power feed) успешно создан. Теперь создайте фид для отображения счёта (Bill), нажав на кнопку “+”.

После этого вам необходимо будет установить соединение с AdaFruit IO чтобы передавать SMS/E-mail с использованием сервиса IFTTT.

Создание прикладной программы в IFTTT для передачи SMS/Email

Шаг 1. Зарегистрируйтесь в сервисе IFTTT или войдите туда если у вас уже есть там аккаунт.

Шаг 2. На вкладке My Applets (мои прикладные программы) кликните на New Applet (новая прикладная программа).

Шаг 3. Кликните на +this.

Шаг 4. Найдите AdaFruit и кликните на нее.

Шаг 5. Кликните на «Monitor a feed on AdaFruit IO» (мониторить фид в AdaFruit IO).

Шаг 6. Выберите счет (bill) в качестве фида (Feed), взаимоотношение (Relationship) выберите ‘equal to’ (равно) и введите границу (мы ввели 4) при достижении которой вам будет высылаться уведомление на E-mail. Кликните на Create action (создать действие).

Шаг 7. Кликните на +that. В поиске введите G-mail, кликните потом на ней и залогиньтесь со своими данными в g-mail.

Шаг 8. Кликните на send yourself an email (передать самому себе email).

Шаг 9. Запишите свой subject (тему) и ее описание (body) как показано на рисунке и кликните на create.

Шаг 10. Ваше уведомление создано. Посмотрите его и нажмите на finish (завершить).

С интеграцией нашего проекта в сеть интернет мы закончили, теперь можно переходить к написанию кода программы.

Объяснение кода программы

В нашем проекте мы используем последовательную связь между ESP12 и Arduino. Поэтому нам необходимо написать программу и для Arduino, и для ESP12 (NodeMCU).

Объяснение кода программы для передающей части (для Arduino Uno)

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

Первым делом в программе необходимо подключить данную библиотеку.

Создадим массив чтобы хранить в нем значения мощности, которые затем будут передаваться в NodeMCU.

Сообщим Arduino Uno, что к ее контакту A0 будет подключен датчик тока ACS712-30Amp (на 30 Ампер). Измените соответствующим образом первый аргумент в следующей команде если вы будете использовать вариант датчика тока на 20 или 5 Ампер.

Далее, в функции setup установим скорость последовательной связи равную 115200 бод/с для обмена данными с NodeMCU. Вызовем функцию sensor.calibrate() для калибровки датчика тока (чтобы в дальнейшем считывать с него правильные значения).

В функции loop вызовем функцию sensor.getCurrentAC() чтобы считать текущее значение тока и сохранить его в переменной I. После получения значения тока рассчитаем мощность по стандартной формуле P=V*I. В качестве значения напряжения мы использовали 230V – измените это значение если в вашей сети другое значение напряжения.

Следующие три строчки кода конвертируют значение мощности в ватт-часы (Wh) – то есть значение мощности умножается на время работы.

Затем нам необходимо конвертировать эти ватт-часы в символьный массив чтобы их можно было передать на NodeMCU – для этой цели мы будем использовать функцию dtostrf().

Формат этой функции выглядит следующим образом:

Далее этот массив символьных данных передадим в буфер последовательной связи с помощью функции Serial.write() – то есть осуществим передачу значений ватт-часов в NodeMCU.

Объяснение кода программы для приемной части (для NodeMCU ESP12)

Для написания данной программы нам понадобится библиотека AdaFruit MQTT library, которую можно скачать по этой ссылке.

После этого откройте Arduino IDE. В ней откройте examples -> AdaFruit MQTT library -> mqtt_esp8266.

Нам необходимо будет изменить этот код в соответствии с ключами, полученными ранее в сервисе Adafruit IO (AIO keys), вашими настройками для Wi-Fi и поступающими по последовательному порту связи данными от платы Arduino. Первым делом в программе нам необходимо подключить библиотеки для работы с Wi-Fi модулем ESP12 и для работы с AdaFruit MQTT.

Инициализируем SSID и пароль (Password) для Wi-Fi, к которому мы будем подключать наш модуль ESp-12e.

Далее инициализируем сервер AdaFruit и порт сервера на “io.adafruit.com” – для него зафиксировано значение «1883».

В следующих командах вам необходимо заменить имя пользователя (username) и ключи с сервиса Adafruit IO (AIO keys) на ваши значения.

Затем мы создадим класс для ESP12 с именем WiFiClient чтобы с его помощью затем коннектиться к серверу MQTT.

Установка класса клиента для MQTT осуществляется с помощью команды следующего формата:

Необходимо установить фиды с именами ‘Power’ и ‘bill’ для публикации изменений в них.

В функции setup мы будем подключать Wi-Fi модуль к точке доступа Wi-fi.

В функции loop мы будем проверять поступающие данные от платы Arduino и публиковать эти данные в AdaFruit IO.

В этой функции осуществляется проверка поступающих данных от Arduino и сохранение этих данных в массив watt[] с помощью использования функции serial.read().

С помощью функции atof() осуществляется конвертирование принятых символов в значение вещественного типа, которое сохраняется в переменной watt1.

Затем мы осуществляем расчет счета за потребленную электроэнергию при помощи умножения значения потребленной энергии (в ватт-часах) на значение тарифа за электричество. На 1000 в следующей команде мы делим для того, чтобы перевести ватт-часы в киловатт-часы (потому что обычно тариф за электроэнергию указывается для потребленных кВт/ч).

Затем мы можем начинать передачу в интернет полученных значений.

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

Далее осуществляется публикация счета за электричество.

Наше значение счета за электричество может изменяться достаточно быстро (при включении и выключении новых потребителей электроэнергии), однако сервису IFTTT необходимо некоторое время для того чтобы исполнить написанный нами ранее applet (прикладную программу), поэтому в программе предусмотрена задержка чтобы не перегружать сервис IFTTT слишком частыми запросами. Вы можете изменить границу, при превышении которой вам будет высылаться email, также вы может изменить и другие настройки в IFTTT AdaFruit IO setup.

Полный код программы для Arduino и NodeMCU ESP12 приведен в конце данной статьи.

Загрузите коды этих программ в эти устройства. Соедините все элементы проекта как показано в приведенной ранее схеме и откройте сайт io.adafruit.com. Откройте приборную доску (dashboard), которую вы там создали. После этого вы сможете наблюдать как в ней будут меняться значения потребления электроэнергии и счета за электричество.

Когда ваш счет достигнет значения 4 (вы можете изменить это значение на нужное вам) вы получите email примерно следующего вида:

Приложение для Android для контроля потребления электроэнергии

Вы можете использовать приложение для Android для контроля описанных значений потребления электроэнергии и счета за электричество. Для этого скачайте MQTT Dashboard android app из Play store.

Чтобы осуществить в нем соединение с io.adafruit.com выполните следующую последовательность шагов.

Шаг 1. Откройте приложение и кликните в нем на знак “+”. Напишите в поле Client Id любое значение которое захотите. Сервер и порт оставьте такими как показано на следующем рисунке.

Вы можете получить имя пользователя (Username) и пароль (Active key) с приборной доски AdaFruit IO как показано на следующем рисунке.

Шаг 2. Выберите Electricity Meter (измеритель электричества) и выберите Subscribe (подписаться). Для подписки укажите дружественное (сетевое) имя (friendly name) и тему (topic) в формате ‘yourusername’/feeds/’feedname’, затем нажмите create (создать).

Шаг 3. Аналогичным образом сделайте подписку на значение счета за электричество (bill feed).

Шаг 4. После того как ваши устройства начнут потреблять электроэнергию значения потребляемой мощности и счета за электричество будут отображаться в приложении.

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

Исходный код программы

Код программы для Arduino

Код программы для NodeMCU ESP12

Видео, демонстрирующее работу схемы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *