
Оглавление:
- Шаг 1: Теория / Теория
- Шаг 2: Электро-механический Счётчик / Электромеханический счетчик
- Шаг 3: Материальная База / Материал, который я использовал
- Шаг 4: 1. Arduino Nano
- Шаг 5: 2. Дисплей / Дисплей
- Шаг 6: Подключение Дисплея / Display Wiring
- Шаг 7: 3. Светодиод И Буззер / LED и ЗУММЕР
- Шаг 8: 4. Фото-сенсор / Светочувствительный элемент (фоторезистор)
- Шаг 9: Программа для Arduino / Кодирование Arduino
- Шаг 10: Начнём Со Статистического Поиска Ширины Окна / Получение ширины окна для инициализации
- Шаг 11: Определим Состояние Индикатора / Взгляните на логику
- Шаг 12: цикл ()
- Шаг 13: Переход Вверх Или Начало Импульса / Impulse Head
- Шаг 14: Переход Вниз, Или Продолжение Отсчёта / Impulse Tail
- Шаг 15: Индикация / Просмотр данных
- Шаг 16: Шкала От 0 До 99 На 20 Символьной Строке И Знакогенератор / Progressbar 100px
- Шаг 17:
- Шаг 18:
- Шаг 19: Послесловие / Outro
- Шаг 20: Исходник Программы / Исходный код для Arduino
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-23 15:05

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

Как рассказывает о принципе работы электросчётчиков в своей статье Astrei, самый первый счетчик электроэнергии был индукционным. Принцип его работы до смешного прост - по сути это электродвигатель, ротором которого является алюминиевый вращающий циферблат. Чем больше потребляемый ток- тем быстрее крутится диск. Устройство чисто аналоговое. Однако сегодня индукционные счетчики сдают свои позиции, уступая место более дешевым электронным собратьям.
Принцип работы не сильно изменился - в данном случае диск заменен электроникой, которая генерирует импульссы в соответствии с величиной модуляемой электроэнергии. Как правило, в большинстве приборов эти импульсы показывает светодиодный индикатор. Соответственно, чем быстрее мигает эта лампочка - тем больше сжигается драгоценных кВт. Кроме того, на лицевой панели любого устройства есть передаточное соотношение счетчика А - число импульсов на 1 кВт * ч.
Шаг 2: Электро-механический Счётчик / Электромеханический счетчик

На моём подопытном счётчике есть светодиодный индикатор импульсов «Сеть» и рядом указано, 1кВт * ч набегает за 6400 импульсов.
Это значит, что 1 импульс равен 1/6400 кВт или 1000/6400 = 0,015625 Вт * В.
Если я сосчитаю время между двумя импульсами, то могу узнать среднюю нагрузку на сеть за этот период.
Шаг 3: Материальная База / Материал, который я использовал

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

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

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

Я подключил дисплей к arduino по 5-проводной шине, как описано ЗДЕСЬ. Линию данных D4-7 к контактам D5-2 arduino, RS к D12, EN к D11, а R / W на GND.
Управление дисплеем я поручил библиотеке LiquidClystall из стандартного набора в Arduino IDE.
Шаг 7: 3. Светодиод И Буззер / LED и ЗУММЕР


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


4. Фоторезистор ФСК-1 подключил к аналоговому входу A1 и к + 5в. При этом, прижав ножку входа A1 к GND резистором 10к.
Без этого резистора потенциала входа спадал очень медленно, что мешало снимать показания.
Шаг 9: Программа для Arduino / Кодирование Arduino


При считывании данных с аналогового пина я столкнулся с проблемой уровня сигнала. Ведь напряжение на входе зависит от сопротивления фоторезистора, которое меняется в зависимости от освещённости. Корпус счётчика не позволяет установить сенсор так, чтобы комнатный свет не попадал на сенсор. В общем, так как я не программист, я столкнулся с непростой для себя.
Шаг 10: Начнём Со Статистического Поиска Ширины Окна / Получение ширины окна для инициализации

Чтобы найти момент (начало загорания или потухания индикатора счётчике) и привязать к нему таймер соединения между двумя одинаковыми переходами (далее - длина импульса), нужно было опереться хоть на что-то.
В качестве такой опоры я написал функцию инициализации initWindow, вызывая её единожды в цикле setup ().
При старте микроконтроллер сперва 5 секунд следит за показаниями сенсора, запоминая его предельные верхние и нижние уровни показаний соответствующие переменные порогов окна winHi и winLo.
Шаг 11: Определим Состояние Индикатора / Взгляните на логику

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

Таким образом, в основном цикле программы я сперва считываю значение сенсора, затем, на всякий случай, расширяю окно до его значений, старое состояние индикатора ledState копирую в буфер ledStateOld, и провожу анализ нового состояния индикатора, вызвав функцию checkLogic (ledState).
Шаг 13: Переход Вверх Или Начало Импульса / Impulse Head

