Товары из Китая

Беспроводной датчик освещенности и удара на nRF52840


Беспроводной датчик освещенности и удара на nRF52840

Приветствую читателей блога MYSKU! В сегодняшней статье хочу поделиться с вами новым датчиком освещенности и удара(вибрации). Данный датчик работает на модуле E73-2G4M08S1C стоимостью$3,4. На модуле E73-2G4M08S1C установлен довольно перспективный МК nRF52840. Поводом к его освоению стало довольно несложное добавление поддержки в Arduino IDE, небольшая стоимость, отличные характеристики и возможность в дальнейшем безболезненно перейти с MySensors например на ZigBee :).

Беспроводной датчик освещенности и удара на nRF52840

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

Первоначально планировал использовать сенсор BH1750FVI, характеристики данного сенсора устраивали, он не раз ранее применялся в других моих diy проектах. Но в какой-то момент при обсуждении всяких сенсоров один из соратников предложил присмотреться к сенсору MAX44009. Я присмотрелся и с этого момента больше никогда не вспоминал про BH1750FVI.

Беспроводной датчик освещенности и удара на nRF52840

Характеристики MAX44009:

Диапазон питающих напряжений 1,7-3,6 В,

Cверхнизким рабочий ток — 0,65 мкА (ниже тока в режиме Power Down у многих аналогичных продуктов),

Широкий 22-разрядный динамический диапазон 0,045-188000,

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

Так же захотелось универсальности или какого-то немного расширенного функционала, немного подумав решил добавить в проект акселерометр который бы работал как датчик вибрации. Это позволит добавить охранный функционал датчику. В моем случае на основе события с датчика будет срабатывать сценарий в УД имитирующий присутствие в доме(включать свет в комнатах), при активированном режиме — никого нет дома. В целом датчик можно использовать и как самостоятельный датчик удара, можно напаивать только датчик света или только акселерометр. Акселерометр так же можно перепрограммировать так же на распознавания тапов, поворотов и тп.

В качестве акселерометра был выбран сенсор LIS2DW12 это один из самых экономичных акселерометров на рынке, если не самый экономичный.

Беспроводной датчик освещенности и удара на nRF52840

Характеристики LIS2DW12:

Диапазон питающих напряжений 1.62-3.6 В,

50 нA в режиме ожидания,

1 мкA в режиме пониженного энергопотребления,

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

Позднее была добавлена поддержка другой модели акселерометра LIS2DH12 со схожими характеристиками, но более высоким потреблением в режиме пониженного энергопотребления — 2мкА. Поводом стало полное отсутствие готовых Arduino библиотек для акселерометра LIS2DW12 и как следствие возможные проблемы для тех кто решит повторить проект, но захочет что-то изменить в ПО. Для акселерометров LIS2DH12 есть неплохие Arduino библиотеки.

Питается датчик освещенности от батарейки CR2032.

Беспроводной датчик освещенности и удара на nRF52840

Беспроводной датчик освещенности и удара на nRF52840

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

В этом проекте я постарался минимизировать эти недостатки.

Самое основное с чем хотелось разобраться это с прерываниями. Стандартно при активации прерываний, МК nRF52 начинает потреблять +10мКА к потреблению самого МК (от 1.4мкА у nRF52810-52811 и до 4.7мкА у nRF52832-52840). Всего доступно 2 прерывания.

int8_t sleep(const uint8_t interrupt1, const uint8_t mode1, const uint8_t interrupt2,

const uint8_t mode2, const uint32_t sleepingMS = 0, const bool smartSleep = false);

Ранее в поисках решений оптимизации потребления во сне, была реализована возможность использования прерываний на встроенном низко потребляющем компараторе, потребление во сне было уже не +10мкА, а в районе +1 мкА, но прерывание возможно было использовать только одно. В принципе не считая неудобство в коде(обработка сигналов с дополнительных пинов) и лишних элементов на плате(диоды) это было хорошее решение. Но хотелось еще лучше.

К этому времени я уже был немного знаком:) nRF5 SDK, поэтому после штудирования форума mysensors.org(подсказки, наводки :)) решение решил поискать там.… и нашел. Теперь стало доступным неограниченное количество прерываний которые практически ничего дополнительно не потребляют. Основное что надо сделать это внести небольшое изменение в код библиотеки Sandeepmistry nRF5, в файл WInterrupts.с перед функцией GPIOTE_IRQHandler() добавить атрибут «weak» который позволит переопределить эту библиотечную функцию в пользовательском коде — __attribute__ ((weak))

Беспроводной датчик освещенности и удара на nRF52840

Файл находится по пути — C:UsersЮЗЕРAppDataLocalArduino15packagessandeepmistryhardwarenRF5


СМОТРИ ТАКЖЕ

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *