Arduino:Примеры/GSMExamplesReceiveSMS
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Получение SMS[1]
Этот скетч ждет SMS-сообщение, а затем выводит его на Serial Monitor. Вам потребуется плата Arduino с подключенным к ней модулем GSM Shield и SIM-картой.
Необходимое оборудование
- Плата Arduino;
- Модуль Arduino + Telefonica GSM/GPRS Shield;
- SIM-карта;
Цепь
Изображение модуля GSM Shield, установленного поверх платы Arduino
Код
Во-первых, импортируем библиотеку GSM.
#include <GSM.h>
Функционал SIM-карты может быть заблокирован PIN-кодом. В таком случае нам потребуется директива #define, с помощью которой мы определим этот PIN-код как константу. Если PIN-кода нет, оставляем это место пустым.
#define PINNUMBER ""
Создаем экземпляры классов GSM и GSM_SMS.
GSM gsmAccess;
GSM_SMS sms;
Создаем массив типа char для номера, с которого будет прислано сообщение.
char remoteNumber[20];
В секции setup() инициализируем последовательную передачу данных на компьютер. Запустив соединение, выводим на Serial Monitor сообщение о том, что скетч начал работать.
void setup(){
Serial.begin(9600);
Serial.println("SMS Messages Receiver");
Создаем локальную переменную, с помощью которой будем отслеживать статус соединения. Она нужна для того, чтобы скетч не начинал работать, пока SIM-карта не подключится к сети.
boolean notConnected = true;
Подключаемся к сети с помощью функции gsmAccess.begin(), а PIN-код возьмем в качества аргумента. Далее помещаем функцию внутри цикла loop(), чтобы иметь возможность постоянно проверять статус соединения. Когда модем подключится, функция gsmAccess() вернет значение GSM_READY. Воспользуемся им как сигналом для того, чтобы придать переменной notConnected значение true или false. Если подключиться не удалось, сообщаем об этом на Serial Monitor.
while(notConnected)
{
if(gsmAccess.begin(PINNUMBER)==GSM_READY)
notConnected = false;
else
{
Serial.println("Not connected");
delay(1000);
}
}
Завершаем секцию setup() выводом двух сообщений на Serial Monitor – об успешной инициализации GSM и о том, что скетч ожидает входящие сообщения.
Serial.println("GSM initialized.");
Serial.println("Waiting for messages");
}
Прием SMS-сообщений осуществляется модемом. SIM-карта имеет некоторую память для хранения входящих SMS. В зависимости от той или иной модели SIM-карты, она может уместить от 10 до 200 SMS-сообщений. Точную цифру можно узнать у своего мобильного оператора.
В секции loop() создаем переменную типа char для временного хранения символов из полученного SMS. Для проверки того, есть ли на SIM-карте какие-либо сообщения, воспользуемся функцией sms.available().
void loop()
{
char c;
if (sms.available())
{
Если есть, «изымаем» номер отправителя при помощи вызова функции sms.remoteNumber(remoteNumber, 20). Аргумент remoteNumber – это массив типа char, который вы объявили в самом начале скетча, и он может содержать не более 20 символов. Отправляем этот номер на Serial Monitor.
Serial.println("Message received from:");
sms.remoteNumber(remoteNumber, 20);
Serial.println(remoteNumber);
SMS-сообщения можно удалить, вызвав функцию sms.flush(). Кроме того, воспользуемся функцией sms.peek(), которая позволяет определить индекс символа в сообщении.
Код ниже, скорее, просто демонстрационный, поэтому ничего c SIM-карты не удалит, однако вместо «#» можно указать точный индекс либо просто «прочесать» массив в цикле for().
if(sms.peek()=='#')
{
Serial.println("Discarded SMS");
sms.flush();
}
Чтобы прочитать сообщение, воспользуемся функцией sms.read(). С ее помощью мы запишем все символы сообщения в переменную c, а затем выведем считанные данные на Serial Monitor.
while(c=sms.read())
Serial.print(c);
Информируем пользователя о том, что сообщение готово и удаляем его из памяти при помощи функции sms.flush().
Serial.println("\nEND OF MESSAGE");
sms.flush();
Serial.println("MESSAGE DELETED");
}
Добавляем короткую задержку и закрываем loop().
delay(1000);
}
Загрузив скетч, откройте Serial Monitor. При помощи телефона или другого подходящего устройства отправьте SMS на номер вашей SIM-карты. Когда сообщение будет получено, скетч выведет его на Serial Monitor.
/*
Получатель SMS
Этот скетч для Arduino GSM Shield ждет входящих SMS-сообщений,
а затем отображает их на Serial Monitor.
Цепь:
* GSM Shield
Создан 25 февраля 2012 Хавьером Зорзано (Javier Zorzano) / TD
Этот код не защищен авторским правом.
*/
// Библиотеки:
#include <GSM.h>
// PIN-код:
#define PINNUMBER ""
// Создаем экземпляры классов:
GSM gsmAccess; // включая параметр «true» для активации отладки
GSM_SMS sms;
char remoteNumber[20]; // массив, в котором будет храниться входящий номер
void setup()
{
// Инициализируем последовательную передачу данных:
Serial.begin(9600);
Serial.println("SMS Messages Receiver"); // "Получатель SMS-сообщений"
// Состояние соединения:
boolean notConnected = true;
// Запускаем GSM Shield.
// Если ваша SIM-карта заблокирована PIN-кодом,
// то укажите его параметром в функции gsmAccess.begin():
while(notConnected)
{
if(gsmAccess.begin(PINNUMBER)==GSM_READY)
notConnected = false;
else
{
Serial.println("Not connected"); // "Подключиться не удалось"
delay(1000);
}
}
Serial.println("GSM initialized"); // "GSM инициализирован"
Serial.println("Waiting for messages"); // "Ожидание сообщений"
}
void loop()
{
char c;
// Если есть какие-либо доступные SMS:
if (sms.available())
{
Serial.println("Message received from:"); // "Сообщение получено от:"
// «Изымаем» номер:
sms.remoteNumber(remoteNumber, 20);
Serial.println(remoteNumber);
// Это лишь пример удаления сообщения.
// Сообщения, начинающиеся с «#», должны быть отклонены:
if(sms.peek()=='#')
{
Serial.println("Discarded SMS"); // "Сообщение отклонено"
sms.flush();
}
// Считываем байты сообщения и выводим на Serial Monitor:
while(c=sms.read())
Serial.print(c);
Serial.println("\nEND OF MESSAGE"); // "\nКонец сообщения"
// Удаляем сообщение из памяти модема:
sms.flush();
Serial.println("MESSAGE DELETED"); // "Сообщение удалено"
}
delay(1000);
}
См.также
- GSM Constructor
- GSM.begin()
- GSM.shutdown()
- GSM_SMS Constructor
- beginSMS()
- ready()
- endSMS()
- available()
- remoteNumber()
- read()
- write()
- print()
- peek()
- flush()
Внешние ссылки
Arduino продукты | |
---|---|
Начальный уровень | Arduino Uno • Arduino Leonardo • Arduino 101 • Arduino Robot • Arduino Esplora • Arduino Micro • Arduino Nano • Arduino Mini • Arduino Starter Kit • Arduino Basic Kit • MKR2UNO • TFT-дисплей Arduino |
Продвинутые функции | Arduino Mega 2560 • Arduino Zero • Arduino Due • Arduino Mega ADK • Arduino Pro • Arduino Motor Shield • Arduino USB Host Shield • Arduino Proto Shield • MKR Proto Shield • MKR Proto Large Shield • Arduino ISP • Arduino USB 2 Serial Micro • Arduino Mini USB Serial Adapter |
Интернет вещей | Arduino Yun • Arduino Ethernet • Arduino MKR1000 • Arduino WiFi 101 Shield • Arduino GSM Shield V2 • Arduino WiFi Shield • Arduino Wireless SD Shield • Arduino Wireless Proto Shield • Arduino Ethernet Shield V2 • Arduino Yun Shield • Arduino MKR1000 Bundle |
Носимые устройства | Arduino Gemma • Lilypad Arduino Simple • Lilypad Arduino Main Board • Lilypad Arduino USB • LilyPad Arduino SimpleSnap |
3D-печать | Arduino Materia 101 |
Устаревшие устройства | - |
Примеры Arduino | |
---|---|
Стандартные функции | |
Основы |
|
Цифровой сигнал |
|
Аналоговый сигнал |
|
Связь |
|
Управляющие структуры |
|
Датчики |
|
Дисплей |
Примеры, объясняющие основы управления дисплеем:
|
Строки |
|
USB (для Leonardo, Micro и Due плат) |
В этой секции имеют место примеры, которые демонстрируют использование библиотек, уникальных для плат Leonardo, Micro и Due.
|
Клавиатура |
|
Мышь |
|
Разное |
- Страницы, использующие повторяющиеся аргументы в вызовах шаблонов
- Справочник языка Arduino
- Arduino
- Перевод от Сubewriter
- Проверка:myagkij
- Оформление:myagkij
- Редактирование:myagkij
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Пример
- Примеры
- Пример программирования Arduino
- Примеры программирования Arduino