понедельник, 24 марта 2014 г.

Energy Monitor Shield - беспроводной энергомониторинг

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

Для этого нам потребуется Energy Monitor Shield (EM Shield):

Возможности этого устройства достаточно обширны:

  1. Подключение до 3 датчиков тока
  2. Интерфейс для подключения популярного дисплея (типа Nokia 5110)
  3. Интерфейс для подключения трансивера nRF24l01+
  4. Две тактовые кнопки
  5. I2C-интерфейс для подключения дополнительных датчиков
  6. Полная совместимость с 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 тоже находится в архиве

Если все сделано правильно, то в мониторе начнут выводиться соответствующие данные. Выглядит это примерно так:
В каждой строчке выводится следующая информация:
  • Номер датчика
  • Номер параметра
  • Значение параметра
  • Комментарий
Таким образом, мы видим, что наш "слухач" отлично справляется с поставленной задачей и с его помощью мы принимаем данные не только с модуля мониторинга энергопотребления, но и с погодных (подробнее о них - в предыдущем посте).

Продолжение следует...

Полезная информация:

7 комментариев:

  1. Добрый день! По этой статье http://habrahabr.ru/post/215419/ реализовал прием-передачу данных от удаленного узла на домашний сервер. Все работает замечательно, кроме одного - сторожевого таймера на iBoard. На arduino pro mini я успешно обновил загрузчик на optiboot, с ней проблем нет. А вот в iBoard штатный бутлоадер не корректно обрабатывает сторожевой таймер. Расскажите, как побороть его? Какие фьюзы выставить и какой бутлоадер залить? Спасибо.

    ОтветитьУдалить
  2. Добрый день!
    iBoard - это обычная атмега328, работающая на 16МГц.
    Бутлоадер подойдет optiboot, фьюзы точно такие же, как для Duemilanove 328

    ОтветитьУдалить
  3. Я считывал дефолтные фьюзы у iBoard. И они заметно отличаются от фьюзов для Duemilanove 328. Этот момент меня и смутил, поэтому не стал сходу перешивать. Возникают два вопроса. Первый, IBoard работает на 3.3В, а Duemilanove 328 на 5В - если выставить такие фьюзы на iBoard, она продолжит работать на 3.3В? И второй вопрос - optiboot имеет размер 512Б, а в Duemilanove 328 стоит загрузчик в 2Кб, вроде, логично, что в виду этого фьюзы тоже должны отличаться?

    ОтветитьУдалить
  4. Изменение фьюзов никак не повлияют на схему питания МК на iBoard :)
    берите фьюзы от "[optiboot] Arduino Duemilanove 328" - все будет работать, заодно еще и 1.5к дополнительной памяти на скетчи будет.

    ОтветитьУдалить
  5. Под связью между фьюзами и питанием я подразумевал порог монитора питания - Brown-out detection level at VCC=4.3V, Brown-out detection level at VCC=2.7V. То, что фьюзы не повлияют на схему питания, это я понимаю. :)

    Спасибо за ответы. Буду пробовать бутлоадер "[optiboot] Arduino Duemilanove 328".

    ОтветитьУдалить
  6. Спасибо за ответы. Буду пробовать загрузчик "[optiboot] Arduino Duemilanove 328".

    P.S.: под связью между фьюзами и напряжением питания МК имел в виду порог монитора питания (BODLEVEL2, BODLEVEL1, BODLEVEL0).

    ОтветитьУдалить
  7. Помогите пожалуйста со скетчем.
    Приобрел 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);)
    Более ничего не менял.
    Не принимает.

    ОтветитьУдалить