Для того чтобы представить систему дистанционного управления на рынке, наиболее перспективным является создание печатной платы, которая бы включала в себя блок питания, GSM модуль, микроконтроллер. За счет массового изготовления цена на такое устройство может быть значительно снижена. Для этого мы используем микроконтроллер Arduino Uno с дополнительными компонентами GPRS модуль и сервопривод, которые представляют макет систему шлагбаума и демонстрируют его работу.
Первоначально происходит инициализация — установка констант, настройка портов ввода/вывода (параметры UART передачи данных (скорости)). Инициализация памяти. Далее производится запуск GSM-модуля, после чего даем модулю запуститься в течение одной секунды.
Микроконтроллер ожидает пока пройдет инициализация GSM, т.е. модуль должен считать SIM карту и подключиться к GSM сети, которую она поддерживает. Для того чтобы убедиться, что SIM-карта подключилась к сети на GSM модуле имеются два информационных выхода — STATUS и NETLIGHT, которые демонстрируют работу модуля и состояние сети. С помощью второго выхода мы можем определить работу SIM-карты, есть несколько состояний сети:
- 64мс/800мс — сеть не найдена;
- 64мс/3000мс — сеть найдена;
- 64мс/300мс — идет обмен по GPRS.
Диалог микроконтроллера с GSM модулем происходит посредством AT команд [1]. После удачной инициализации микроконтроллер посылает AT команду, что позволяет определить номер телефона. Должен быть ответ модуля на эту команду, в противном случае команда посылается еще раз.
Опишем алгоритм работы программы:
1. Перед началом работы происходит настройка GSM-модуля на прием звонков.
2. Включается автоопределитель номера (АОН).
3. При звонке на номер, который закреплен за шлагбаумом, сравнивается входящий номер с номерами в базе данных:
- если номер хранится в «белом списке», то есть имеет доступ к территории, то шлагбаум открывается;
- если входящий номер не хранится в базе данных, то шлагбаум не открывается.
4. При получении сообщения на номер, прикрепленный к шлагбауму, ничего не происходит.
5. После выполнения цикла поднятия и опускания шлагбаума, система ждет новый входящий вызов.
Программный код:
#include <softwareserial.h>
#include <servo.h>
SoftwareSerial GPRS(7, 8); // Подключаем GPRS
Servo servo;
char buffer[64];
int count = 0;
String num[] = {"+79046621322", "+79046603072", "+89586249637"}; // номера имеющие доступ
void setup()
{
GPRS.begin(19200);
Serial.begin(19200);
delay(1000);
GPRS.println("AT+CLIP=1"); // включаем АОН
servo.attach(10); // Подключаем серво к 10 пину
}
void loop()
{
String str = ""; // Очищаем строку
if (GPRS.available())
{
while (GPRS.available())
{
buffer[count++] = GPRS.read();
if (count == 64) break;
}
for (int i = 0 ; i < 64; i++)
{
str += buffer[i]; // Делаем из массива символов строку
}
for (int j = 0; j < 3; j++)
{
int result = str.indexOf(num[j]); // Ищем в строке один из номеров
if (result != -1)
{ // -1 значит нет совпадений, поэтому ищем что-то другое
servo.write(0); // Поворачиваем серво на 0
delay(3000);
GPRS.println("ATH"); // Сбрасываем звонок
servo.write(180); // Поворачиваем серво на 180
delay(3000);
break; // Выходим из цикла, если находим номер
}
}
for (int i = 0; i < count; i++)
{
buffer[i] = NULL; // Очищаем буфер
}
count = 0;
}
}