Содержание
- Обзор платы GSM/GPRS SIM900 Shiel
- Подключение к плате Arduino
- Управление модулем GSM GPRS SIM900 с помощью AT-команд
Обзор платы GSM/GPRS SIM900 Shield
Плата Arduino GPRS/GSM Shield (рисунок 1) предоставляет нам возможность использовать для удаленного приема и передачи данных мобильной GSM-связи. Осуществить это можно тремя способами:
используя отправку/прием коротких текстовых сообщений (SMS);
отправкой голосовых (аудио) команд на основе технологий CSD (стандартная технология передачи данных в сети GSM) и/или DTMF (двухтональный многочастотный аналоговый сигнал, используемый для набора телефонного номера);
используя пакетную передачу данных на основе технологии GPRS.
Плата построена на базе модуля SIMCom SIM900.
Также на ней расположены:
слот для SIM-карты;
джек 3,5 мм для аудио-входа и выхода;
разъём для внешней антенны.
Общение с платой производится через serial-соединение с помощью набора AT-команд. С помощью перемычек на плате возможно установить используемые для коммуникации контакты: аппаратные 0- 1-й или 2-3 (на некоторых платах) 7- 8-й для работы через SoftwareSerial.
Рисунок 1. GPS GPRS shield.
Плату GSM GPRS SIM900 Shield можно включить двумя способами:
аппаратным (нажатие кнопки PWRKEY);
программным.
Плата GSM GPRS SIM900 Shield сделана в формате шилда для плат Ардуино. Контакты шилда (гребенки) легко вставляются в разъемы платы, образуя при этом "бутерброд" (рисунок 2).
Рисунок 2. Установка GPS GPRS shield на плату Arduino.
Управление модулем GSM GPRS SIM900 с помощью AT-команд
Рассмотрим управление модулем GSM GPRS shield с помощью AT-команд. Для этого установим модуль на плату Arduino и подключим её к компьютеру. Arduino-скетч отправки и получения данных между компьютером и модулем GSM GPRS shield через плату показан в листинге 1.
Листинг 1
#include <SoftwareSerial.h>
// создание объекта
SoftwareSerial grs(7, 8); // RX, TX
// скорость обмена
#define GSMbaud 9600
String str1;
char buff[100];
void setup() {
Serial.begin(9600);
gsm.begin(GSMbaud);
Serial.println("Start");
}
void loop() {
if (Serial.available()) {
str1 = Serial.readStringUntil('\n');
str1.toCharArray(buffer, hh.length() + 1);
gsm.write(buffer);
gsm.board.write('\n');
}
if (gsm.available()) {
Serial.write(gprs.read());
}
}
Загружаем скетч на плату ардуино, открываем монитор последовательного порта и набираем команды установки режима:
AT+CREG=1
AT+CREG?
Команда проверки подключения модуля к GPRS-сети, которую при ответе COMMAND NO RESPONSE необходимо постоянно повторять
AT + CGATT=1
AT + CGATT?
Подключаемся к точке доступа оператора связи. Для Билайн:
AT + CGDCONT = 1, "IP", "internet.beeline.ru"
AT + CSTT = "internet.beeline.ru","", ""
Установка интернет-соединения:
AT + CGACT = 1,1
Обращение к интернет-ресурсу
AT + CIPSTART = "TCP", www.yandex.ru ", 80
Весь процесс подключения представлен на рисунке 3.
Рисунок 3. Процесс работы с модулем GSM GPRS SIM800 в мониторе последовательного порта.
Пример отправки sms-сообщений с платы Arduino
Рассмотрим пример использования отправки sms-сообщений при уменьшении температуры воздуха в помещении ниже определенного значения. Нам потребуются следующие детали:
плата Arduino Uno – 1 шт;
плата прототипирования – 1 шт;
модуль GSM GPRS Shield – 1 шт;
sim-карта сотового оператора с положительным балансом;
модуль датчика DHT11 – 1 шт;
блок питания 12В – 1 шт;
Схема подключения показана на рисунке 4.
Рисунок 4. Схема подключения для отправки sms-сообщений при низких значениях температуры воздуха.
Приступим к написанию скетча. Каждые 30 секунд получаем данные влажности и температуры с датчика DHT11. Используем библиотеку DHT. При значении температуры ниже критического отправляем sms на номер указанный в константе PHONE. И делаем паузу на 10 минут.
Содержимое скетча показано в листинге 2.
Листинг 2
// подключение библиотек
#include <SoftwareSerial.h>
#include "DHT.h"
// телефон для отправки sms
#define PHONE_NUMBER "+7928222222"
// создание объектов
SoftwareSerial gsm(7, 8);
DHT sensorDHT(2, DHT22);
// пороговое значение температуры
#define TEMPP 18
unsigned long millissend;
void setup() {
// запуск последовательного порта
Serial.begin(9600);
// запуск датчика DHT
sensorDHT.begin();
// запуск SoftwareSerial
gsm.begin(9600);
}
void loop() {
if (millis()-millissend>30*1000) { // показания каждые 30 секунд?
// получение данных с датчика DHT
int h = sensorDHT.readHumidity();
int t = sensorDHT.readTemperature();
if(t<TEMPP) {
// отправить sms
SendSMS(t);
// ждем 10 минут
delay(10*60*1000);
}
millissend=millis();
}
}
// отправка sms
void SendSMS(int t) {
// установка text mode
gsm.print("AT+CMGF=1\r");
delay(100);
// телефон
gsm.println("AT + CMGS = \"");
gsm.println(PHONE_NUMBER);
gsm.println("\"");
delay(50);
// отправить данные t
gsm.println(t);
delay(50);
// окончание передачи
gsm.println((char)26);
delay(50);
gsm.println();
}
Загружаем скетч, проверяем событие прихода sms-сообщения на выбранный номер телефона при критическом значении температуры.
Рисунок 5. Схема в сборе.
Создадим прошивку получения данных при отправке sms-сообщения на sim-карту, находящийся в модуле GSM GPRS shield. Содержимое скетча показано в листинге 3.
Листинг 3
// подключение библиотек
#include <SoftwareSerial.h>
#include "DHT.h"
// создание объектов
SoftwareSerial gsm(7, 8);
DHT sensorDHT(2, DHT22);
// переменные
String phone = ""
String str1 = ""; //
boolean isSMS = false;
void setup() {
// подключение последовательного порта
Serial.begin(9600);
// запуск датчика DHT
dht.begin();
// запуск SoftwareSerial
gsm.begin(9600);
// Настройка приёма сообщений
gsm.print("AT+CMGF=1\r");
delay(500);
gsm.print("AT+IFC=1, 1\r");
delay(500);
gsm.print("AT+CPBS=\"SM\"\r");
delay(500);
gsm.print("AT+CNMI=1,2,2,1,0\r");
delay(500);
}
void loop() {
if (gsm.available()) {
char c = gsm.read();
if ('\r' == c) {
if (isSMS) { // текущая строка - sms-сообщение,
if (!str1.compareTo("tmp")) { // текст sms - tmp
// отправить sms на приходящий номер
// получение данных
int t = dht.readTemperature();
// AT-команда установки text mode
gsm.print("AT+CMGF=1\r");
delay(100);
// номер телефона получателя
gsm.println("AT + CMGS = \"");
gsm.println(phone);
gsm.println("\"");
delay(50);
// сообщение – данные температуры
gsm.println(t);
delay(50);
// окончание передачи
gsm.println((char)26);
delay(50);
gsm.println();
}
Serial.println(currStr);
isSMS = false;
}
else {
if (str1.startsWith("+CMT")) {
Serial.println(str1);
// выделить из сообщения номер телефона
phone=str1.substring(7,19);
Serial.println(phone);
// если текущая строка начинается с "+CMT",
// то следующая строка является сообщением
isSMS = true;
}
}
str1 = "";
}
else if ('\n' != c) {
str1 += String(c);
}
}
}
Загружаем скетч на плату, отправляем sms-сообщение с текстом tmp на sim-карту и получаем в ответ sms-сообщение с данными температуры.
Часто задаваемые вопросы FAQ
1. Нет связи с Arduino по последовательному порту.
Проверьте питание платы.
Проверьте правильность установки перемычек.
2. Не отправляются sms-сообщения
Проверьте наличие внешнего питание GSM GPRS shield.
Проверьте баланс sim-карты.