Arduino:Примеры/GSMExamplesReceiveSMS: различия между версиями
Myagkij (обсуждение | вклад) м (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">») |
Нет описания правки |
||
Строка 23: | Строка 23: | ||
Во-первых, импортируем библиотеку '''GSM'''. | Во-первых, импортируем библиотеку '''GSM'''. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
#include <GSM.h> | #include <GSM.h> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 29: | Строка 29: | ||
Функционал '''SIM'''-карты может быть заблокирован '''PIN'''-кодом. В таком случае нам потребуется директива #define, с помощью которой мы определим этот '''PIN'''-код как константу. Если '''PIN'''-кода нет, оставляем это место пустым. | Функционал '''SIM'''-карты может быть заблокирован '''PIN'''-кодом. В таком случае нам потребуется директива #define, с помощью которой мы определим этот '''PIN'''-код как константу. Если '''PIN'''-кода нет, оставляем это место пустым. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
#define PINNUMBER "" | #define PINNUMBER "" | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 35: | Строка 35: | ||
Создаем экземпляры классов '''GSM''' и '''GSM_SMS'''. | Создаем экземпляры классов '''GSM''' и '''GSM_SMS'''. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
GSM gsmAccess; | GSM gsmAccess; | ||
GSM_SMS sms; | GSM_SMS sms; | ||
Строка 42: | Строка 42: | ||
Создаем массив типа char для номера, с которого будет прислано сообщение. | Создаем массив типа char для номера, с которого будет прислано сообщение. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
char remoteNumber[20]; | char remoteNumber[20]; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 48: | Строка 48: | ||
В секции setup() инициализируем последовательную передачу данных на компьютер. Запустив соединение, выводим на '''Serial Monitor''' сообщение о том, что скетч начал работать. | В секции setup() инициализируем последовательную передачу данных на компьютер. Запустив соединение, выводим на '''Serial Monitor''' сообщение о том, что скетч начал работать. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
void setup(){ | void setup(){ | ||
Serial.begin(9600); | Serial.begin(9600); | ||
Строка 56: | Строка 56: | ||
Создаем локальную переменную, с помощью которой будем отслеживать статус соединения. Она нужна для того, чтобы скетч не начинал работать, пока '''SIM'''-карта не подключится к сети. | Создаем локальную переменную, с помощью которой будем отслеживать статус соединения. Она нужна для того, чтобы скетч не начинал работать, пока '''SIM'''-карта не подключится к сети. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
boolean notConnected = true; | boolean notConnected = true; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 62: | Строка 62: | ||
Подключаемся к сети с помощью функции gsmAccess.begin(), а PIN-код возьмем в качества аргумента. Далее помещаем функцию внутри цикла loop(), чтобы иметь возможность постоянно проверять статус соединения. Когда модем подключится, функция gsmAccess() вернет значение '''GSM_READY'''. Воспользуемся им как сигналом для того, чтобы придать переменной notConnected значение true или false. Если подключиться не удалось, сообщаем об этом на '''Serial Monitor'''. | Подключаемся к сети с помощью функции gsmAccess.begin(), а PIN-код возьмем в качества аргумента. Далее помещаем функцию внутри цикла loop(), чтобы иметь возможность постоянно проверять статус соединения. Когда модем подключится, функция gsmAccess() вернет значение '''GSM_READY'''. Воспользуемся им как сигналом для того, чтобы придать переменной notConnected значение true или false. Если подключиться не удалось, сообщаем об этом на '''Serial Monitor'''. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
while(notConnected) | while(notConnected) | ||
{ | { | ||
Строка 77: | Строка 77: | ||
Завершаем секцию setup() выводом двух сообщений на '''Serial Monitor''' – об успешной инициализации '''GSM''' и о том, что скетч ожидает входящие сообщения. | Завершаем секцию setup() выводом двух сообщений на '''Serial Monitor''' – об успешной инициализации '''GSM''' и о том, что скетч ожидает входящие сообщения. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
Serial.println("GSM initialized."); | Serial.println("GSM initialized."); | ||
Serial.println("Waiting for messages"); | Serial.println("Waiting for messages"); | ||
Строка 87: | Строка 87: | ||
В секции loop() создаем переменную типа char для временного хранения символов из полученного '''SMS'''. Для проверки того, есть ли на '''SIM'''-карте какие-либо сообщения, воспользуемся функцией sms.available(). | В секции loop() создаем переменную типа char для временного хранения символов из полученного '''SMS'''. Для проверки того, есть ли на '''SIM'''-карте какие-либо сообщения, воспользуемся функцией sms.available(). | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
void loop() | void loop() | ||
{ | { | ||
Строка 97: | Строка 97: | ||
Если есть, '''«изымаем»''' номер отправителя при помощи вызова функции sms.remoteNumber(remoteNumber, 20). Аргумент remoteNumber – это массив типа char, который вы объявили в самом начале скетча, и он может содержать '''не более 20 символов'''. Отправляем этот номер на '''Serial Monitor'''. | Если есть, '''«изымаем»''' номер отправителя при помощи вызова функции sms.remoteNumber(remoteNumber, 20). Аргумент remoteNumber – это массив типа char, который вы объявили в самом начале скетча, и он может содержать '''не более 20 символов'''. Отправляем этот номер на '''Serial Monitor'''. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
Serial.println("Message received from:"); | Serial.println("Message received from:"); | ||
sms.remoteNumber(remoteNumber, 20); | sms.remoteNumber(remoteNumber, 20); | ||
Строка 107: | Строка 107: | ||
Код ниже, скорее, просто демонстрационный, поэтому ничего c '''SIM'''-карты не удалит, однако вместо «#» можно указать точный индекс либо просто «прочесать» массив в цикле for(). | Код ниже, скорее, просто демонстрационный, поэтому ничего c '''SIM'''-карты не удалит, однако вместо «#» можно указать точный индекс либо просто «прочесать» массив в цикле for(). | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
if(sms.peek()=='#') | if(sms.peek()=='#') | ||
{ | { | ||
Строка 117: | Строка 117: | ||
Чтобы прочитать сообщение, воспользуемся функцией sms.read(). С ее помощью мы запишем все символы сообщения в переменную c, а затем выведем считанные данные на '''Serial Monitor'''. | Чтобы прочитать сообщение, воспользуемся функцией sms.read(). С ее помощью мы запишем все символы сообщения в переменную c, а затем выведем считанные данные на '''Serial Monitor'''. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
while(c=sms.read()) | while(c=sms.read()) | ||
Serial.print(c); | Serial.print(c); | ||
Строка 124: | Строка 124: | ||
Информируем пользователя о том, что сообщение готово и удаляем его из памяти при помощи функции sms.flush(). | Информируем пользователя о том, что сообщение готово и удаляем его из памяти при помощи функции sms.flush(). | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
Serial.println("\nEND OF MESSAGE"); | Serial.println("\nEND OF MESSAGE"); | ||
sms.flush(); | sms.flush(); | ||
Строка 133: | Строка 133: | ||
Добавляем короткую задержку и закрываем loop(). | Добавляем короткую задержку и закрываем loop(). | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
delay(1000); | delay(1000); | ||
} | } | ||
Строка 140: | Строка 140: | ||
Загрузив скетч, откройте '''Serial Monitor'''. При помощи телефона или другого подходящего устройства отправьте '''SMS''' на номер вашей '''SIM'''-карты. Когда сообщение будет получено, скетч выведет его на '''Serial Monitor.''' | Загрузив скетч, откройте '''Serial Monitor'''. При помощи телефона или другого подходящего устройства отправьте '''SMS''' на номер вашей '''SIM'''-карты. Когда сообщение будет получено, скетч выведет его на '''Serial Monitor.''' | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
/* | /* | ||
Получатель SMS | Получатель SMS |
Версия от 12:32, 20 мая 2023
Содержание | Знакомство с 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()