[Перевод] Intel Edison, Arduino и Twilio: SMS-сообщения из умного дома

867a4f7cd0d74902b2068fa5ca9f7730.jpg Intel Edison – это самая маленькая в мире вычислительная платформа с самым низким энергопотреблением, которая была разработана для создания носимых устройств, таких, как те, из которых строится интернет вещей. Это – плата для разработки и прототипирования, сертифицированная Arduino. Программы на С++, которые можно писать для Intel Edison – это то же самое, что скетчи (sketch) в мире Arduino. Благодаря соответствующему окружению, Intel Edison способен взаимодействовать с различными датчиками. С их помощью можно в реальном времени измерять различные характеристики окружающей среды с высоким уровнем точности и стабильности. Intel Edison можно использовать для чтения и обработки данных самых разных датчиков, что позволяет строить на основе этой платы устройства, рассчитанные на работу в помещениях и на улице.
Сервис Twilio позволяет разработчикам программным путём получать SMS и MMS-сообщения на свои телефонные номера Twilio, и, соответственно, отправлять сообщения в ответ. Отправлять SMS и MMS-сообщения можно, используя REST API Twilio, можно организовывать SMS-переписку и отправлять SMS-сообщения в ходе телефонных звонков. Здесь мы рассмотрим отправку SMS-сообщений на обычный телефон с номеров Twilio.

Из этого материала вы узнаете о том, как считывать показания температурного датчика и отправлять SMS-сообщения на мобильный телефон, используя учётную запись Twilio.

Аппаратные компоненты


В этом проекте, посвященном работе с SMS-сообщениями, использованы следующие аппаратные компоненты:

  • Вычислительный модуль Intel Edison
  • Плата расширения Arduino
  • Набор Grove – Starter Kit Plus
  • Два Micro USB-кабеля для подключения платы к ПК
  • Источник постоянного тока


Подробная инструкция, посвящённая сборке и обеспечению питанием платы Intel Edison, находится здесь.

179055cf0d9d5c519c165781c54ed612.jpg
Аппаратные компоненты в сборе

Загрузка программного обеспечения


Воспользуйтесь ресурсом Intel Edison Board Software Downloads для того, чтобы загрузить свежие драйверы, вспомогательные приложения, образы прошивок и IDE Arduino.

Загрузка и установка библиотеки Twilio


Загрузите библиотеку Twilio C++ и распакуйте в папку с библиотеками Arduino IDE, которая обычно расположена по адресу C:\Arduino\arduino-1.5.3-Intel.1.0.4\libraries. Arduino не позволяет, чтобы в именах библиотек содержался символ «–», поэтому переименуйте twilio-cplusplus в Twilio.

f25c7f039ce9a9abf7c4c904b1b10ac9.png
Библиотека Twilio

Перейдите в папку Twilio и переименуйте файл Example.cpp в Example.cpp.org, в результате Example.cpp не будет вызываться каждый раз, когда мы пользуемся библиотекой Twilio. Внесите в файл Utils.h следующие изменения:

Файл Utils.h

#include <string.h>
#include <vector>

using namespace std;


Доступ к разделу устройства USB Mass Storage с Intel Edison


Multifunction Composite Gadget (g_multi) – это составной гаджет, который интенсивно использует composite framework и реализует широкую функциональность. В частности, он предоставляет USB-конфигурацию с поддержкой USB Mass Storage, а так же – интерфейсов Ethernet (RNDIS и (или) CDC Ethernet) и последовательного порта (ACM).

Для того чтобы вручную загружать или выгружать модули ядра, мы используем команду modprobe. Мы удаляем модуль g_multi для того, чтобы отключить устройство USB Mass Storage на Intel Edison.

0a92685b375ca78e87f5530d357e7ea9.png
Использование команды modprobe, Edison

Создадим директорию для монтирования.

4fdad15ff8ef303a1bd9d5f928f19996.png
Создание директории для монтирования, Edison

