Ардуино проект реверсивный счетчик на led индикаторах. Подключаем Arduino к счетчику электроэнергии


Счетчик электроэнергии своими руками на Arduino

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

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

Что вам понадобится для домашнего счетчика электроэнергии

Arduino (Uno, используемый в этом руководстве)
ЖК-экран
Трансформатор тока CT - Talema AC1030 (см. Ниже различные варианты и ссылки на покупку)
Резистор с сопротивлением 56 Ом
10μF конденсатор
2 x 100KОм делительные резисторы

Как сделать счетчик электроэнергии

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

Сборка компонентов

Если вы собираетесь установить свой измеритель мощности где-нибудь надолго, вы можете припаять резисторы и конденсатор непосредственно на CT.

Ниже показана базовая схема подключения CT к Arduino:


Экран ЖК-экрана уже использует аналоговые входы, но экран использует только A0. Просто припаяйте три провода от вашего текущего датчика к контактам на шилде и используйте A1 в качестве входного сигнала датчика, как показано ниже.


Когда вы подключите все свои компоненты, вам нужно подключить датчик к тому, что вы хотите контролировать.
В любом случае вам нужно поместить ТТ вокруг одного из кабелей питания, предпочтительно красного кабеля (фаза). Убедитесь, что он установлен только вокруг 1, так как он не будет работать, если он вокруг обоих, и он не может быть подключен вокруг провода заземления (желтый, зеленый оголенный провод), поскольку энергия не проходит через этот провод. Если вы подключаете его к электросети, подключите его к одному из выходных проводов после основного выключателя, как показано ниже.

Выбор различных компонентов

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

Выбор трансформатора тока

Первый - трансформатор тока. Используется здесь Talema AC1030, который может воспринимать номинальный ток 30A и максимальный ток 75A. При напряжении 220 В он теоретически может воспринимать до 16,5 кВт в течение коротких периодов времени, но он рассчитан на то, чтобы непрерывно воспринимать мощность 6,6 кВт, подходящую для небольшого домашнего хозяйства. Чтобы вычислить, сколько усилителей вам нужно использовать, возьмите максимальную непрерывную мощность, которую вы ожидаете потреблять и разделить по напряжению (обычно 110 В или 220 В в зависимости от вашей страны).

Калибровка нагрузочного резистора

Затем вам нужно определить значение резистора R3, это преобразует ваш ток ТТ в опорный сигнал напряжения. Начните с деления первичного тока (максимального, как использовано выше) на коэффициент трансформации трансформатора тока (имеется в техническом паспорте). Это должно быть порядка 500-5000 к 1. Эта статья работала на 42A с коэффициентом трансформации 1000: 1, давая вторичный ток 0.042A или 42mA. Ваше аналоговое опорное напряжение на Arduino составляет 2,5 В, поэтому для определения используемого вами сопротивления R = V / I - R = 2,5 / 0,042 = 59,5 Ом. Самое близкое стандартное значение резистора составляет 56 Ом, так что это было использовано.

Вот несколько вариантов на разных ТТ и их идеальных нагрузочных резисторах (в стандартных размерах):

  • Murata 56050C – 10A – 50:1 – 13Ω
  • Talema AS-103 – 15A – 300:1 – 51Ω
  • Talema AC-1020 – 20A – 1000:1 – 130Ω
  • Alttec L01-6215 – 30A – 1000:1 – 82Ω
  • Alttec L01-6216 – 40A – 1000:1 – 62Ω
  • Talema ACX-1050 – 50A – 2500:1 – 130Ω
  • Alttec L01-6218 – 60A – 1000:1 – 43Ω
  • Talema AC-1060 – 60A – 1000:1 – 43Ω
  • Alttec L01-6219 – 75A – 1000:1 – 33Ω
  • Alttec L01-6221 – 150A – 1000:1 – 18Ω
  • CTYRZCH SCT-013-000 – 100A
  • TOOGOO SCT-013-000 – 100A
Используемый конденсатор 10 мкФ, что должно быть достаточным для большинства диапазонов ТТ для бытовых применений.

Наконец, вам нужно два разделительных резистора, чтобы получить опорное напряжение 2,5 В от Arduino. Они должны быть одинаковыми, поэтому R1 = R2, и нам не нужно много тока, поэтому в этих статьях используются два 100KОм резисторы.

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