Если идикатор горел и вдруг погас (его обычное состояние - гореть, а начало импульса - это кратковременное погасание) - значит, счётчик сообщил о начале импульса.
К этой проверке я привязал таймер, построенный на функции микросхемы. Она возвращает количество микросекунд, прошедших с момента старта arduino. Осталось только из «текущего времени» вычесть «время перехода» и получить количество микросекунд между переходами, а это и есть длина импульса.
Затем я использовал количество импульсов для нагрузки 1 кВт, что соответствует средней нагрузке за последнее время импульса.
В случае, если нагрузка выше некоторой пороговой, я включал буззер.
Так же в момент перехода «вверх» я привязал функции вывода данных на дисплей, поскольку он сильно мерцал при больших частотах обновления данных на нём.---
«Но ведь в одном часе 3’600’000’000 микросекунд, а не 3’600’000’000’000» - заметят мне внимательные. И будут правы. Лишние три нуля - это самое умножение на 1000, для перевода из кВт в W. Иначе компилятор ругается на сликом большие величины, компилирует, но в итоге программа не сообщает значения. Пришлось как-то выкручиваться.
Шаг 14: Переход Вниз, Или Продолжение Отсчёта / Impulse Tail


К “переходу вниз” я привязал отключение диода индикации и буззера, таким образом, частота пищания буззера соответствует частоте мигания индикатора счётчика.
Так же туда прикручена функция сужения окна closeAnalogWindow, которая с каждым импульсом опускает верхний порог сенсора и увеличивает нижний. Таким образом не позволяет порогам бесконтрольно «разползтись» от факторов внешнего освещения.
Шаг 15: Индикация / Просмотр данных

Со светодиодом всё предельно просто: он загорается при переходе вверх и гаснет при переходе вниз, тем самым дублируя прикрытый сенсором светодиод на счётчике. Буззер привязан таким же образом, лишь с тем отличием, что включается он лишь при превышении порогового значения нагрузки.
А цифровой дисплей на 20x2 символов я захотел использовать по-полной.:) Во время загрузки при сборе статистики в одну строку дисплея я вывожу 3 значения: низ окна, значение сенсора и верх окна. Эту же информацию отображаю во второй строке ширины в окне.
В рабочем цикле я в одну строку вывожу ток (мощность / 220), мощность (мощность) и ширину шкалы, а в другую строку - саму шкалу, масштаб изменяется в зависимости от того, не превышен ли порог. Так при пороге в 1000 Вт и шкала 0–1000 в нормальном режиме и 1000–2000 в режиме превышения.
Шаг 16: Шкала От 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 можно скачать здесь. Возможно, он претерпел небольшие изменения, покуда я писал обзор, но код часто коментирован и в нём не составляет труда разобраться, особенно после коментариев из этой статьи.
Спасибо всем, кто дочитал до конца, надеюсь, этот урок поможет вам разобраться с программными и аппаратными средствами разработки на микроконтроллерах.
Рекомендуемые:
Использование импульсных соленоидов с Wemos D1 Mini и H-Bridge для орошения: 7 шагов

Использование импульсных соленоидов с Wemos D1 Mini и H-Bridge для ирригации: для этой инструкции я хотел создать решение, чтобы я мог удаленно включать спринклерную систему или автоматически поливать мои саженцы. Я собираюсь использовать wemos D1 для управления импульсные соленоиды. Эти соленоиды потребляют гораздо меньше энергии, потому что когда они получают
Система сбора и визуализации данных для электрического гоночного велосипеда MotoStudent: 23 шага

Система сбора и визуализации данных для электрического гоночного велосипеда MotoStudent: система сбора данных - это совокупность аппаратного и программного обеспечения, работающих вместе, чтобы собирать данные с внешних датчиков, хранить и обрабатывать их впоследствии, чтобы их можно было визуализировать графически и анализировать, позволяя инженерам сделать
Правильное подключение светодиодов: последовательное и параллельное подключение: 6 шагов

Правильная разводка светодиодов: последовательное и параллельное соединение: в этой инструкции мы говорим о светодиодах - светоизлучающих диодах и о том, как мы можем их подключить, если у нас есть несколько устройств. Это один урок, который я хотел бы знать с самого начала, потому что, когда я начал возиться с электронными схемами, я построил несколько
Tfcd 3D-отслеживание движения посредством емкостного считывания и вывода светодиодов: 6 шагов (с изображениями)

Трехмерное отслеживание движения Tfcd с помощью емкостного датчика и вывода светодиода. В этой инструкции объясняется, как можно отслеживать движение руки в трехмерном пространстве с использованием принципа емкостного измерения. Изменив расстояние между заряженной алюминиевой фольгой и вашей рукой, емкость конденсатора изменится
Используйте подключение для передачи данных вашего iPhone на вашем компьютере: 6 шагов

Используйте подключение для передачи данных вашего iPhone на вашем компьютере: ПРИМЕЧАНИЕ. Начиная с iOS 3 и 4, есть другие способы подключения, даже законный, через AT&T (хотя это требует дополнительных затрат). Этот метод все еще работает, и всегда будет (независимо от обновлений iOS), пока вы можете подключиться к своему iPhone по SSH. Иметь