Оглавление:

Подключаем Ардуино К Счётчику Подключение Arduino для считывания импульсных данных с электрического счетчика: 20 шагов
Подключаем Ардуино К Счётчику Подключение Arduino для считывания импульсных данных с электрического счетчика: 20 шагов

Видео: Подключаем Ардуино К Счётчику Подключение Arduino для считывания импульсных данных с электрического счетчика: 20 шагов

Видео: Подключаем Ардуино К Счётчику Подключение Arduino для считывания импульсных данных с электрического счетчика: 20 шагов
Видео: Снимаем показания с электросчетчика с помощью Arduino 2024, Ноябрь
Anonim
Подключаем Ардуино К Счётчику / Подключение Arduino для считывания импульсных данных с электрического счетчика
Подключаем Ардуино К Счётчику / Подключение Arduino для считывания импульсных данных с электрического счетчика

Мне давно было интересно посмотреть как мощность в домашней электро-цепи в разное время суток и при разном потреблении. Складывать ватты всех лампочек - скучно и, увы, не факт, что точно. Во всяком случае, что там думает себе счётчик - всегда не очень наглядно. Висит на стене. Мигает. Барабаны крутятся очень медленно, чтобы ощутить разницу в 100 Вт.:)

Шаг 1: Теория / Теория

Теория / Теория
Теория / Теория

Как рассказывает о принципе работы электросчётчиков в своей статье Astrei, самый первый счетчик электроэнергии был индукционным. Принцип его работы до смешного прост - по сути это электродвигатель, ротором которого является алюминиевый вращающий циферблат. Чем больше потребляемый ток- тем быстрее крутится диск. Устройство чисто аналоговое. Однако сегодня индукционные счетчики сдают свои позиции, уступая место более дешевым электронным собратьям.

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

Шаг 2: Электро-механический Счётчик / Электромеханический счетчик

Электро-механический Счётчик / Счетчик электромеханический
Электро-механический Счётчик / Счетчик электромеханический

На моём подопытном счётчике есть светодиодный индикатор импульсов «Сеть» и рядом указано, 1кВт * ч набегает за 6400 импульсов.

Это значит, что 1 импульс равен 1/6400 кВт или 1000/6400 = 0,015625 Вт * В.

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

Шаг 3: Материальная База / Материал, который я использовал

Материальная База / Материал, который я использовал
Материальная База / Материал, который я использовал

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

  1. Ардуино нано
  2. Дисплей аналог Hitachi LCD 20x2
  3. Светодиод с резистором для индикации считывания и буззер с генератором для оповещения о слишком высоком потреблении.
  4. Фоторезистор
  5. Макетная плата, макетная плата и всякие проводки / перемычки, резисторы, конденсаторы, чтобы это всё соеденить.

Шаг 4: 1. Arduino Nano

1. Arduino Nano
1. Arduino Nano

1. Я использовал arduino nano, потому что она очень маленькая, дешёвая, имеет встроенный USB для удобной отладки и прошивки, а так же её коммуникационных способностей для моего проекта. Ну а так же, поскольку именно такая плата у меня освободилась от прошлого проекта.:)

Шаг 5: 2. Дисплей / Дисплей

2. Дисплей / Дисплей
2. Дисплей / Дисплей

2. Дисплей Barton BT22005VSS-09 является аналогом дисплея Hitachi LCD 20x2 и отличается расположением выводов в гребёнке 8х2.

Шаг 6: Подключение Дисплея / Display Wiring

Подключение Дисплея / Display Wiring
Подключение Дисплея / Display Wiring

Я подключил дисплей к arduino по 5-проводной шине, как описано ЗДЕСЬ. Линию данных D4-7 к контактам D5-2 arduino, RS к D12, EN к D11, а R / W на GND.

Управление дисплеем я поручил библиотеке LiquidClystall из стандартного набора в Arduino IDE.

Шаг 7: 3. Светодиод И Буззер / LED и ЗУММЕР

3. Светодиод И Буззер / LED и ЗУММЕР
3. Светодиод И Буззер / LED и ЗУММЕР
3. Светодиод И Буззер / LED и ЗУММЕР
3. Светодиод И Буззер / LED и ЗУММЕР

3. К ножке D13 arduino я подключил светодиодную индикацию с последовательным резистором на GND, который будет дублировать светодиод на счётчике. К ножке D10 arduino подключил буззер (пьезо-пищалку с генератором частоты), который будет пищать на высоком уровне на этой ножке для слишком высокого потребления.

Шаг 8: 4. Фото-сенсор / Светочувствительный элемент (фоторезистор)

4. Фото-сенсор / Светочувствительный элемент (фоторезистор)
4. Фото-сенсор / Светочувствительный элемент (фоторезистор)
4. Фото-сенсор / Светочувствительный элемент (фоторезистор)
4. Фото-сенсор / Светочувствительный элемент (фоторезистор)

4. Фоторезистор ФСК-1 подключил к аналоговому входу A1 и к + 5в. При этом, прижав ножку входа A1 к GND резистором 10к.

Без этого резистора потенциала входа спадал очень медленно, что мешало снимать показания.

Шаг 9: Программа для Arduino / Кодирование Arduino

Image
Image

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

Шаг 10: Начнём Со Статистического Поиска Ширины Окна / Получение ширины окна для инициализации

Определим Состояние Индикатора / Взгляни на логику
Определим Состояние Индикатора / Взгляни на логику

Чтобы найти момент (начало загорания или потухания индикатора счётчике) и привязать к нему таймер соединения между двумя одинаковыми переходами (далее - длина импульса), нужно было опереться хоть на что-то.

