Определяем наличие сети 220В при помощи оптопары для Arduino

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

Некоторые могут сказать зачем делать такой прибор если его можно сейчас сравнительно недорого купить. Да, это так. Но ведь наверняка некоторым из вас хочется сделать более продвинутый ваттметр чем тот, который можно просто купить. Используя плату Arduino для создания ваттметра мы можем выводить измеряемые значения на экран компьютера, строить их график, сохранять их значения на SD карту когда их значения находятся в заданных интервалах и многое другое.

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

  1. Плата Arduino Nano (купить на AliExpress).
  2. Операционный усилитель LM358 (купить на AliExpress).
  3. Регулятор напряжения LM7805 (купить на AliExpress).
  4. ЖК дисплей 16х2 (купить на AliExpress).
  5. Шунтирующий резистор 0.22 ohm 2Watt (купить на AliExpress).
  6. Подстроечный потенциометр 10 кОм (Trimmer pot) (купить на AliExpress).
  7. Резисторы 10 кОм, 20 кОм, 2,2 кОм, 1 кОм (купить на AliExpress).
  8. Конденсаторы 0,1 мкФ (купить на AliExpress).
  9. Тестируемая нагрузка.
  10. Перфорированная или макетная плата.

Работа схемы

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

Схема спроектирована для работы с напряжением в диапазоне 0-24V с током 0-1A – эти параметры специально подобраны для работы с Solar PV (солнечная фотоэлектрическая система). Но если вы поймете принципы работы этой схемы вы легко можете расширить диапазоны ее работы до необходимых вам. Основополагающий принцип работы этой схемы заключается в измерении напряжения и тока в нагрузке чтобы затем рассчитать потребляемую нагрузкой мощность. Значения всех измеряемых параметров будут отображаться на экране ЖК дисплея 16х2.

Далее рассмотрим работу по отдельности небольших элементов представленной схемы чтобы лучше понять ее работу.

Измерительный блок

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

Входное напряжение на этой схеме обозначено как Vcc. Как мы говорили ранее, схема спроектирована для измерения напряжений от 0V до 24V. Но плата Arduino не может измерять такие большие напряжения – она может измерять напряжения только в диапазоне 0-5V. Соответственно, мы должны преобразовать измеряемое напряжение в диапазоне 0-24V в диапазон 0-5V. Это преобразование как раз и осуществляется с помощью представленного делителя напряжения. Соответственно, и номиналы резисторов в схеме этого делителя (10 кОм и 2,2 кОм) как раз подобраны таким образом, чтобы преобразовывать диапазон 0-24V в диапазон 0-5V. Если вам нужно изменить диапазон измеряемых схемой напряжений вам всего лишь нужно изменить значения номиналов резисторов в представленной схеме делителя напряжения. Значение напряжение на выходе делителя напряжения можно рассчитать по хорошо известной формуле:

Vout = (Vin × R2) / (R1 + R2)

Преобразованное к диапазону 0-5V напряжение со средней точки делителя напряжения у нас на схеме обозначено меткой Voltage. В дальнейшем это преобразованное значение напряжения подается на аналоговый вход платы Arduino.

Далее мы должны измерять ток через нагрузку (LOAD). Поскольку микроконтроллеры могут считывать только аналоговые значения напряжения нам необходимо преобразовать значение тока в значение напряжения. Это можно сделать при помощи добавления шунтирующего резистора – в соответствии с законом Ома падение напряжения на нем будет пропорционально протекающему по нему току. Поскольку на шунтирующем резисторе падение напряжения будет очень маленькое мы будем использовать операционный усилитель чтобы усилить его. Схема для осуществления этого процесса показана на следующем рисунке:

Значение сопротивления шунтирующего резистора (SR1) в нашем случае равно 0.22 Ом. Как было указано ранее, наша схема спроектирована для измерения силы тока в диапазоне 0-1A, поэтому в соответствии с законом Ома при максимальном токе через нагрузку 1 А падение напряжения на нашем шунтирующем резисторе будет примерно 0.2V. Это напряжение мало для считывания микроконтроллером, поэтому мы используем операционный усилитель в неинвертированном усилительном режиме чтобы усилить это напряжение до значения, которое можно комфортно считать с помощью платы Arduino.

Операционный усилитель в неинвертированном режиме показан на вышеприведенной схеме. Усилитель спроектирован таким образом чтобы его коэффициент усиления составлял значение 21, итого получаем 0.2*21 = 4.2V. Формула для расчета коэффициента усиления представленного операционного усилителя выглядит следующим образом:

Gain = Vout / Vin = 1 + (Rf / Rin)

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

В нашем случае значение сопротивления резистора Rf равно 20 кОм, а значение сопротивления резистора Rin равно 1 кОм, что обеспечивает коэффициент усиления 21 для операционного усилителя. Далее напряжение с выхода операционного усилителя подается на RC фильтр, состоящий из резистора 1 кОм и конденсатора 0,1 мкФ. Данный фильтр предназначен для фильтрации нежелательных шумов. Далее отфильтрованное напряжение подается на аналоговый вход платы Arduino.

