Проект 32: Бездротовий зв'язок. Модуль GSM / GPRS SIM900
В цьому експерименті розглянемо роботу модуля GSM / GPRS shield - плати розширення, що дозволяє Arduino працювати в мережах стільникового зв'язку за технологіями GSM / GPRS для прийому і передачі даних, SMS і голосового зв'язку.
Необхідні компоненти:
- контролер Arduino UNO R3;
- плата для прототипування;
- GSM / GPRS shield;
- працює SIM-карта будь-якого оператора;
- датчик температури LM335;
- резистор 2,2 кОм;
- дроти тато-тато.
- блок живлення +5 в 1 А;
GSM / GPRS shield на базі модуля SIMCom SIM900 випускають кілька виробників, і плати мають незначні відмінності. Також на деяких платах розташовані: слот для SIM-карти, стандартні 3,5 мм джек для аудиовхода і виходу і роз'єм для зовнішньої антени. На платі GSM / GPRS shild є кілька перемичок, що дозволяють вибрати тип serial-з'єднання (hardware або software). GSM / GPRS shield має два способи включення - апаратний (короткочасне натискання кнопки PWRKEY) і програмний (використовується один з виходів Arduino). Розглянемо приклад відправки та отримання SMS-повідомлень за допомогою GSM / GPRS shield. Кожні 30 хвилин будемо відправляти на певний номер свідчення аналогового датчика температури LM335, приєднаного до виводу A0. Схема з'єднань експерименту показана на рис. 32.1.

Рис. 32.1. Схема підключення модуля GSM / GPRS shield і датчика LM335. Шілд SIM900 встановлений на Arduino UNO
Вміст скетчу для відправки SMS показано в лістингу 32.1.
// підключення бібліотеки SoftwareSerial
#include <SoftwareSerial.h>
// номер телефону для відправки sms (поміняйте на свій)
#define PHONE "+79031111111"
// виводи для SoftwareSerial (у вас можуть бути 7,8)
SoftwareSerial Sim900Serial (2, 3);
const int lm335 = A0; // для підключення LM335
unsigned long millis1;
void setup ()
{
Sim900Serial (19200); // the Hardware serial rate
}
void loop ()
{
if (millis () - millis1> 30 * 60 * 1000) // пройшло 30 хвилин?
{
SendTextMessage (); // відправити sms
millis1 = millis ();
}
}
// підпрограма відправки sms
void SendTextMessage ()
{
// AT-команда установки text mode
Sim900Serial.print ( "AT + CMGF = 1 \ r");
delay (100);
// номер телефону одержувача
Sim900Serial.println ( "AT + CMGS = \" ");
Sim900Serial.println (PHONE);
Sim900Serial.println ( "\" ");
delay (100);
// повідомлення - дані температури
double val = analogRead (lm335); // читання
double voltage = val * 5.0 / 1024; // переклад в вольти
double temp = voltage * 100 - 273.15; // в градуси Цельсія
Sim900Serial.println (temp);
delay (100);
// ASCII код ctrl + z - закінчення передачі
Sim900Serial.println ((char) 26);
delay (100);
Sim900Serial.println ();
}
Порядок підключення:
- Встановимо SIM-карту на GSM / GPRS Shield, а GSM / GPRS Shield - на Arduino. За допомогою джамперів з'єднаємо контакти для роботи через SoftwareSerial-емуляцію.
- Збираємо схему, згідно з рис. 32.1.
- Завантажуємо в плату Arduino скетч з лістингу 32.1.
- На телефон, вказаний в скетчі, раз в 30 хвилин повинні приходити sms-повідомлення з даними температури. Тепер змінимо скетч таким чином, щоб Arduino відправляла sms-повідомлення з даними температури тільки при отриманні при- ходить повідомлення з текстом «temp» . Вміст скетчу показано в лістингу 32.2.
SoftwareSerial Sim900Serial (2, 3);
String currStr = ""; //
String phone = ""; //
// True, якщо поточна рядок є sms-повідомленням
boolean isStringMessage = false;
void setup ()
{
Serial.begin (19200);
Sim900Serial.begin (19200);
// Налаштовуємо прийом повідомлень з інших пристроїв
Sim900Serial.print ( "AT + CMGF = 1 \ r");
delay (300);
Sim900Serial.print ( "AT + IFC = 1, 1 \ r");
delay (300);
Sim900Serial.print ( "AT + CPBS = \" SM \ "\ r");
delay (300);
Sim900Serial.print ( "AT + CNMI = 1,2,2,1,0 \ r");
delay (500);
}
void loop ()
{
if (! Sim900Serial.available ())
return;
char currSymb = Sim900Serial.read ();
if ( '\ r' == currSymb)
{
if (isStringMessage) // поточна рядок - sms-повідомлення,
{
if (! currStr.compareTo ( "temp")) // текст sms - temp
{
// відправити sms на приходить номер
Sim900Serial.print ( "AT + CMGF = 1 \ r");
delay (100);
Sim900Serial.print ( "AT + CMGS = \" ");
Sim900Serial.print (phone);
Sim900Serial.println ( "\" ");
delay (100);
double val = analogRead (A0); // читання
double voltage = val * 5.0 / 1024; // переклад в вольти
double temp = voltage * 100 - 273.15; // в градуси Цельсія
Serial.println (temp);
Sim900Serial.println (temp);
delay (100);
Sim900Serial.println ((char) 26);
delay (100);
Sim900Serial.println ();
}
Serial.println (currStr);
isStringMessage = false;
}
else
{
if (currStr.startsWith ( "+ CMT")) {
Serial.println (currStr);
// виділити з повідомлення номер телефону
phone = currStr.substring (7,19);
Serial.println (phone);
// якщо поточний рядок починається з "+ CMT",
// то наступний рядок є повідомленням
isStringMessage = true;
}
}
currStr = "";
}
else if ( '\ n'! = currSymb)
{
currStr + = String (currSymb);
}