Купить всё для Ардуино   Купить макетную плату с перемычками на AliExpress

Используйте NFC-метки для управления вашим оборудованием

Сканируем NFC-метки и получаем показания температуры, открываем гараж или делаем всё, что захочется.

Комплектующие

Мы будем использовать кит набор Photon от компании Particle.

  • Photon от Particle

Фотон - набор для разработки с Wi-Fi для создания устройства с улучшенными возможностями и повышенной надежностью.

Далее мы поговорим том, как сканирование NFC-меток может отправлять команды на ваше оборудование. Конечно, у вас должен  быть телефон с Android.

Что такое NFC?

NFC (англ. - Near Field Communications), буквально, коммуникация ближнего окружения. Возьмем определение NFC из руководства по Android API:

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

Применение 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:

  1. Создаем новое задание
  2. Нажимаем «Далее» на экране «Добавить один или несколько триггеров» (англ. - Add one or more triggers)
  3. Добавляем действие
  4. Выбираем Tasker -> Tasker Task, затем "Далее" (Next)
  5. Нажимаем на лупу, чтобы вы могли выбрать задачу в Tasker
  6. Выбираем OpenGarage и нажмите «Добавить в задачу» (Add to task)
  7. Нажимаем "Готово" (Done)
  8. Нажимаем NFT в «Добавить один или несколько триггеров» (Add one or more triggers) и жмем Далее (Next)
  9. Нажимаем «Выполнить» в "Добавить ограничения -> Далее -> Далее -> Готово" (Add restrictions -> Next -> Next -> Done) (нет необходимости в секунде, переключите задачу)
  10. Сканируем свою метку NFC, чтобы сохранить в ней дату задачи
  11. Нажимаем "Готово" (Done) сверху
  12. Всё готово

Шаг 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 и смартфона на Андроид.

/ 30.09.2019

Ардуино+