Воспользуемся командой losetup для того, чтобы назначить соответствие метки раздела «update» устройству loopback (/dev/loop0) со смещением 8192. В примере, показанном ниже, устройство loopback монтируется как /mnt/transfer.

4574361bcb9182b6d312988fdc9363f7.png
Монтирование устройства на Edison

Доступ к устройству USB Mass Storage с главного компьютера


Нажмите кнопку перезагрузки, устройство USB Mass Storage появится в Проводнике Windows.

8d953e633a1f29f5d9aa2fb0223cbff2.png
Устройство USB Mass Storage

Размонтируем раздел и вернём модуль g_multi.

814007ed222e4ccdfd6f4f382dd73b01.png
Размонтирование устройства

Установка Curl и криптографических библиотек


Обратитесь к разделу «Доступ к разделу устройства USB Mass Storage с Intel Edison» для того, чтобы скопировать libcurl с зависимостями из папки /usr/lib на Edison в корневую директорию установки Arduino IDE, в папку hardware\tools\edison\sysroots\core2-32-poky-linux\usr\lib:

  • libcurl.so
  • libtasn1.so.6
  • libgcrypt.so.11
  • libgnutls.so.26
  • libgpg-error.so.0


8d55cebdb52f9d2a28560888f8b3b41e.png
Копирование Curl и других библиотек с Edison

0625575bda4de14bc46d0544120c1e3f.png
Curl и другие библиотеки в Windows

Аналогично, воспользуйтесь рекомендациями раздела «Доступ к разделу устройства USB Mass Storage с Intel Edison» для того, чтобы скопировать нижеперечисленные библиотеки из папки /lib в Edison в корневую директорию установки Arduino IDE, в папку hardware\tools\edison\sysroots\core2-32-poky-linux\lib:

  • libz.so.1
  • libcap.so.2
  • libcrypto.so


a0aba4608dbad2b3e83f4e27ab0617e7.png
Копирование криптографических и других библиотек с Edison

448ff1a6d934c50ce2bd274aaf811436.png
Криптографические и другие библиотеки в Windows

Установка заголовочных файлов Curl


Заголовочные файлы Curl нужно поместить в корневую директорию установки Arduino IDE по адресу hardware\tools\edison\sysroots\core2-32-poky-linux\usr\include:

c8240b9bb6d01c06c3d4e8d0e0a96d26.png
Заголовочные файлы Curl

Заголовочные файлы OpenSSL нужно поместить в корневую директорию установки Arduino IDE по адресу hardware\tools\edison\sysroots\core2-32-poky-linux\usr\include:

54787040889ac8f159a368669cc78cc1.png
Заголовочные файлы OpenSSL

Модификация шаблонов компиляции


В папке установки Arduino IDE, по адресу hardware\arduino\edison, имеются файлы platform.*.txt. Отредактируйте тот файл, имя которого соответствует платформе, на которой выполняется сборка. Если вы работаете с Arduino IDE в Microsoft Windows, отредактируйте файл platform.win.txt.

83f4effae106de34b37cdf9573b82ab5.png
Файл platform.win.txt для Windows

Для того чтобы сообщить компоновщику о том, что ему нужно добавить libcurl и libcrypto к списку библиотек при компоновке исполняемых файлов, добавьте –lcurl и –lcrypto в конец строки «recipe.c.combine.pattern». Эту строку не должны разрывать символы перевода строки.

Динамическая компоновка – файл platform.win.txt.

recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} -march={build.mcu} -o "{build.path}/{build.project_name}.elf" {object_files} "{build.path}/{archive_file}" "-L{build.path}" -lm -lpthread -lcurl –lcrypto

Создание аккаунта Twilio


Для того чтобы принимать SMS и MMS-сообщения вам нужен телефонный номер Twilio, который поддерживает работу с SMS. Для того чтобы получить собственный выделенный номер, зарегистрируйте пробную учётную запись Twilio. Как только вы получите такой номер, перейдите в раздел Hide API Credentials на сайте Twilio и найдите там Account SID и Auth Token:

