Для того чтобы представить систему дистанционного управления на рынке, наиболее перспективным является создание печатной платы, которая бы включала в себя блок питания, 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#includeSoftwareSerial GPRS(7, 8); // Подключаем GPRSServo 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{str += buffer[i]; // Делаем из массива символов строку}for (int j = 0; j{int result = str.indexOf(num[j]); // Ищем в строке один из номеровif (result != -1){ // -1 значит нет совпадений, поэтому ищем что-то другоеservo.write(0); // Поворачиваем серво на 0delay(3000);GPRS.println("ATH"); // Сбрасываем звонокservo.write(180); // Поворачиваем серво на 180delay(3000);break; // Выходим из цикла, если находим номер}}for (int i = 0; i{buffer[i] = NULL; // Очищаем буфер}count = 0;}}