Сегодня я покажу, как просто добавить в систему вашего умного дома модуль, который позволит очень просто получить информацию о текущем энергопотреблении.
Для этого нам потребуется Energy Monitor Shield (EM Shield):
Возможности этого устройства достаточно обширны:
Второй параметр - значение калибровки (масштаб). Этот параметр вы можете сами менять, чтобы подстроить "измеритель" на более адекватные значения (например, замерив потребление электричества, например, лампочки в 100Вт).
Но этого еще чуть-чуть не хватает для нормального использования. Необходимо еще убрать "постоянную составляющую" (иначе датчик, который просто подключен, но не "накинут" на провод будет выдавать ненулевой ток). Связано это с неидеальностью элеметов измерительного тракта, но это легко обходится простейшей калибровкой.
Калибровка делается следующим образом: в функции setup присутствует цикл, в котором производится ряд измерений (при которых датчик должен быть подключен в соответствующий разъем, но не "накинут" на провод). Дальше эти значения усредняются и на их основании считается значение параметра delta, который как раз скомпенсирует постоянную составляющую. Во время этого процесса на экране выводится надпись "Calibrating".
Примечание: вы можете самостоятельно доработать скетч таким образом, чтобы этот поправочный коэффициент не вычислялся при каждом запуске модуля, а например, сохранялся бы в EEPROM и при последующих загрузках сразу оттуда бы считывался (без процесса калибровки). Другой вариант решения - вести значение этого параметра в монитор порта (или на дисплей), а после этого - прописать его значение непосредственно в скетче.
Дальше все согласно примера из библиотеки EmonLib - вычисляем значение тока (параметр sIrms) и потребляемой мощности (Pcur).
Эти данные полезно вывести на наш экран для оперативного контроля.
С измерениями и отображением данных все понятно - осталось только организовать беспроводную передачу данных.
Дадим нашему модулю SID=400.
Структура, описывающая наш "энергетический" модуль будет следующая:
Теперь нужно убедиться, что в эфир регулярно отправляются данные.
Для этого воспользуемся "старым знакомым" iBoard (эта плата нам очень пригодится в следующий раз - на ее основе организуем логирование данных от датчиков):
Для этого нам потребуется Energy Monitor Shield (EM Shield):
Возможности этого устройства достаточно обширны:
- Подключение до 3 датчиков тока
- Интерфейс для подключения популярного дисплея (типа Nokia 5110)
- Интерфейс для подключения трансивера nRF24l01+
- Две тактовые кнопки
- I2C-интерфейс для подключения дополнительных датчиков
- Полная совместимость с Ethernet Shield
Особенно радует комплект поставки этого шилда:
Помимо собственно шилда в комплекте идет дисплей и RF-модуль.
Шилд работает с любой ардуино-совместимой платой. Я все буду реализовывать на базе ардуино с 328 "камушком".
За основу принципов радиообмена возьмем уже знакомый пример: Shield MaTrix и Sensor Node - его и расширим.
С основопологающими принципами работы с токовым датчиком можно ознакомиться по следующей ссылке.
Для работы с токовым датчиком потребуется библиотека EmonLib.
Чтобы не томить читателей, сразу выкладываю ссылку на архив со скетчем и необходимыми библиотеками.
Примечание: наше изделие не будет являться каким-либо особенно точным прибором, но даст вполне адекватную качественную ("больше-меньше") оценку энергопотребления.
У меня в хозяйстве датчик тока только один (да и питание во всем доме однофазное), поэтому в этом примере буду использовать только один канал измерения.
Инициализация этого канала измерения происходит следующим образом:
emon1.current(0, 111.1);При этом, первый параметр (0) - это аналоговый пин, который используется для измерения (А0 в моем случае, вы можете задействовать еще A1 (второй канал) и A2 (третий канал измерения)).
Второй параметр - значение калибровки (масштаб). Этот параметр вы можете сами менять, чтобы подстроить "измеритель" на более адекватные значения (например, замерив потребление электричества, например, лампочки в 100Вт).
Но этого еще чуть-чуть не хватает для нормального использования. Необходимо еще убрать "постоянную составляющую" (иначе датчик, который просто подключен, но не "накинут" на провод будет выдавать ненулевой ток). Связано это с неидеальностью элеметов измерительного тракта, но это легко обходится простейшей калибровкой.
Калибровка делается следующим образом: в функции setup присутствует цикл, в котором производится ряд измерений (при которых датчик должен быть подключен в соответствующий разъем, но не "накинут" на провод). Дальше эти значения усредняются и на их основании считается значение параметра delta, который как раз скомпенсирует постоянную составляющую. Во время этого процесса на экране выводится надпись "Calibrating".
Примечание: вы можете самостоятельно доработать скетч таким образом, чтобы этот поправочный коэффициент не вычислялся при каждом запуске модуля, а например, сохранялся бы в EEPROM и при последующих загрузках сразу оттуда бы считывался (без процесса калибровки). Другой вариант решения - вести значение этого параметра в монитор порта (или на дисплей), а после этого - прописать его значение непосредственно в скетче.
Дальше все согласно примера из библиотеки EmonLib - вычисляем значение тока (параметр sIrms) и потребляемой мощности (Pcur).
Эти данные полезно вывести на наш экран для оперативного контроля.
С измерениями и отображением данных все понятно - осталось только организовать беспроводную передачу данных.
Дадим нашему модулю SID=400.
Структура, описывающая наш "энергетический" модуль будет следующая:
Parameter MySensors[NumSensors+1] = { // описание датчиков (и первичная инициализация)Как видно, в пакете передаваемых данных мы передаем как значение тока, так и потребляемой мощности (вообще можно передавать только один параметр, так как второй однозначно можно рассчитать по формуле, но мы экономить на этом несколько байт не будем).
NumSensors, "EM", // в поле "комментарий" указываем пояснительную информацию о датчике и количество сенсоров
0, "I, A", // ток
0, "P, kVt", // потребляемая мощность
};
Message sensor;
Теперь нужно убедиться, что в эфир регулярно отправляются данные.
Для этого воспользуемся "старым знакомым" iBoard (эта плата нам очень пригодится в следующий раз - на ее основе организуем логирование данных от датчиков):
Сегодня же на базе этой платы реализуем "слухача" - плата будет просто выводить в монитор порта все полученные радио-данные.
Скетч для iBoard тоже находится в архиве.
Если все сделано правильно, то в мониторе начнут выводиться соответствующие данные. Выглядит это примерно так:
В каждой строчке выводится следующая информация:
- Номер датчика
- Номер параметра
- Значение параметра
- Комментарий
Таким образом, мы видим, что наш "слухач" отлично справляется с поставленной задачей и с его помощью мы принимаем данные не только с модуля мониторинга энергопотребления, но и с погодных (подробнее о них - в предыдущем посте).
Продолжение следует...
Полезная информация:
Добрый день! По этой статье http://habrahabr.ru/post/215419/ реализовал прием-передачу данных от удаленного узла на домашний сервер. Все работает замечательно, кроме одного - сторожевого таймера на iBoard. На arduino pro mini я успешно обновил загрузчик на optiboot, с ней проблем нет. А вот в iBoard штатный бутлоадер не корректно обрабатывает сторожевой таймер. Расскажите, как побороть его? Какие фьюзы выставить и какой бутлоадер залить? Спасибо.
ОтветитьУдалитьДобрый день!
ОтветитьУдалитьiBoard - это обычная атмега328, работающая на 16МГц.
Бутлоадер подойдет optiboot, фьюзы точно такие же, как для Duemilanove 328
Я считывал дефолтные фьюзы у iBoard. И они заметно отличаются от фьюзов для Duemilanove 328. Этот момент меня и смутил, поэтому не стал сходу перешивать. Возникают два вопроса. Первый, IBoard работает на 3.3В, а Duemilanove 328 на 5В - если выставить такие фьюзы на iBoard, она продолжит работать на 3.3В? И второй вопрос - optiboot имеет размер 512Б, а в Duemilanove 328 стоит загрузчик в 2Кб, вроде, логично, что в виду этого фьюзы тоже должны отличаться?
ОтветитьУдалитьИзменение фьюзов никак не повлияют на схему питания МК на iBoard :)
ОтветитьУдалитьберите фьюзы от "[optiboot] Arduino Duemilanove 328" - все будет работать, заодно еще и 1.5к дополнительной памяти на скетчи будет.
Под связью между фьюзами и питанием я подразумевал порог монитора питания - Brown-out detection level at VCC=4.3V, Brown-out detection level at VCC=2.7V. То, что фьюзы не повлияют на схему питания, это я понимаю. :)
ОтветитьУдалитьСпасибо за ответы. Буду пробовать бутлоадер "[optiboot] Arduino Duemilanove 328".
Спасибо за ответы. Буду пробовать загрузчик "[optiboot] Arduino Duemilanove 328".
ОтветитьУдалитьP.S.: под связью между фьюзами и напряжением питания МК имел в виду порог монитора питания (BODLEVEL2, BODLEVEL1, BODLEVEL0).
Помогите пожалуйста со скетчем.
ОтветитьУдалитьПриобрел Energy Monitor Shield, залил скетч из приложеных тут файлов, все ок.
Тк iBoard нету, взял arduino nano и nRF24l01+.
Залил в него скетч от iBoard заменив на библиотеку:
#include "iBoardRF24.h" на #include "RF24.h"
и пины как у меня подключено:
RF24 radio(9,10); (было iBoardRF24 radio(3,8,5,6,7,2);)
Более ничего не менял.
Не принимает.