Измеритель электроэнергии и ваттметр на ESP32


В связи с усилением энергетического кризиса во всем мире сейчас все более острой становится проблема экономии электроэнергии. А чтобы разработать эффективные меры ее экономии необходимо знать сколько электроэнергии потребляет то или иное устройство. Для этой цели разработаны различные устройства, но хорошие из них стоят достаточно дорого. Поэтому в данной статье мы рассмотрим создание устройства на основе модуля ESP32, которое способно выполнять функции измерителя электроэнергии и ваттметра.

Внешний вид измерителя электроэнергии на основе модуля ESP32

Ранее на нашем сайте мы уже рассматривали проект ваттметра на основе модуля ESP32, но рассматриваемый в данной статье проект особенно удобен для измерения мощности устройств, работающих от сети переменного тока.

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

  1. Модуль ESP32 (ESP32 WROOM 32D Module) (купить на AliExpress).
  2. Импульсный источник питания HI LINK 5V 3W.
  3. 0.96” OLED дисплей 128X64 с интерфейсом I2C (купить на AliExpress).
  4. Датчик напряжения ZMPT101B (купить на AliExpress).
  5. Датчик тока ACS712 (купить на AliExpress).
  6. 220V AC 3 Pin Socket MALE.
  7. 220V AC 3 Pin Socket FEMALE.
  8. Корпус устройства, напечатанный на 3D принтере.

Как будет работать наш ваттметр

Для измерения потребляемой мощности нам необходимо измерить значения напряжение и тока и сообщить их нашему микроконтроллеру (модулю) ESP32, который на их основе рассчитает мощность и выведет ее значение на экран OLED дисплея. Для питания нашего ваттметра мы будем использовать импульсный источник питания HI LINK 5V 3W, который будет преобразовывать 220 В переменного тока в 5 В постоянного тока.

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

Структурная схема нашего ваттметра

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

Датчик напряжения ZMPT101B

ZMPT101B – это трансформаторный датчик напряжения, который линейно уменьшает входное напряжение и обладает аналоговым выходом. Также он обеспечивает изоляцию напряжения до 4000V и безопасную работу с напряжением до 1000V. Схема датчика ZMPT101B приведена на следующем рисунке.

Схема датчика напряжения ZMPT101B

Из анализа представленной схемы видно, что выход трансформатора датчика подключен к микросхеме операционного усилителя LM358N, который усиливает пики напряжения.

Датчик тока ACS712

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

Схема датчика тока ACS712

Микросхема ACS712 выпускается в 3-х вариантах исполнения – 5A, 20A и 30A. Для нашего проекта мы выбрали ее вариант на 20A.

Схема проекта

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

Схема измерителя электроэнергии на основе модуля ESP32На схеме показано что импульсный источник питания Hi-link и входной терминал датчика напряжения ZMPT101B подключены в параллель к фазе и сети переменного тока, а датчик тока ACS712 последовательно включен в фазовый провод сети.

OLED дисплей подключен к контактам I2C модуля ESP32, а выходные контакты датчика напряжения и датчика тока подключены к контактам 34 и 36 модуля соответственно. Эти контакты способны выполнять операции аналого-цифрового преобразования (АЦП).

Все компоненты схемы получают питание от выходного контакта 5v модуля Hi-Link (терминалы Vo+ и Vo-).

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

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Установка необходимых библиотек

Для нашего проекта нам необходимо будет установить библиотеки Adafruit GFX и Adafruit SSD 1306. Для этого откройте менеджер библиотек (library manager) в Arduino IDE.

Открытие менеджера библиотек (library manager) в Arduino IDE

Выполните в нем поиск библиотек Adafruit GFX и Adafruit SSD1306 и затем установите их, нажав на кнопку install.

Установка библиотек Adafruit GFX и Adafruit SSD1306

Теперь нам нужно установить библиотеки для работы с датчиками ZMPT101B и ACS712, коды этих библиотек похожи друг на друга, их оригиналы можно скачать по этим ссылкам: ZMPT101B и ACS712. Также эти библиотеки есть в составе файлов, ссылка на скачивание которых приведена в конце статьи. Но мы немного модифицируем их коды в связи с изменением микроконтроллера и чтобы они были совместимы с 12-битным АЦП модуля ESP32.

Чтобы скачать эти библиотеки с репозитория GitHub нажмите на кнопку download в выпадающем меню.

Скачивание библиотеки с репозитория GitHub

После скачивания zip файла откройте Arduino IDE и выберите в ней пункт Sketch >> Include Library >> Add Zip Library.

Добавление библиотеки в Arduino IDE в виде zip файла

Укажите местоположение zip файла на своем компьютере и нажмите open.

Выбор местоположения zip файла на своем компьютере

В результате Arduino IDE установит вашу библиотеку. Необходимо повторить этот процесс для обоих библиотек.

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

Библиотеки Wire.h и SPI.h уже по умолчанию присутствуют в Arduino IDE, их устанавливать не нужно.

Команды инициализации

Инициализируем объекты для работы с датчиком тока и с датчиком напряжения.

С помощью следующего фрагмента кода инициализируем OLED дисплей.

После этого объявим глобальные переменные, которые потребуются нам в коде программы.

Код для функции void setup()

В функции void setup() мы установим точку нуля и чувствительность наших датчиков, а также начнем работу с OLED дисплеем.

Примечание: пока чувствительность датчиков в коде программы не будет меняться, возможно, вам необходимо будет изменить точку нуля. Для этого просто единожды раскомментируйте строчки кода, обозначенные как “Calibration Commands” и убедитесь что в это время на вход модуля не подается ни внешнего тока, ни напряжения. После этого код программы покажет вам точку нуля (zero point) и вы можете обновить ее значение в коде.

Процесс калибровки следует выполнять отдельно для датчика тока и для датчика напряжения.

Основной цикл программы

В основном цикле программы мы будем считывать с выходов АЦП значения с выходов датчиков и передавать их на дисплей с интервалом 500 мс.

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

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

Необходимые для проекта функции

В нашем проекте нам потребуются следующие функции, которые мы запрограммировали:

Их коды можно записать в программе после функции void loop().

Сборка корпуса для проекта

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

При сборке корпуса проекта постарайтесь сделать правильную изоляцию с помощью изоляционной ленты и термоусадки. Внешний вид корпуса проекта показан на следующем рисунке.

Примечание: конечно, гнездо для розетки у этого корпуса для наших российских условий вряд ли подойдет и тут придется немного "подшаманить".

После того как все будет готово, можете проверить работу устройства, подключив через него в сеть какой-нибудь потребитель переменного тока.

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

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

Источник статьи

(Проголосуй первым!)
Загрузка...
3 533 просмотров

Комментарии

Измеритель электроэнергии и ваттметр на ESP32 — 14 комментариев

  1. Скажите, в предыдущем измерителе использовали делитель напряжения. Логика esp32 3.3V а датчики как я понимаю 5V.

  2. что бы я не делал выходит такое сообщение на строке - ACS712 currentSensor(ACS712_20A, 36); -'ACS712_20A' was not declared in this scope

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

    • В этом коде автор специально сделал ошибки. чтоб другие помучились и показать какой он крутой программер. В данная строка не должна иметь не каких имен в скобках. В скобках только номер вывода.
      ACS712 currentSensor(36);

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

  3. откуда значение currentSensor.setSensitivity(0.15)
    и какое будет для 30 амперного датчика

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

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

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