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, находится здесь.
Аппаратные компоненты в сборе
Загрузка программного обеспечения
Воспользуйтесь ресурсом 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.
Библиотека Twilio
Перейдите в папку Twilio и переименуйте файл Example.cpp в Example.cpp.org, в результате Example.cpp не будет вызываться каждый раз, когда мы пользуемся библиотекой Twilio. Внесите в файл 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.
Использование команды modprobe, Edison
Создадим директорию для монтирования:
Создание директории для монтирования, Edison
Воспользуемся командой losetup для того, чтобы назначить соответствие метки раздела «update» устройству loopback (/dev/loop0) со смещением 8192. В примере, показанном ниже, устройство loopback монтируется как /mnt/transfer.
Монтирование устройства на Edison
Доступ к устройству USB Mass Storage с главного компьютера
Нажмите кнопку перезагрузки, устройство USB Mass Storage появится в Проводнике Windows.
Устройство USB Mass Storage
Размонтируем раздел и вернём модуль g_multi.
Размонтирование устройства
Установка 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
Копирование Curl и других библиотек с Edison
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
Копирование криптографических и других библиотек с Edison
Криптографические и другие библиотеки в Windows
Установка заголовочных файлов Curl
Заголовочные файлы Curl нужно поместить в корневую директорию установки Arduino IDE по адресу hardware\tools\edison\sysroots\core2-32-poky-linux\usr\include:
Заголовочные файлы Curl
Заголовочные файлы OpenSSL нужно поместить в корневую директорию установки Arduino IDE по адресу hardware\tools\edison\sysroots\core2-32-poky-linux\usr\include:
Заголовочные файлы OpenSSL
Модификация шаблонов компиляции
В папке установки Arduino IDE, по адресу hardware\arduino\edison, имеются файлы platform.*.txt. Отредактируйте тот файл, имя которого соответствует платформе, на которой выполняется сборка. Если вы работаете с Arduino IDE в Microsoft Windows, отредактируйте файл platform.win.txt.
Файл 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 version const char API_VERSION[] = "2010-04-01"; // SMS-enabled Twilio phone number const char CALLER_ID[] = "1480405xxxx"; // Twilio Account SID and Auth token const char ACCOUNT_SID[] = "AC9c55339a5a070ae81e782117xxxxxxxx"; const char ACCOUNT_TOKEN[] = "59e8819f3f5b530b97b84baexxxxxxxx";
Code Example 2: Twilio Phone Number, Account SID and Auth Token Example
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); // Send 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);
Code Example 3: Send “/SMS/Messages” Example
Датчик температуры
Теперь, когда вы можете работать с SMS-сообщениями, пришло время создать функцию для чтения показателей датчика температуры. Он используется для измерения окружающей температуры в реальном времени, для работы с ним применяется аналоговый вход. Подробности о датчике температуры можно найти в этом документе. Ниже приведен пример работы с датчиком.
Работа с датчиком температуры
// Connect temperature sensor to Analog pin 1 const int tempSensorPin = 1; // Temperatuere in Fahrenheit float degF = 0; // This function reads the analog pin value, converts to Fahrenheit, then // returns current temperature in Fahrenheit. float getTemperature() { int analogValue = analogRead(tempSensorPin); //Get the resistance of the sensor; float resistance = (float)(1023 - analogValue) * 10000/analogValue; //Convert to temperature via datasheet; float degKelvin = 1/(log(resistance/10000)/B_THERMISTOR + 1/298.15); // Convert Kelvin to Celcius float degC = degKelvin - 273.15; // Celcius to Fahrenheit 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