Обновление - с тех пор код был модифицирован для использования функции millis (), см. Конец раздела для обновленного кода.

Скачать файл: (cкачиваний: 357)

Если вы не хотите использовать или не имеете ЖК-экран, вы также можете изменить скетч для вывода в последовательное окно IDE Arduino, как показано ниже.

Скачать файл: (cкачиваний: 340)

Обновление кода

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

Вот улучшенный код: Скачать файл: (cкачиваний: 516) Для тех из вас, кто прочитал, что функция millis () переполняется примерно через 49 дней, код автоматически выполняет обнуление.


Откалибруйте показания значения тока

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

Чтобы откалибровать свой измеритель энергии, вам нужно быть уверенным, что ток, который выдает ваш счетчик, измеряется именно так, как вы ожидаете. Для того, чтобы сделать это точно, вам нужно найти откалиброванную нагрузку. Это нелегко найти в обычном домашнем хозяйстве, поэтому вам нужно будет найти то, что использует установленное и постоянное количество энергии. Я использовал пару ламп накаливания, они бывают разных размеров, и их потребление довольно близко к тому, что указано на этикетке, то есть 100 Вт лампочка использует очень близко к 100 Вт реальной мощности, поскольку это почти полностью чисто резистивная нагрузка.

Подключите небольшую лампочку (100 Вт или около того) и посмотрите, какая нагрузка отображается. Теперь вам нужно настроить использование коэффициента масштабирования в строке калькуляции:

Двойной RMSCurrent = ((maxCurrent - 516) * 0,707) /11,8337

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

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

Реализовывал сигнал ШИМ 25 кГц . Осциллографом не обладаю, но проверить результат хочется. Делаем счетчик импульсов, проверяем работу.

Задача

На базе ATmega 328P реализовать счетчик импульсов для проверки ШИМ 25 кГц , точность измерений до импульса не нужна, но порядок нужно знать.

Решение

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

Для считывания импульсов воспользуемся внешними прерываниями, они описаны на страницах 87-96 документации от производителя . В Atmega 328P есть два входа, которыми мы можем отслеживать внешние прерывания INT0(PD2) и INT1(PD3) , для решения задачи воспользуемся INT0 .

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

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

Для определения по каким событиям будет вызываться обработчик прерывания нужно настроить регистр ERICA . Биты ISC00 и ISC01 отвечают за INT0 , а ISC10 и ISC11 за INT1. Настройка отслеживаемых событий идентична, за разницей в битах:

00 — Низкий уровень сигнала;
01 — Любое логическое изменение сигнала;
10 — Нисходящий фронт сигнала;
11 — Восходящий фронт сигнала.

Для непосредственного включения входов прерываний служит регистр EIMSK , биты INT0 и INT1 отвечают за одноименные выходы. По вышеизложенному пишем код

