Сканируем NFC-метки и получаем показания температуры, открываем гараж или делаем всё, что захочется.
Комплектующие
Мы будем использовать кит набор Photon от компании Particle.
- Photon от Particle
Фотон - набор для разработки с Wi-Fi для создания устройства с улучшенными возможностями и повышенной надежностью.
Далее мы поговорим том, как сканирование NFC-меток может отправлять команды на ваше оборудование. Конечно, у вас должен быть телефон с Android.
Что такое NFC?
NFC (англ. - Near Field Communications), буквально, коммуникация ближнего окружения. Возьмем определение NFC из руководства по Android API:
Применение NFC
Простейший вариант применения NFC-меток - использование телефона для сканирования. А уже сам телефон, в свою очередь, может что-то с этими данными сделать. Например, предположим, у вас есть NFC-метка на приборной панели вашего автомобиля, вы можете отсканировать её, чтобы перевести телефон в режим вождения или открыть приложение с картами. Подробнее про NFC можно почитать на androproblem.ru, например, про то, как производится оплата через NFC с телефона. Но давайте остановимся на самых популярных способах применения меток.
Включение компьютера по возвращении домой
Ожидание запуска компьютера, когда вы возвращаетесь домой, очень утомляет. А оставлять комп на целый день зачастую очень не экономно. Один пользователь решил эту проблему с помощью NFC метки, которую он сделал, чтобы удаленно включить свой компьютер, как только он возвращается домой. Для этого процесса требуется Tasker, приложение Wake on LAN Android App и ПК с поддержкой Wake up on LAN.
Активация Wi-Fi модема
Конечно, может быть не так сложно погрузиться в настройки вашего телефона и активировать модем Wi-Fi (если он у вас есть), но у кого есть время? Если вы хотите немного упростить процесс удаленной работы, вы можете создать NFC-метку, которая автоматически запустит процесс активации модема. Затем просто прикрепите её к краю ноутбука. Для этого всего нам пригодится NFC Task Launcher.
Делимся своим Wi-Fi паролем с гостями
Если вы похожи на меня, ваш пароль Wi-Fi такой же длинный и сложный. Вместо того, чтобы давать своим гостям листок бумаги с набросанными на нем буквами чувствительных к регистру символов, напишите пароль для метки NFC. Вообще есть несколько способов сделать это.
Можно использовать InstaWifi для простого обмена паролями Wi-Fi напрямую через NFC. Недостатком является то, что для этого всем вашим гостям должен быть установлен InstaWifi. Кроме того, вы можете сделать одну метку с вашим паролем Wi-Fi, и ваши гости смогут читать её с большинством приложений для чтения/записи NFC, например, вышеупомянутым NFC Task Launcher.
Как мы можем использовать NFC-метки
В нашем случае мы могли бы использовать NFC, чтобы заставить наш телефон отправлять команду нашему оборудованию.
В случае этой статьи мы можем использовать метку для управления воротами гаража. Когда происходит сканирование NFC-метки, приклеенной к внешней стороне ворот гаража, телефон посылает команду REST на Photon управляющий гаражом, и дверь открывается или закрывается. В ближайших наших планах сделать на сайте большой урок по управлению гаражными воротами, а сегодня мы остановимся на самой сути реализации проекта.
Процесс
Шаг 1
Установите приложения Trigger и Tasker на свой телефон. К сожалению, Tasker - это платное приложение, но если вы не готовы платить, то вы можете скачать бесплатную версию, которая подарит вам 7 дней радости.
Шаг 2
В приложении Tasker мы создаем задачу, которая отправит HTTP-запрос POST в Particle Cloud (облако), чтобы открыть или закрыть ворота гаража. В случае, если вы управляете не Particle, а другим компонентом, например, Raspberry Pi, вместо него будет отправлен HTTP-запрос.
Давайте создадим задачу. Откройте приложение Tasker и:
https://api.particle.io/v1/devices/<PARTICLE DEVICE ID>/garage_open
access_token=<YOUR PARTICLE ACCESS TOKEN>
Обратите внимание, что garage_open - это функция, которую мы хотим запустить с помощью запроса POST.
Шаг 3
В приложении Trigger мы создадим задачу для запуска задачи в Tasker. В конце создания задачи приложение попросит нас отсканировать NFC-метку, чтобы сохранить в неё задачу. Вот что мы делаем в приложении Trigger:
- Создаем новое задание
- Нажимаем «Далее» на экране «Добавить один или несколько триггеров» (англ. - Add one or more triggers)
- Добавляем действие
- Выбираем Tasker -> Tasker Task, затем "Далее" (Next)
- Нажимаем на лупу, чтобы вы могли выбрать задачу в Tasker
- Выбираем OpenGarage и нажмите «Добавить в задачу» (Add to task)
- Нажимаем "Готово" (Done)
- Нажимаем NFT в «Добавить один или несколько триггеров» (Add one or more triggers) и жмем Далее (Next)
- Нажимаем «Выполнить» в "Добавить ограничения -> Далее -> Далее -> Готово" (Add restrictions -> Next -> Next -> Done) (нет необходимости в секунде, переключите задачу)
- Сканируем свою метку NFC, чтобы сохранить в ней дату задачи
- Нажимаем "Готово" (Done) сверху
- Всё готово
Шаг 4
Код программы на C++ ниже. Эту программу мы будем применять в следующем нашем уроке по управлению воротами гаража с помощью NFC.
// IO mapping // D0 : relay: garage_BUTTON - this output is connected to the garage wall button or the garage remote // D1 : relay // D2 : relay // D3 : relay // D4 : garage_CLOSE : high means contact open (garage door opened), low means contact closed (garage door closed) // D5 : garage_OPEN : high means contact open (garage door opened), low means contact closed (garage door closed) // D6 : // D7 : // A0 : // A1 : // A2 : // A3 : // A4 : // A5 : // A6 : // A7 : #include "application.h" String _version = "0.01"; #define PUSHBULLET_NOTIF "pushbullet" #define GARAGE_READ_INTERVAL 1000 #define GARAGE_OPEN "open" #define GARAGE_CLOSED "closed" #define GARAGE_OPENING "opening" #define GARAGE_CLOSING "closing" #define GARAGE_NOTIF "GARAGE" unsigned long garage_interval = 0; int garage_BUTTON = D0; int garage_CLOSE = D4; int garage_OPEN = D5; String garage_status_string = "unknown"; void setup() { Particle.publish("device starting", "Firmware version: " + _version, 60, PRIVATE); pinMode(garage_BUTTON, OUTPUT); pinMode(garage_OPEN, INPUT_PULLUP); pinMode(garage_CLOSE, INPUT_PULLUP); bool success = Particle.function("garage_open", garage_open); if (not success) { Particle.publish("ERROR", "Failed to register function garage_open", 60, PRIVATE); } success = Particle.function("garage_stat", garage_stat); if (not success) { Particle.publish("ERROR", "Failed to register function garage_stat", 60, PRIVATE); } } void loop() { //read garage status every now and then if( millis() - garage_interval >= GARAGE_READ_INTERVAL ) { garage_read(); garage_interval = millis(); } } /******************************************************************************* * Function Name : garage_open * Description : garage_BUTTON goes up for one second * Return : 0 *******************************************************************************/ int garage_open(String args) { digitalWrite(garage_BUTTON, HIGH); delay(1000); digitalWrite(garage_BUTTON, LOW); return 0; } /******************************************************************************* * Function Name : garage_read() * Description : reads and publishes the status of the garage, intended for using it with a service like ifttt * Return : 0 *******************************************************************************/ int garage_read() { int open = digitalRead(garage_OPEN); int closed = digitalRead(garage_CLOSE); String previous_garage_status_string = garage_status_string; //input goes low when the reed switch is activated if ( not closed ) { garage_status_string = GARAGE_CLOSED; } //input goes low when the reed switch is activated if ( not open ) { garage_status_string = GARAGE_OPEN; } //if both inputs are high, it means that the garage is moving // so if it was open, we believe it's closing now // and if it was closed, we believe it's opening now if ( open and closed ) { if ( previous_garage_status_string == GARAGE_OPEN ) { garage_status_string=GARAGE_CLOSING; } if ( previous_garage_status_string == GARAGE_CLOSED ) { garage_status_string=GARAGE_OPENING; } } //if status of the garage changed from last scan, publish the new status if ( previous_garage_status_string != garage_status_string ) { Particle.publish(PUSHBULLET_NOTIF, "Your garage door is " + garage_status_string, 60, PRIVATE); } return 0; } /******************************************************************************* * Function Name : garage_stat // function name cannot be longer than 12 chars otherwise it wont be registered! * Description : reads and publishes the status of the garage, intended for using it with a service like ifttt or pushbullet * Return : 0 *******************************************************************************/ int garage_stat(String args) { int opened = digitalRead(garage_OPEN); int closed = digitalRead(garage_CLOSE); if ( not closed ) { garage_status_string = GARAGE_CLOSED; } if ( not opened ) { garage_status_string = GARAGE_OPEN; } Particle.publish(PUSHBULLET_NOTIF, "Your garage door is " + garage_status_string, 60, PRIVATE); return 0; }
Сканируем метку NFC с помощью телефона. Если все хорошо, приложение Trigger должно отобразить уведомление о том, что задача выполнена, а команда HTTP была отправлена на наше оборудование, и оно отреагировало на команду. Например, ворота гаража теперь открываются.М
Метки NFC - отличная идея, но не всегда хороший способ управления вашим оборудованием. Часто при сканировании метки приходится менять положение телефона, чтобы он наконец отсканировал её. Возникает вопрос, что я сделал не так? Почему процесс сканирования зачастую отнимает столько сил или времени для. Здесь можно найти две проблемы.
Возможно, NFC-метка очень старая. А возможно, что метка приклеена к поверхности, которая воздействует на магнитные поля между телефоном и меткой.
Итак, в следующем уроке мы опишем целиком процесс создания устройства, которое поможет открывать гаражные ворота с использованием NFC и смартфона на Андроид.