Телефонный номер из сервиса Twilio и данные для программного доступа к сервису

// Версия Twilio REST API 
const char API_VERSION[] = "2010-04-01";

// Телефонный номер Twilio с поддержкой SMS
const char CALLER_ID[] = "1480405xxxx";

// Account SID и Auth token для программного доступа к Twilio
const char ACCOUNT_SID[] = "AC9c55339a5a070ae81e782117xxxxxxxx";
const char ACCOUNT_TOKEN[] = "59e8819f3f5b530b97b84baexxxxxxxx";

POST-вызовы Twilio


Для того чтобы отправить SMS-сообщение, мы совершаем POST-запрос к Twilio, используя URL «/SMS/Messages». При этом нужно передать поля «To», «From» и «Body». «To» — это ваш телефонный номер, тот, на который должно прийти SMS. «From» — это телефонный номер Twilio, а «Body» — это текст SMS-сообщения.

Пример отправки SMS с помощью сервиса Twilio

// URL path = /API_VERSION/Accounts/ACCOUNT_SID/SMS/Messages
char postReqStr[150];
strcpy(postReqStr, twilioAcc);
strcat(postReqStr, "/SMS/Messages");
Serial.println(postReqStr);

// Отправка SMS
vars.clear();
vars.push_back(Var("To", "480-xxx-xxxx"));
vars.push_back(Var("From", "480-405-xxxx"));
vars.push_back(Var("Body", smsStr));
string response = twilioRest.request(postReqStr, "POST", vars);

Датчик температуры


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

Работа с датчиком температуры

// Датчик температуры подключён к аналоговому входу 1
const int tempSensorPin = 1;

// Температура по Фаренгейту
float degF = 0;

// Эта функция считывает данные с аналогового входа, конвертирует их
// в градусы Фаренгейта и возвращает полученную текущую температуру.
float getTemperature()
{
    int analogValue = analogRead(tempSensorPin);
  
    // Получим сопротивление сенсора;
    float resistance = (float)(1023 - analogValue) * 10000/analogValue;
 
    // Сконвертируем температурные данные в соответствии с документацией; 
    float degKelvin = 1/(log(resistance/10000)/B_THERMISTOR + 1/298.15);
  
    // Конверсия из градусов Кельвина в градусы Цельсия
    float degC = degKelvin - 273.15;
  
    // Конверсия градусов Цельсия в градусы по Фаренгейту
    degF = (degC * 9.0) / 5.0 + 32.0;
        
    return degF;
}


Пример готовой программы


Вот пример готовой программы для отправки SMS-сообщения на обычный мобильный телефон в тех случаях, когда температура достигает заданного предела в 100 градусов по Фаренгейту. Отладочный вывод выполняется в эмулятор консоли Galileo в Arduino IDE.

Отправка SMS с помощью учётной записи Twilio при достижении температурой заданного порогового значения

#include "WString.h"
#include <Utils.h>
#include <Rest.h>
#include <TwiML.h>
#include <vector>
#include <math.h>

using namespace twilio;

vector<Var> vars;

// Версия Twilio REST API 
const char API_VERSION[] = "2010-04-01";

// Телефонный номер Twilio с поддержкой SMS
const char CALLER_ID[] = "1480405xxxx";

// Account SID и Auth token для программного доступа к Twilio
const char ACCOUNT_SID[] = " AC9c55339a5a070ae81e782117xxxxxxxx ";
const char ACCOUNT_TOKEN[] = "59e8819f3f5b530b97b84baexxxxxxxx ";

// Ответ от Twilio
const char* responseStr;

// Порог температуры, в Фаренгейтах
const int THRESHOLD_TEMP = 100;
const int WAIT = 1000000;

// B-значение термистора
const int B_THERMISTOR = 3975;                  

int analogValue = 0;
float degKelvin = 0;
float degC = 0;
float degF = 0;
float resistance = 0;