В качестве такой опоры я написал функцию инициализации initWindow, вызывая её единожды в цикле setup ().

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

Шаг 11: Определим Состояние Индикатора / Взгляните на логику

Определим Состояние Индикатора / Взгляни на логику
Определим Состояние Индикатора / Взгляни на логику

Теперь я могу сравнивать текущее значение с помощью этого порогами и написать функцию определения состояния индикатора checkLogic, которая следит за тем, как соотносятся текущие показания сенсора к пороговым значениям при сборе с индикатора. Эта функция присваивает значение ledState TRUE при показаниях сенсора выше верхнего порога с припуском (минус значение 30% ширины окна), и FALSE, когда показания сенсора ниже нижнего порога (плюс 30% ширины окна).

Шаг 12: цикл ()

Петля()
Петля()

Таким образом, в основном цикле программы я сперва считываю значение сенсора, затем, на всякий случай, расширяю окно до его значений, старое состояние индикатора ledState копирую в буфер ledStateOld, и провожу анализ нового состояния индикатора, вызвав функцию checkLogic (ledState).

Шаг 13: Переход Вверх Или Начало Импульса / Impulse Head

Переход Вверх Или Начало Импульса / Impulse Head
Переход Вверх Или Начало Импульса / Impulse Head

Если идикатор горел и вдруг погас (его обычное состояние - гореть, а начало импульса - это кратковременное погасание) - значит, счётчик сообщил о начале импульса.

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

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

В случае, если нагрузка выше некоторой пороговой, я включал буззер.

Так же в момент перехода «вверх» я привязал функции вывода данных на дисплей, поскольку он сильно мерцал при больших частотах обновления данных на нём.---

«Но ведь в одном часе 3’600’000’000 микросекунд, а не 3’600’000’000’000» - заметят мне внимательные. И будут правы. Лишние три нуля - это самое умножение на 1000, для перевода из кВт в W. Иначе компилятор ругается на сликом большие величины, компилирует, но в итоге программа не сообщает значения. Пришлось как-то выкручиваться.

Шаг 14: Переход Вниз, Или Продолжение Отсчёта / Impulse Tail

Переход Вниз, Или Продолжение Отсчёта / Impulse Tail
Переход Вниз, Или Продолжение Отсчёта / Impulse Tail
Переход Вниз, Или Продолжение Отсчёта / Impulse Tail
Переход Вниз, Или Продолжение Отсчёта / Impulse Tail

К “переходу вниз” я привязал отключение диода индикации и буззера, таким образом, частота пищания буззера соответствует частоте мигания индикатора счётчика.

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

Шаг 15: Индикация / Просмотр данных

Индикация / Просмотр данных
Индикация / Просмотр данных

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

А цифровой дисплей на 20x2 символов я захотел использовать по-полной.:) Во время загрузки при сборе статистики в одну строку дисплея я вывожу 3 значения: низ окна, значение сенсора и верх окна. Эту же информацию отображаю во второй строке ширины в окне.

В рабочем цикле я в одну строку вывожу ток (мощность / 220), мощность (мощность) и ширину шкалы, а в другую строку - саму шкалу, масштаб изменяется в зависимости от того, не превышен ли порог. Так при пороге в 1000 Вт и шкала 0–1000 в нормальном режиме и 1000–2000 в режиме превышения.

Шаг 16: Шкала От 0 До 99 На 20 Символьной Строке И Знакогенератор / Progressbar 100px

Шкала От 0 До 99 На 20 Символьной Строке И Знакогенератор / Progressbar 100px
Шкала От 0 До 99 На 20 Символьной Строке И Знакогенератор / Progressbar 100px

Цифры на дисплее довольно мелкие и их сложно разглядеть издалека. Поэтому на каком-то этапе я решил использовать одну из строк дисплея как шкалу. Каждое знакоместо может содержать в себе один символ: цифру, букву или знак. В таком случае я могу без труда link шкалу с ценой деления в одно знакоместо. Т.е. у меня будет 20 делений.

Мне показалось, что это маловато для дисплея, у которого по факту целых 100 пикселей в одном ряду, ведь каждое знакоместо - это квадрат из 5 столбиков по 7 пикселей высотой. Итого, в одной строке у меня целых 100 столбиков. На шкале длиной в 1 кВт я могу link шкалу с ценой деления 10 Вт. А это уже довольно наглядное разрешение.

Я решил использовать этого дисплея создать пользовательские символы. В arduino IDE имеется стандартный пример создания произвольных символов. (и замечательное руководство по этой задаче я нашёл в интернете)

Шаг 17:

Изображение
Изображение
Изображение
Изображение

Сперва я описал эти символы.

Здесь можно увидеть, что один символ имеет вертикальную черту слева, а второй - уже две черты

Потом нужно проинитить их в цикле setup () так же, как и в примере из ардуино (Первые 5 символов (0-4) я использую для «палочкой».)

Шаг 18:

Изображение
Изображение

Затемняющая функция, которая при помощи карты составляет пропорцию для нахождения символа и его места на шкале.

Далее я уже использовал эту функцию для вывода шкалы во всех нужных местах.

Шаг 19: Послесловие / Outro

Я проверил работоспособность данного девайса, и когда он работает, изготовил печатную плату, которая вешается на дисплей, и в котором есть слот для установки arduino nano. Теперь я с лёгкостью могу использовать дисплей или Arduino в других проектах, или же вернуть их в эту плату, и получить сразу же работающий счётчик мощности.

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

Шаг 20: Исходник Программы / Исходный код для Arduino

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

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

Рекомендуемые: