Рубрики
Проекты на ESP32

Измеритель мощности (ваттметр) на ESP32

Измерение тока, напряжения и мощности с помощью амперметра, вольтметра и ваттметра соответственно, является привычным делом для радиолюбителей. Но измерение эффективности использования мощности (выхода мощности, отдачи мощности, в англ. – power efficiency) с помощью обычного мультиметра может стать ощутимой проблемой. Поэтому в данной статье мы рассмотрим создание измерителя мощности (ваттметра) на основе модуля ESP32, с помощью которого можно будет измерять входные и выходные напряжения и ток и, следовательно, определять энергетическую эффективность устройства. Ранее на нашем сайте мы также рассматривали проект ваттметра на основе платы Arduino.

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

Примечание: рассматриваемый в данной статье проект ваттметра предназначен для работы в сетях постоянного тока (DC). Если вам необходимо аналогичное устройство для сетей переменного тока (AC), то тогда вам нужно немного изменить проект умного измерителя энергии на основе платы Arduino и модуля ESP12, ранее рассмотренный на нашем сайте. Также на нашем сайте есть проект аналогичного умного измеритель энергии на основе платы Raspberry Pi.

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

  1. Модуль ESP32 (купить на AliExpress).
  2. OLED дисплей 128X64 (купить на AliExpress).
  3. Микросхема датчика тока ACS712-20 – 2 шт. (купить на AliExpress).
  4. Разъем для подключения постоянного тока (DC Barrel Jack).
  5. Конденсатор 100 мкФ – 2 шт. (купить на AliExpress).
  6. Конденсатор 104 пФ – 2 шт. (купить на AliExpress).
  7. Конденсатор 102 пФ – 2 шт. (купить на AliExpress).
  8. Резистор 10 кОм, 1% – 4 шт.
  9. Резистор 68 кОм, 1% – 2 шт.
  10. Резистор 6,8 кОм, 1% – 2 шт.

Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158

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

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

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

Принцип работы схемы достаточно прост. Мы будем измерять напряжение и ток на входе и выходе устройства, таким образом, мы сможем определить энергетическую эффективность устройства, которая очень важна (обязательна), к примеру, для конвертеров постоянного тока (DC to DC converter).

Микросхема датчика тока ACS712

Для измерения тока в нашем проекте мы будем использовать микросхему ACS712. Это достаточно интересная микросхема, использующая для измерения тока эффект Холла. Существуют три варианта данной микросхемы – на 5A, 20A и 30A. В нашем проекте мы будем использовать ее вариант на 20A – в данном случае эта микросхема имеет обозначение ACS712-20.

Даташит на ACS712 рекомендует для нормального функционирования микросхемы использовать диапазон напряжений 4.5–5.5 В. Поскольку мы используем модуль ESP32, работающий с напряжением 3.3V, мы использовали делитель напряжения из двух резисторов 10 кОм, чтобы уменьшить уровень напряжения с микросхемы ACS712 перед подачей его на контакт модуля ESP32. Когда через микросхему ACS712 не протекает никакого тока, на ее выходе присутствует напряжение 2.5V. Если же через микросхему ACS712 начинает протекать ток, то напряжение на выходе микросхемы увеличивается или уменьшается в зависимости от направления протекающего через нее тока.

В нашем проекте мы использовали две микросхемы ACS712 – для измерения тока на входе и на выходе устройства.

Делитель напряжения

Для измерения входного и выходного напряжений мы использовали два делителя напряжения – на входе и выходе сети. Максимальное напряжение, которое мы сможем измерять – 35V, но его легко изменить, используя другие номиналы резисторов в делителях напряжения.

Регулятор напряжения

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

Модуль ESP32 и OLED дисплей

В качестве основного вычислительного устройства в нашей схеме мы используем модуль ESP32, который будет отвечать за считывание данных, расчеты и вывод данных на экран OLED дисплея 128X64.

Изготовление печатной платы для ваттметра

Автор проекта (ссылка на оригинал приведена в конце статьи) использовал одностороннюю печатную плату. Ее он спроектировал в редакторе Eagle. Дизайн получившейся у него печатной платы показан на следующем рисунке.

Скачать дизайн печатной платы проекта и GERBER файлы для ее изготовления можно по следующей ссылке.

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

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

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

В программе нам необходимо считывать аналоговое напряжение с контактов 33 и 35 модуля ESP32. Также мы будем считывать напряжение с его контактов 32 и 34 – оно нам будет необходимо для определения величины тока. Зная величины тока и напряжения на входе и выходе устройства мы можем определить значения мощности на входе и выходе и, следовательно, рассчитать значение энергетической эффективности устройства. Отображать результаты измерений мы будем на экране OLED дисплея.

Поскольку мы используем OLED дисплей с драйвером SSD1306 и разрешением 128X64, то для взаимодействия с ним нам будет необходимы библиотеки Adafruit_GFX и Adafruit_SSD1306. Скачать их можно по следующим ссылкам:

Также их можно скачать и установить с помощью менеджера библиотек в Arduino IDE.

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

Переменные SCREEN_WIDTH и SCREEN_HEIGHT используются для задания размера экрана. Также мы используем переменные со значениями всех резисторов, которые используются в нашей схеме.