Void int0_initial(void) { DDRD = 0x00; // Порт D как вход PORTD = (1 << 2); // Включение подтягивающего регистра EICRA = (1 << ISC00) | (1 << ISC01); // Восходящий фронт сигнала EIMSK = (1 << INT0); // Включение входа прерывания sei(); // Разрешаем прерывания }

Обработка внешних прерываний

Прерывания настроил, теперь надо их обработать. Для этого существует функция обработки прерывания ISR() , которой необходимо указать тип прерывания, в моем случае INT0_vect . В функции будем делать инкремент переменной Tic_Count :

ISR(INT0_vect) { Tic_Count ++; }

Вывод результата

Для облегчения вывода результата, дабы не прикручивать дисплей воспользовался не чистой ATmega 328P , а Arduino UNO и Arduino NANO , на борту которых тот же МК.

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

Ниже полный код решения задачи с комментариями:

#define F_CPU 1600000UL #include #include volatile unsigned int Tic_Count = 0; // Обработчик внешнего прерывания INT0 ISR(INT0_vect) { Tic_Count ++; } void setup() { int0_initial(); Serial.begin(9600); } void loop() { cli(); // Запрещаем прерывания Serial.println(Tic_Count); Tic_Count = 0; sei(); // Разрешаем прерывания delay(1000); } void int0_initial(void) { DDRD = 0x00; // Порт D как вход PORTD = (1 << 2); // Включение подтягивающего регистра EICRA = (1 << ISC00) | (1 << ISC01); // Восходящий фронт сигнала EIMSK = (1 << INT0); // Включение входа прерывания sei(); // Разрешаем прерывания }

Теперь остается подключить сигнал ШИМ к ножке PD2, и открыть монитор последовательного порта. Так же можно сформировать и проверить сигнал на одном МК.

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

Для дополнительного задания

Принципиальная схема

Схема на макетке

Обратите внимание

    В этом эксперименте мы впервые используем микросхему, в данном случае - выходной сдвиговый регистр 74HC595. Микросхемы полезны тем, что позволяют решать определенную задачу, не собирая каждый раз стандартную схему.

    Выходной сдвиговый регистр дает нам возможность «сэкономить» цифровые выходы, использовав всего 3 вместо 8. Каскад регистров позволил бы давать 16 и т.д. сигналов через те же три пина.

    Перед использованием микросхемы нужно внимательно изучить схему ее подключения в datasheet’е . Для того, чтобы понять, откуда считать ножки микросхемы, на них с одной стороны есть полукруглая выемка. Если мы расположим нашу 74HC595 выемкой влево, то в нижнем ряду будут ножки 1-8, а в верхнем 16-9.

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

    Напомним, что на изображении семисегментного индикатора подписаны номера его ножек и их соответствие сегментам.

Скетч

Для того, чтобы передать порцию данных, которые будут отправлены через сдвиговый регистр далее, нам нужно подать LOW на latch pin (вход ST cp микросхемы), затем передать данные, а затем отправить HIGH на latch pin, после чего на соответствующих выходах 74HC595 появится переданная комбинация высоких и низких уровней сигнала.

Для передачи данных мы использовали функцию shiftOut(dataPin, clockPin, bitOrder, value) . Функция ничего не возвращает, а в качестве параметров ей нужно сообщить

  • пин Arduino, который подключен ко входу DS микросхемы (data pin),

Тахометр - это полезный инструмент для подсчета RPM (оборотов в минуту) колеса или всего, что крутится. Самый простой способ сделать тахометр - это использовать ИК передатчик и приемник. Когда связь между ними прерывается, вы знаете, что что-то вращается и можете применять код для вычисления RPM, ориентируясь на частоту прерывания связи.

В этой статье мы рассмотрим, как использовать ИК-передатчик и приемник для изготовления тахометра с применением Arduino. Результат отображается на ЖК-дисплее 16х2.

Целью данного проекта является создание системы с одним входом и одним выходом. На входе устройства присутствует сигнал, изменяющийся с высокого (+5В) на низкий (+0В) уровень при нарушении связи. Согласно этому сигналу, Arduino будет увеличивать значение внутреннего счетчика. Потом проводится дополнительная обработка и расчет, и по прерыванию триггера на ЖК-дисплей будет выводиться рассчитанное RPM.

Для связи мы будем использовать ИК-луч от ИК-светодиода, включенного через низкоомный резистор так, чтобы светиться ярко. В качестве приёмника мы будем использовать фототранзистор, который при отсутствии света ИК-светодиода "закрывается". Компьютерный вентилятор будет размешен между ИК-передатчиком и приёмником и включен. ИК-приёмник включенный через транзисторную схему, будет генерировать прерывания. Для вывода результата будет использоваться Arduino LCD интерфейс, поэтому мы можем вывести окончательное значение RPM на ЖК-дисплей.

Элементы:
Arduino UNO
16x2 LCD
Макетная плата
Подстроечный резистор 5 кОм
Перемычки
SIP разъёмы
2x 2N2222 NPN транзистор
Инфракрасный светодиод
Фототранзистор
Резистор 10 Ом
Резистор 100 кОм
Резистор 15 кОм или 16 кОм
Компьютерный вентилятор

Подробный список элементов

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

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

ЖК-дисплей 16x2
После того, как Arduino вычислило RPM, эта значение будет отображаться на дисплее в понятном для пользователя виде.

Подстроечный резистор 5 кОм
Этот подстроечный резистор будет использоваться для регулировки контрастности ЖК-дисплея 16x2. Он дает аналоговое напряжение в диапазоне от 0 до +5В, позволяя настроить яркость ЖК-дисплея.

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

2N3904 и 2N3906
Эти транзисторы используются для преобразования уровня сигнала, с целью обеспечения выходных импульсов с фототранзистора для Arduino, в которых нет никаких напряжений кроме +0 и +5В.

Принципиальная схема

В схеме, интерфейс связи с ЖК-дисплеем упрощен и имеет только 2 линии управления и 4 линии передачи данных.

Особенности схемы

Интерфейс ЖК-дисплея 16x2
2 управляющих контакта и 4 для передачи данных подключены от Arduino к ЖК-дисплею. Это то, что указывает ЖК-дисплею, что и когда делать.

Схема обрыва ИК-луча
Сигнал обрыва ИК-луча идет на 2-ой цифровой контакт Arduino. Это прерывает Arduino, что позволяет ему засчитать импульс и позволяет тахометру получать данные.

Arduino LCD библиотека

Для этого проекта мы будем использовать Arduino LCD библиотеку. В основном мы будем просто обновлять значение RPM на второй строке на новое.

В качестве подготовки, посмотрите на код приведенный ниже, в котором при помощи этой библиотеки на ЖК-дисплей выводиться "Hello, World!" В тахометре мы будем использовать похожий код, особенно: "lcd.print(millis()/1000);".

Разберитесь в функциях этой ЖК-библиотеки как можно подробнее, прежде чем двигаться дальше. Она не слишком сложна и хорошо документирована на сайте Arduino .

Подсчет RPM при помощи Arduino

Так как мы собираемся подсчитать RPM компьютерного вентилятора, мы должны понимать, что для подсчета мы используем прерывание ИК-луча. Это очень удобно, но мы должны учитывать, что у компьютерного вентилятора 7 лопастей. Это значит, 7 прерываний равно 1 обороту.

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

Время 1-го оборота = P * (µS/оборот)
RPM = кол-во оборотов/мин = 60 000 000 * (µS/мин) * (1/P) = (60 000 000 / P) * (кол-во оборотов/мин)

Для расчета RPM мы будем использовать формулу приведенную выше. Формула точная, и точность зависит от того, насколько хорошо Arduino сможет отслеживать время между прерываниями и посчитывать количество полных оборотов.

На фотографии ниже вы можете увидеть все необходимые детали и перемычки как на схеме.

Для начала подключается +5В и линии данных/управления ЖК-дисплея. Затем ЖК-дисплей, потенциометр контрастности и светодиод питания.

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

Хватит разговоров о аппаратной части! Давайте начнем делать прошивку/программу, чтобы увидеть работу устройства!

Программная часть

Есть две основных части кода, которые показаны и подробно описаны ниже:
-Основной цикл обновления ЖК-дисплея
-Обновление времени прерываний

В основном цикле считаются обороты и обновления ЖК-дисплея. Поскольку основной цикл это гигантский while(1) цикл, то он будет работать всегда, RPM считаться, а ЖК-дисплей обновляться несколько раз в секунду. Функция в прерывании подсчитывает время между прерываниями ИК, поэтому считать RPM можно в основном цикле.

Помните, что компьютерный вентилятор имеет 7 лопастей, так что это тахометр предназначен для работы только с такими вентиляторами. Если ваш вентилятор или другое устройство дает только 4 импульса за оборот, измените в коде "(time*4)".

Два вентилятора работают на примерно 3000 оборотов в минуту и ​​2600 оборотов в минуту, с погрешностью около + / -100 оборотов в минуту.

Обзор тахометра на Arduino

Вентилятор генерирует импульсы прерывания, а на выходе мы видим RPM. Хотя точность не 100%, а примерно 95%, при стоимости элементов 10$ есть смысл построить этот тахометр на Arduino.

Что теперь делать?

Системы на основе обрыва луча полезны не только при измерении RPM, но и в качестве других датчиков. Например, вы хотите знать, открыта дверь или закрыта. Возможно, вы хотите знать, не проходило-ли что то под роботом. Есть много применений обрыва луча, а схема используемая тут настолько проста, что есть много путей для улучшения и сборки других удивительных устройств.

Заключение

В целом, я считаю этот проект успешным... Но дело во времени и опыте.. Так или иначе, система работает как задумывалось и достаточно надежно, а мы получили ожидаемый результат. Надеюсь, вам понравилось прочитать эту статью и узнать как сделать свой собственный тахометр на Arduino!

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
Плата Arduino

Arduino Uno

1 В блокнот
T2, T3 Биполярный транзистор

2N2222

2 2N3904 и 2N3906 В блокнот
R1 Резистор

10 Ом

1 В блокнот
R2 Резистор

100 кОм

1 В блокнот
R3 Резистор

16 кОм

1






2024 © sdelano-krasnodar.ru.