И, наконец, последний компонент который нам необходимо рассмотреть в блоке измерений нашей схемы – это регулятор напряжения. Поскольку мы подаем на вход схемы изменяемое напряжение нам необходимо стабилизированное напряжение +5V для питания платы Arduino и операционного усилителя. Это регулированное (стабилизированное) напряжение в нашей схеме обеспечивается с помощью регулятора напряжения 7805. Конденсатор добавлен на выход схемы регулятора для фильтрации шума.

Блок вычислений и отображения информации

В блоке измерений мы спроектировали схему чтобы конвертировать измеряемые значения и тока в диапазон напряжений 0-5V, которые непосредственно подаются на аналоговые входы Arduino. В этой же части схемы мы подсоединяем эти провода с напряжениями к плате Arduino, а также подключаем к плате Arduino алфавитно-цифровой ЖК дисплей для отображения результатов измерений. Схема этого блока представлена на следующем рисунке.

Как вы можете видеть из схемы, контакт с значением напряжения подключается к аналоговому контакту A3, а контакт со значением тока – к аналоговому контакту A4 платы Arduino. ЖК дисплей запитывается от напряжения +5V с регулятора 7805 и подключен к цифровым контактам платы Arduino в 4-битном режиме. Мы также используем потенциометр 10 кОм, подключенный к контакту Con ЖК дисплея чтобы регулировать его контрастность.

Теперь поинтереснее

Давайте объединим потенциометр и диод. И у нас выйдет плавное управление яркостью светодиода. Подключаем всё по следующей схеме:

После подключения давайте напишем код к нашему импровизированному светильнику:

int pot = A0; // потенциометр подключён к А0 int val; // переменная для хранения значений int LED = 3; // светодиод подключён к 3 пину void setup() { Serial.begin(9600); // настраиваем скорость обмена данных на 9600 бит в секунду pinMode(pot, INPUT); pinMode(LED, OUTPUT); } void loop() { val = analogRead(pot); // считываем данные с потенциометра Serial.println(val); // с новой строки выводим значения val = val / 4; // делим значения с потенциометра на 4 analogWrite(LED, val); // выводим значение переменной, которое получаем после деления на 4 }

Короткие объяснения по коду. Деление на 4 необходимо для следующего. Потенциометр может принимать значения от 0 до 1023. А вот аналоговый вход/выход передаёт значения только в диапазоне от 0 до 255. Поэтому деление нам в данном случае просто необходимо.

Как повысить точность измерений

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

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

Наконец, когда мы знаем значения тока и напряжения, мы можем рассчитать мощность по известной формуле P=V*I и затем отобразить все эти три значения на экране ЖК дисплея.

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

Для сборки схемы мы использовали перфорированную плату как показано на рисунке ниже. Мы использовали зажимной контакт Phoenix чтобы соединить нагрузку и обычный контакт постоянного тока (normal DC barrel Jack) чтобы подключаться затем к источнику напряжения.

После того как аппаратная часть проекта готова, загрузите код программы в плату Arduino Nano. Потенциометром отрегулируйте контрастность ЖК дисплея. Чтобы протестировать работу схемы подключите нагрузку и источник питания. Напряжения источника питания должно быть не менее 6V поскольку плата Arduino требует для своей работы напряжения +5V. Если схема работает так, как надо, вы должны увидеть на экране ЖК дисплея значения измеренных напряжения и тока, а также значение рассчитанной мощности. Более подробно эти процессы показаны на видео, приведенном в конце статьи.

Для калибровки нашего ваттметра можно использовать какой-нибудь «заводской» ваттметр. Используя возможности платформы Arduino можно значительно улучшить функционал данного проекта – добавить в него логгер данных на SD карту, построение графика, уведомления о каких-нибудь ситуациях (например, когда значения напряжения и тока выйдут за пределы допустимых значений) и многое другое.

На нашем сайте вы также можете посмотреть похожие проекты:

  • омметр на Arduino;
  • амперметр на Arduino;
  • вольтметр на Arduino.

Функция map()

Map – это математичесская функция, которая переобразовывает значение переменной из одного диапазона в другой. Функция в коде выглядит следующим образом – map(value, fromLow, fromHigh, toLow, toHigh). Именно она может в нашем коде заменить деление. И вобще эта функция достаточно часто бывает полезна при работе с Arduino. Поэтому наш код теперь выглядит так:

int pot = A0; // потенциометр подключён к А0 int val; // переменная для хранения значений int LED = 3; // светодиод подключён к 3 пину void setup() { Serial.begin(9600); // настраиваем скорость обмена данных на 9600 бит в секунду pinMode(pot, INPUT); pinMode(LED, OUTPUT); } void loop() { val = analogRead(pot); // считываем данные с потенциометра Serial.println(val); // с новой строки выводим значения val = map(val, 0, 1023, 0, 255); // применяем функцию analogWrite(LED, val); }

На этом у нас конец третьей части. Спасибо за внимание.

Рейтинг
( 1 оценка, среднее 5 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]