// Датчик температуры подключён к аналоговому входу 1
const int tempSensorPin = 1;

// Эта функция инициализирует последовательный отладочный интерфейс
void setup() {
    Serial.begin(9600);  
}

// Эта функция делает следующее: 
//     - Создаёт SMS-сообщение для отправки
//     - Использует URL-путь
//     - Отправляет SMS-сообщение на мобильный телефон с Twilio-номера
// Вход: float tempF – текущая температура в градусах Фаренгейта
void sendSMS( float tempF ) { 
 
    // Конверсия tempF в строку
    char degFstr[20];
    sprintf(degFstr, "%2f", degF);
    
    // Конверсия THRESHOLD_TEMP в строку
    char thresholdStr[20];
    sprintf(thresholdStr, "%d", THRESHOLD_TEMP);
    
    // Создание SMS-сообщения
    char smsStr[100] = "Current temperature is ";
    strcat(smsStr, degFstr);
    strcat(smsStr, " F greater than threshold temp ");
    strcat(smsStr, thresholdStr);
    strcat(smsStr, " F.");
        
    // Twilio Account = /API_VERSION/Accounts/ACCOUNT_SID
    char twilioAcc[70] = "/";
    strcat(twilioAcc, API_VERSION);
    strcat(twilioAcc, "/Accounts/");
    strcat(twilioAcc, ACCOUNT_SID);
    
    // URL path = /API_VERSION/Accounts/ACCOUNT_SID//SMS/Messages
    char postReqStr[150];
    strcpy(postReqStr, twilioAcc);
    strcat(postReqStr, "/SMS/Messages");
    Serial.println(postReqStr); 
   
    // Twilio REST
    Rest rest(ACCOUNT_SID, ACCOUNT_TOKEN);
    
    // Отправка SMS
    vars.clear();
    vars.push_back(Var("To", "480-xxx-xxxx"));
    vars.push_back(Var("From", "480-405-xxxx"));
    vars.push_back(Var("Body", smsStr));
    string response = twilioRest.request(postReqStr, "POST", vars);
}

// Эта функция считывает данные с аналогового входа, конвертирует их
// в градусы Фаренгейта и возвращает полученную текущую температуру.
float getTemperature()
{
    analogValue = analogRead(tempSensorPin);
  
    // Получим сопротивление сенсора;
    resistance = (float)(1023 - analogValue) * 10000/analogValue;
 
    // Сконвертируем температурные данные в соответствии с документацией
    degKelvin = 1/(log(resistance/10000)/B_THERMISTOR + 1/298.15);
  
    // Конверсия из градусов Кельвина в градусы Цельсия
    degC = degKelvin - 273.15;
  
    // Конверсия градусов Цельсия в градусы по Фаренгейту
    degF = (degC * 9.0) / 5.0 + 32.0;
        
    return degF;
}

// Главный цикл, в котором производится считывание текущей температуры с 
// датчика. Если температура больше, чем заданное пороговое значение, 
// выполняется отправка SMS-сообщения.
void loop() { 
    degF = getTemperature();
    if(degF > THRESHOLD_TEMP)
    {
        sendSMS(degF);
        delay(WAIT);
    }
}


Итоги


В этом материале мы поэкспериментировали с датчиком температуры и отправкой SMS-сообщений с помощью сервиса Twilio. Схожим образом можно работать и с другими датчиками из комплекта Grove Starter Kit Plus – испытайте их, а если вам хочется большего – взгляните на эти датчики. Надеемся, наш рассказ вдохновит вас на интересные опыты с Intel Edison.

Полезные ссылки


software.intel.com/en-us/iot/hardware/edison/downloads
www-ssl.intel.com/content/www/us/en/do-it-yourself/edison.html
software.intel.com/en-us/iot/hardware/edison
software.intel.com/en-us/iot/library/edison-getting-started
software.intel.com/en-us/iot/hardware/devkit
www.seeedstudio.com/wiki/images/a/a1/NCP18WF104F03RC.pdf

© Geektimes