Поскольку для измерения тока мы используем микросхему ACS712, мы будем применять переменную mVperAmp для расчета значения тока исходя из значения напряжения. Поскольку мы используем модуль ACS712 на 20A, то необходимо использовать значение mV/A равное 100 как указано в даташите на датчик. Но так как мы используем ESP32 и делитель напряжения, то нам нужно использовать половину этого значения, то есть значение 50, и именно это значение мы присвоили переменной mVperAmp.

ACSoffset – это сдвиг (смещение), который необходим для расчета значения тока из значения напряжения. Поскольку мы микросхему ACS712 запитываем от 5V, то сдвиг напряжения составляет 2.5V. Но так как мы используем делитель напряжения, то этот сдвиг напряжения уменьшается до значения 1.25V. Но, поскольку АЦП (аналого-цифровой преобразователь) у модуля ESP32 не отличается особой точностью, то автор проекта (ссылка на оригинал приведена в конце статьи) использовал для сдвига значение 1136.

Также мы создаем объект класса Adafruit_SSD1306 для работы с OLED дисплеем, передавая в него значения высоты и ширины экрана, конфигурацию I2C, а параметр -1 используется для обеспечения функционала сброса дисплея. Этот параметр особенно полезен когда дисплей не имеет внешнего контакта сброса (у большинства подобных дисплеев).

Далее в функции setup() мы инициализируем последовательную связь для целей отладки, проверяем доступен ли наш дисплей (он у нас подключен по интерфейсу I2C) или нет. Также мы устанавливаем адрес I2C. Далее мы очищаем экран дисплея с помощью метода clearDisplay(). Дополнительно мы поворачиваем экран дисплея с помощью метода setRotation. Затем мы делаем задержку 100 мс чтобы изменения вступили в силу.

Функция return_voltage_value() используется для измерения значения напряжения с выхода АЦП, в качестве аргумента в нее передается номер контакта, на котором производится измерение. В этой функции мы объявим ряд необходимых нам переменных: tmp, ADCVoltage, inputVoltage и avg. Переменная tmp используется для хранения временного значения с выхода АЦП, которое мы получаем с помощью функции analogRead(). Эти значения мы в цикле считываем 150 раз, затем усредняем их и сохраняем в переменной avg. Затем мы рассчитываем значение напряжения на входе АЦП по известной формуле и сохраняем его в переменной ADCVoltage. Значение +0.138, которое вы видите в этой формуле, является калибровочным, вы можете изменить (откалибровать) его по своему желанию, используя мультиметр. Далее мы пересчитываем уровень напряжения с учетом делителя напряжения, с выхода которого напряжение подается на контакт модуля ESP32.

Также мы запрограммируем функцию return_current_value(), в качестве аргумента в нее передается номер контакта. Функция во многом аналогична ранее рассмотренной функции return_voltage_value(), но в ней вместо значения напряжения рассчитывается значение тока исходя из значения на выходе АЦП.

В функции void loop() мы объявим 4 переменных типа float. В них мы будем записывать модули (abs) значения тока и напряжения с входа и выхода устройства, поскольку с датчика ACS712 мы получаем отрицательные значения. Далее мы выводим эти значения в окно монитора последовательной связи с помощью функции Serial.print и на экран OLED дисплея с помощью функции display.print.

Тестирование работы ваттметра

Внешний вид собранной конструкции для тестирования нашего ваттметра показан на следующем рисунке. Автор проекта использовал для этой цели трансформатор на 30V и конвертер LM2596. В качестве нагрузки он использовал три резистора по 10 Ом, соединенных параллельно.

Также для проверки входного и выходного напряжения он подключил мультиметры. На выходе трансформатора напряжение составляет 32V, а на выходе конвертера – 3.95V.

На следующем рисунке показано значение тока, измеряемое мультиметром и нашим ваттметром. Как вы видите, мультиметр показывает значение тока 0,97 А, но если вы присмотритесь повнимательнее, то значение тока должно быть равно 1,0 А, это небольшое расхождение обусловлено нелинейностью, присутствующей в датчике ACS712.

Более подробно тестирование работы нашего ваттметра вы можете посмотреть на видео, приведенном в конце статьи.

Возможные улучшения проекта

В демонстрационных целях ваттметр собран на самодельной печатной плате, но его можно собрать и на хорошей (фабричной) печатной плате – в этом случае ее размеры можно значительно уменьшить, особенно если в качестве дискретных элементов использовать дешевые SMD компоненты.

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

Повысить точность и стабильность измерений нашего ваттметра можно с помощью использования внешнего модуля АЦП (например, ADS1115), поскольку точность встроенного в модуль ESP32 АЦП не вызывает «чувства восторга».

Исходный код программы (скетча)

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

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

3 ответа к “Измеритель мощности (ваттметр) на ESP32”

Очень привлекательная тема и вполне доступное описание.
Однако, по моему скромному мнению, с дисплеем TFT(например ILI9341) и с размером, хотя бы 2,4″, информацию было бы легче воспринимать. И ежели бы мне знания и умения в программировании позволяли, я бы так и поступил.

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

Здравия! Подключение этого TFT к ESP32 затруднений не вызывает. Но, вот совместить с данной программой я не смогу — весьма слаб в программировании. К примеру, у меня есть дисплей SH1106. Вот с ним, тупым способом замены, всё получается. А вот переход с I2C на SPI для меня уже тёмный лес.
Я «железячник», но не программист.

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

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