Отправка и приём SMS и звонков с GSM-модулем SIM800L и Arduino
Представьте, что вы можете следить за своим домом из любой точки, управлять поливом сада с помощью пропущенного звонка или получать текстовое сообщение сразу, когда кто-то входит в ваш дом — и всё это без дорогой системы безопасности. С GSM/GPRS-модулем SIM800L вы можете воплотить эти идеи в реальность.
Модуль SIM800L — это миниатюрный GSM-модем, который добавляет сотовую связь к вашим проектам на Arduino. Как и ваш мобильный телефон, он может отправлять текстовые сообщения, совершать телефонные звонки и даже подключаться к интернету через GPRS. Независимо от того, создаёте ли вы систему домашней автоматизации, устройство экстренного оповещения или что-то, чем хотите управлять удалённо, этот модуль станет настоящей находкой.
В этом руководстве мы пошагово покажем, как подключить модуль SIM800L к Arduino. Вы узнаете, как правильно настроить и запитать SIM800L, чтобы он работал надёжно. Мы также покажем, как использовать модуль с Arduino для отправки и получения текстовых сообщений и даже как совершать и принимать телефонные звонки с помощью простого кода и команд.
Освоив эти навыки, вы будете готовы создавать собственные проекты с сотовой связью, удалённо управлять устройствами и максимально использовать возможности GSM-коммуникации. Давайте начнём!
Обзор оборудования
В основе модуля лежит GSM-чип SIM800L, созданный компанией Simcom. Этот специальный чип позволяет электронным проектам подключаться к сотовым сетям — тем же сетям, которые использует ваш телефон. С таким подключением ваши проекты могут отправлять текстовые сообщения, совершать звонки или даже выходить в интернет.
SIM800L работает в диапазоне напряжений от 3,4 до 4,4 В, что означает, что его можно питать непосредственно от LiPo-аккумулятора. Это очень удобно для проектов с ограниченным пространством и требованиями к энергоэффективности.
Модуль подключается к микроконтроллеру (например, Arduino) через UART. Он поддерживает широкий диапазон скоростей передачи данных от 1200 до 115200 бод и даже имеет функцию автоматического определения скорости передачи. Это делает его гибким и простым в настройке для различных проектов.
Для подключения к сотовой сети модулю нужна антенна. Обычно модуль поставляется с небольшой спиральной антенной, которую можно припаять непосредственно к плате. Однако, если вы хотите разместить антенну отдельно от модуля — например, для лучшего приёма — есть специальный разъём U.FL. Он позволяет подключить внешнюю антенну с помощью кабеля.
На обратной стороне модуля находится слот для SIM-карты. С этим модулем работает любая 2G Micro SIM-карта. Если вы не уверены, как правильно вставить SIM-карту, найдите небольшую гравировку рядом со слотом, показывающую правильное направление.
Особенности
Несмотря на очень маленький размер — примерно 1 квадратный дюйм (примерно размер почтовой марки) — модуль SIM800L предлагает множество мощных функций:
Поддержка четырёх диапазонов: GSM850, EGSM900, DCS1800 и PCS1900
Подключение к любой глобальной GSM-сети с любой 2G SIM-картой
Совершение и приём голосовых вызовов через внешний динамик 8 Ом и электретный микрофон
Отправка и приём SMS-сообщений
Отправка и приём данных GPRS (TCP/IP, HTTP и т.д.)
Сканирование и приём FM-радиопередач
Мощность передачи: класс 4 (2 Вт) для GSM850
Класс 1 (1 Вт) для DCS1800
Светодиодные индикаторы состояния
Модуль SIM800L имеет светодиод, показывающий состояние подключения к сотовой сети. Светодиод мигает с разной частотой в зависимости от того, что делает модуль:
Мигание каждую 1 с
Чип работает, но ещё не подключился к сотовой сети.
Мигание каждые 2 с
Запрошенное GPRS-соединение для передачи данных активно и работает.
Мигание каждые 3 с
Модуль успешно подключился к сотовой сети и готов к отправке/приёму текстовых сообщений и телефонных звонков.
Эти паттерны мигания помогают в диагностике проекта и позволяют узнать, когда модуль работает правильно.
Выбор антенны
Модулю SIM800L нужна внешняя антенна для подключения к сотовой сети, и выбор правильной антенны критически важен для хорошей работы. У вас есть два основных варианта:
Первый вариант — небольшая спиральная антенна. Эта антенна обычно поставляется с модулем и может быть припаяна непосредственно к плате. Она идеальна, когда у вас мало места. Однако может быть сложно получить хорошее соединение, особенно если проект находится внутри здания, где сотовый сигнал слабее.
Второй вариант — GSM-антенна 3 дБи с переходником U.FL на SMA. Их можно найти в интернете менее чем за $3. Эта антенна защёлкивается в маленький разъём U.FL в верхнем левом углу модуля. Этот тип антенны работает намного лучше спиральной. Вы даже можете поместить модуль внутрь металлической коробки, если сама антенна выступает наружу.
Потребляемая мощность
Обеспечение достаточного питания модулю SIM800L — одна из самых важных составляющих его правильной работы.
SIM800L может потреблять значительную мощность в зависимости от того, что он делает. Например, ему нужно около 216 мА при совершении телефонного звонка и около 80 мА при обычной сетевой связи. Но в определённые моменты, например при передаче данных короткими импульсами, ему может внезапно потребоваться до 2 А тока! Если ваш источник питания не может обеспечить такую мощность при необходимости, модуль будет постоянно перезагружаться или просто не работать.
Эта таблица из технического описания показывает, сколько мощности модуль потребляет в различных режимах.
Выбор источника питания
Модуль SIM800L не имеет встроенного стабилизатора напряжения. Это означает, что вам нужно обеспечить питание в диапазоне от 3,4 до 4,4 В (оптимально 4,0 В). Что ещё важнее, ваш источник питания должен выдерживать внезапные броски тока до 2 А. Если он не может, чип будет перезагружаться каждый раз, когда ему потребуется больше мощности.
Вот два хороших варианта питания SIM800L:
LiPo-аккумулятор
LiPo-аккумулятор — отличный выбор, потому что его напряжение естественно попадает в диапазон 3,7–4,2 В, что идеально для SIM800L. Подойдёт любой LiPo-аккумулятор ёмкостью от 1200 мАч. Эти аккумуляторы могут выдерживать внезапные броски тока до 2 А, сохраняя стабильное напряжение.
Понижающий DC-DC-преобразователь
Другой хороший вариант — использование понижающего DC-DC-преобразователя с номинальным током 2 А, например LM2596, с выходным напряжением, установленным на 4,0 В (оптимальное напряжение для модуля). В отличие от простых стабилизаторов напряжения, эти преобразователи тратят меньше энергии и обеспечивают стабильный источник питания для модуля даже в моменты высоких нагрузок.
Распиновка GSM-модуля SIM800L
Модуль SIM800L имеет 12 выводов, каждый с определённой функцией. Давайте рассмотрим, что делает каждый вывод, чтобы вы могли правильно использовать этот модуль в своих проектах.
NET — сюда подключается спиральная антенна, поставляемая с модулем.
VCC — это вывод питания. SIM800L требует напряжение от 3,4 до 4,4 В. Это важно помнить, потому что подключение к 5V-выходу Arduino может повредить модуль. Даже 3,3V-выход Arduino недостаточен для правильного питания! Вместо этого используйте LiPo-аккумулятор или понижающий DC-DC-преобразователь для получения нужного напряжения.
RST (сброс) используется для перезагрузки модуля. Если SIM800L зависает или начинает вести себя странно, вы можете подать LOW на этот вывод примерно на 100 мс для выполнения аппаратного сброса.
RxD (приёмник) принимает команды, которые вы отправляете модулю. Этот вывод имеет функцию «автоопределения скорости передачи», что означает, что скорость, с которой вы отправите первую команду «AT» после сброса, установит скорость для всей последующей связи.
TxD (передатчик) отправляет данные от модуля обратно к вашему микроконтроллеру.
GND — это просто вывод заземления, который нужно подключить к земле вашей схемы.
RING — это индикатор вызова. По сути, это вывод «прерывания» от модуля. По умолчанию он находится в HIGH, но может быть настроен на переход в LOW при поступлении телефонного звонка или текстового сообщения. Это полезно для запуска оповещений в вашем проекте.
Вывод DTR управляет спящим режимом модуля. Если подать HIGH на этот вывод, модуль войдёт в спящий режим, отключив последовательную связь для экономии энергии. Для пробуждения подайте LOW примерно на 50 мс.
MIC± используются для подключения внешнего микрофона. Это дифференциальные входы микрофона, то есть вы можете напрямую подключить электретный микрофон к этим двум выводам. Это позволяет модулю захватывать звук для телефонных звонков.
SPK± используются для подключения динамика. Как и выводы микрофона, это дифференциальные выходы для динамика. Это означает, что вы можете напрямую подключить маленький динамик к этим выводам для вывода звука во время разговоров.
Подключение GSM-модуля SIM800L к Arduino
Теперь, когда вы знакомы с модулем SIM800L, пора подключить его к Arduino и начать использовать!
Сначала подключите антенну к модулю и вставьте micro SIM-карту в слот.
Как вы знаете, модуль SIM800L использует UART для связи. На Arduino UNO вы обычно можете подключать устройства к выводам 0 и 1, предназначенным для этого типа связи. Однако есть проблема — эти же выводы используются при подключении Arduino к компьютеру (например, при загрузке кода или просмотре сообщений в мониторе последовательного порта).
Поскольку Arduino Uno имеет только одно встроенное UART-соединение, нам нужно создать второе для модуля SIM800L. Мы можем сделать это с помощью библиотеки SoftwareSerial, которая позволяет превратить обычные цифровые выводы в UART-выводы. Для нашего проекта мы будем использовать выводы 2 и 3.
Выполнение подключений
Итак, подключите вывод Tx (передача) SIM800L к цифровому выводу #3 на Arduino.
Но для вывода Rx (приём) нужно быть осторожным. Arduino Uno работает с 5V-сигналами, а модуль SIM800L — с 3,3V-сигналами. Если подключить их напрямую, можно повредить SIM800L.
Для решения этой проблемы мы используем простой делитель напряжения из резисторов: подключите резистор 10 кОм между выводом #2 Arduino и выводом Rx SIM800L. И подключите резистор 20 кОм между выводом Rx SIM800L и GND (землёй). Эта конфигурация безопасно понижает 5V-сигнал Arduino примерно до 3,3 В, которые может принять SIM800L.
Последний шаг — подключение питания к модулю. Вот два способа:
Вариант 1: С использованием аккумулятора
В этой конфигурации LiPo-аккумулятор ёмкостью 1200 мАч питает модуль SIM800L.
Вариант 2: С использованием преобразователя напряжения
В этой конфигурации понижающий DC-DC-преобразователь LM2596 обеспечивает правильное напряжение.
Предупреждения:
Будьте очень осторожны при подключении и отключении источника питания: всегда подключайте GND (землю) перед подключением VCC (питание). А при отключении сначала отключайте VCC, затем GND. Если случайно отключить GND первым, модуль может попытаться использовать низковольтные последовательные выводы как землю, что может повредить SIM800L.
Убедитесь, что ваша схема и Arduino имеют общую землю.
Код Arduino — Тестирование AT-команд
Начнём с тестирования AT-команд с нашим модулем SIM800L. Эти команды помогают нам общаться с модулем и проверять, работает ли он правильно. Для этого мы будем использовать монитор последовательного порта в Arduino IDE.
Прежде чем углубляться в детали кода, сначала подключите Arduino к компьютеру, затем скомпилируйте и загрузите предоставленный код. После этого откройте монитор последовательного порта и убедитесь, что выбрана опция «Both NL and CR».
#include <SoftwareSerial.h>
//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2
void setup() {
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);
//Begin serial communication with Arduino and SIM800L
mySerial.begin(9600);
Serial.println("Initializing...");
delay(1000);
mySerial.println("AT"); //Once the handshake test is successful, it will back to OK
updateSerial();
mySerial.println("AT+CSQ"); //Signal quality test, value range is 0-31 , 31 is the best
updateSerial();
mySerial.println("AT+CCID"); //Read SIM information to confirm whether the SIM is plugged
updateSerial();
mySerial.println("AT+CREG?"); //Check whether it has registered in the network
updateSerial();
}
void loop() {
updateSerial();
}
void updateSerial() {
delay(500);
while (Serial.available()) {
mySerial.write(Serial.read()); //Forward what Serial received to Software Serial Port
}
while (mySerial.available()) {
Serial.write(mySerial.read()); //Forward what Software Serial received to Serial Port
}
}
После загрузки кода откройте монитор последовательного порта на скорости 9600 бод. Вы должны увидеть вывод, как показано ниже.
Объяснение кода:
Мы начинаем с подключения библиотеки SoftwareSerial, которая позволяет использовать цифровые выводы как дополнительные порты последовательной связи. Поскольку модуль SIM800L общается через последовательное соединение, нам нужно определить, какие выводы Arduino будут обрабатывать эту связь. Здесь Tx (передача) SIM800L подключён к выводу 3 Arduino, а Rx (приём) — к выводу 2 Arduino.
#include <SoftwareSerial.h>
//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2
Далее в функции setup() мы устанавливаем последовательную связь. Сначала настраиваем соединение между Arduino и монитором последовательного порта (вашим компьютером) на скорости 9600 бод.
Мы также настраиваем связь между Arduino и модулем SIM800L на той же скорости.
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);
//Begin serial communication with Arduino and SIM800L
mySerial.begin(9600);
После инициализации мы отправляем следующие AT-команды для проверки отклика модуля.
AT — это первая тестовая команда. Если модуль отвечает «OK», значит всё работает правильно. Эта команда также помогает с автоопределением скорости передачи, позволяя модулю автоматически настроиться на правильную скорость связи.
AT+CSQ — эта команда проверяет уровень сигнала. Она возвращает число от 0 до 31. Чем выше число, тем лучше сигнал. Если число слишком низкое, у модуля может быть слабое соединение из-за плохой антенны или неудачного расположения.
AT+CCID — эта команда проверяет, вставлена ли SIM-карта, и отображает её уникальный идентификационный номер.
AT+CREG? — проверяет, зарегистрирован ли модуль в мобильной сети. Если возвращает 1, вы подключены к домашней сети. Если 5 — вы в роуминге. Если другое число — модуль не подключён ни к какой сети.
mySerial.println("AT"); //Once the handshake test is successful, it will back to OK
updateSerial();
mySerial.println("AT+CSQ"); //Signal quality test, value range is 0-31 , 31 is the best
updateSerial();
mySerial.println("AT+CCID"); //Read SIM information to confirm whether the SIM is plugged
updateSerial();
mySerial.println("AT+CREG?"); //Check whether it has registered in the network
updateSerial();
В функции loop() мы вызываем пользовательскую функцию updateSerial(). Эта функция постоянно прослушивает команды, которые вы вводите в мониторе последовательного порта, и отправляет их модулю SIM800L. Она также прослушивает ответы от модуля SIM800L и выводит их в монитор последовательного порта, чтобы вы видели, что отвечает модуль.
void updateSerial() {
delay(500);
while (Serial.available()) {
mySerial.write(Serial.read()); //Forward what Serial received to Software Serial Port
}
while (mySerial.available()) {
Serial.write(mySerial.read()); //Forward what Software Serial received to Serial Port
}
}
Попробуйте отправить другие AT-команды
Когда модуль отвечает правильно, вы можете вручную вводить и отправлять различные AT-команды через монитор последовательного порта для получения дополнительной информации. Попробуйте эти:
ATI — эта команда возвращает название модуля и версию прошивки.
AT+COPS? — показывает, к какой мобильной сети вы сейчас подключены.
AT+COPS=? — отображает все доступные сети в вашем районе.
AT+CBC — проверяет состояние батареи модуля SIM800L. Покажет процент заряда и уровень напряжения.
Код Arduino — Отправка текстового сообщения
Теперь, когда мы протестировали базовые AT-команды, перейдём к более интересному — отправке текстового сообщения на любой номер с помощью модуля SIM800L.
Перед загрузкой кода вам нужно ввести номер телефона, на который вы хотите отправить сообщение. Найдите в коде раздел с ZZxxxxxxxxxx и замените его правильными данными:
ZZ — код вашей страны (например, 1 для США, 91 для Индии).
xxxxxxxxxx — 10-значный номер телефона, на который вы хотите отправить сообщение.
Введя правильный номер телефона, вы можете скомпилировать и загрузить код на Arduino.
#include <SoftwareSerial.h>
//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2
void setup() {
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);
//Begin serial communication with Arduino and SIM800L
mySerial.begin(9600);
Serial.println("Initializing...");
delay(1000);
mySerial.println("AT"); //Once the handshake test is successful, it will back to OK
updateSerial();
mySerial.println("AT+CMGF=1"); // Configuring TEXT mode
updateSerial();
mySerial.println("AT+CMGS=\"+ZZxxxxxxxxxx\""); //change ZZ with country code and xxxxxxxxxxx with phone number to sms
updateSerial();
mySerial.print("Last Minute Engineers | lastminuteengineers.com"); //text content
updateSerial();
mySerial.write(26);
}
void loop() {
}
void updateSerial() {
delay(500);
while (Serial.available()) {
mySerial.write(Serial.read()); //Forward what Serial received to Software Serial Port
}
while (mySerial.available()) {
Serial.write(mySerial.read()); //Forward what Software Serial received to Serial Port
}
}
После загрузки кода откройте монитор последовательного порта в Arduino IDE и дождитесь отправки сообщения модулем. Если всё настроено правильно, вы должны получить текстовое сообщение на указанный номер.
Объяснение кода:
Скетч очень похож на первый, за исключением следующих AT-команд для отправки текстового сообщения на конкретный номер:
AT+CMGF=1 — эта команда переводит GSM-модем в текстовый режим SMS. По умолчанию модем использует режим PDU (Protocol Data Unit), который более сложен, поэтому мы переключаем его в текстовый режим для упрощения отправки сообщений.
AT+CMGS=+ZZxxxxxxxxxx — команда AT+CMGS, за которой следует номер телефона, сообщает модулю SIM800L, что мы хотим отправить текстовое сообщение на этот номер. После отправки этой AT-команды любой введённый текст, за которым следует символ «Ctrl+Z», будет обработан как текстовое сообщение. Символ «Ctrl+Z» (код ASCII 26) сообщает модулю, что вы закончили ввод сообщения и его нужно отправить немедленно.
mySerial.println("AT+CMGF=1"); // Configuring TEXT mode
updateSerial();
mySerial.println("AT+CMGS=\"+ZZxxxxxxxxxx\"");//change ZZ with country code and xxxxxxxxxxx with phone number to sms
updateSerial();
mySerial.print("Last Minute Engineers | lastminuteengineers.com"); //text content
updateSerial();
mySerial.write(26);
Важно отметить, что функция loop() пуста. Это потому, что мы хотим отправить текстовое сообщение только один раз при запуске Arduino. Если вы хотите отправить ещё одно сообщение, просто нажмите кнопку RESET на Arduino, что перезапустит программу и отправит сообщение снова.
Код Arduino — Чтение текстового сообщения
Теперь запрограммируем Arduino для чтения входящих текстовых сообщений. Это может быть невероятно полезно в ситуациях, когда вы хотите выполнить действие на основе полученного сообщения. Представьте, что вы можете включить свет, запустить вентилятор или активировать систему полива, просто отправив сообщение с телефона.
#include <SoftwareSerial.h>
//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2
void setup() {
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);
//Begin serial communication with Arduino and SIM800L
mySerial.begin(9600);
Serial.println("Initializing...");
delay(1000);
mySerial.println("AT"); //Once the handshake test is successful, it will back to OK
updateSerial();
mySerial.println("AT+CMGF=1"); // Configuring TEXT mode
updateSerial();
mySerial.println("AT+CNMI=1,2,0,0,0"); // Decides how newly arrived SMS messages should be handled
updateSerial();
}
void loop() {
updateSerial();
}
void updateSerial() {
delay(500);
while (Serial.available()) {
mySerial.write(Serial.read()); //Forward what Serial received to Software Serial Port
}
while (mySerial.available()) {
Serial.write(mySerial.read()); //Forward what Software Serial received to Serial Port
}
}
После загрузки кода откройте монитор последовательного порта и отправьте текстовое сообщение на модуль SIM800L с вашего телефона. Вы должны увидеть входящее сообщение на экране.
Как видите, ответ начинается с +CMT: с деталями в формате через запятую. Первое поле — номер телефона отправителя, второе — имя отправителя (если доступно), третье — временная метка, а последнее — текст сообщения.
Объяснение кода:
Скетч очень похож на первый, за исключением следующих AT-команд для чтения полученного сообщения:
AT+CMGF=1 — переводит GSM-модем в текстовый режим SMS. По умолчанию модуль использует режим PDU, который сложнее для чтения, поэтому мы переключаем в текстовый режим.
AT+CNMI=1,2,0,0,0 — эта команда управляет обработкой входящих сообщений. Она позволяет указать модулю SIM800L, пересылать ли входящие сообщения напрямую в монитор последовательного порта или сохранять их в хранилище. Если сообщения сохраняются, модуль уведомит компьютер об их расположении в хранилище.
mySerial.println("AT+CMGF=1"); // Configuring TEXT mode
updateSerial();
mySerial.println("AT+CNMI=1,2,0,0,0"); // Decides how newly arrived SMS messages should be handled
updateSerial();
Обратите внимание, что в отличие от предыдущего скетча, функция loop() не пуста. Поскольку нам нужно непрерывно проверять новые сообщения, код постоянно прослушивает входящие сообщения в бесконечном цикле, обеспечивая немедленное отображение любого нового сообщения в мониторе последовательного порта.
Обработка длинных сообщений
Если вы заметили, что длинные сообщения обрезаются или теряют символы, не волнуйтесь — проблема не в вашем коде. Это происходит потому, что «буфер приёма программного последовательного порта» слишком мал. По умолчанию он установлен на 64 байта, то есть может хранить только ограниченный объём данных, отбрасывая остальное.
Решение простое: увеличьте размер буфера SoftwareSerial до 256 байт. Если вы используете ПК с Windows, выполните следующие шаги:
Перейдите в C:Program Files (x86)ArduinohardwarearduinoavrlibrariesSoftwareSerialsrc и откройте файл SoftwareSerial.h в текстовом редакторе. Найдите строку, определяющую размер буфера:
// RX buffer size
#define _SS_MAX_RX_BUFF 64
Измените значение с 64 на 256:
// RX buffer size
#define _SS_MAX_RX_BUFF 256
Сохраните файл и повторно загрузите код на Arduino. Теперь Arduino сможет принимать и отображать более длинные сообщения без потери символов.
Код Arduino — Совершение звонка
Теперь запрограммируем Arduino для совершения телефонного звонка. Это может быть невероятно полезно в экстренных ситуациях, когда Arduino нужно автоматически набрать номер для вызова помощи. Представьте сценарии: пожарная сигнализация обнаруживает высокую температуру или система безопасности обнаруживает нарушителя — в таких случаях Arduino может совершить звонок для немедленного оповещения.
Перед запуском кода вам нужно ввести номер телефона, на который Arduino должен позвонить. Найдите раздел с ZZxxxxxxxxxx и замените:
ZZ — код страны (например, 1 для США, 91 для Индии).
xxxxxxxxxx — 10-значный номер телефона.
После обновления номера загрузите код на Arduino.
#include <SoftwareSerial.h>
//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2
void setup() {
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);
//Begin serial communication with Arduino and SIM800L
mySerial.begin(9600);
Serial.println("Initializing...");
delay(1000);
mySerial.println("AT"); //Once the handshake test is successful, i t will back to OK
updateSerial();
mySerial.println("ATD+ +ZZxxxxxxxxxx;"); // change ZZ with country code and xxxxxxxxxxx with phone number to dial
updateSerial();
delay(20000); // wait for 20 seconds...
mySerial.println("ATH"); //hang up
updateSerial();
}
void loop() {
}
void updateSerial() {
delay(500);
while (Serial.available()) {
mySerial.write(Serial.read()); //Forward what Serial received to Software Serial Port
}
while (mySerial.available()) {
Serial.write(mySerial.read()); //Forward what Software Serial received to Serial Port
}
}
После загрузки кода модуль SIM800L автоматически наберёт указанный номер. Если всё работает правильно, телефон получателя должен зазвонить.
Объяснение кода:
Скетч очень похож на первый, за исключением следующих AT-команд для совершения телефонного звонка.
ATD+ +ZZxxxxxxxxxx; — эта команда используется для набора номера. Очень важно включить точку с запятой (;) в конце команды, так как она указывает модулю совершить голосовой вызов вместо вызова данных. После отправки этой команды модуль SIM800L начинает звонить на указанный номер.
ATH — эта команда указывает модулю повесить трубку и завершить звонок.
mySerial.println("ATD+ +ZZxxxxxxxxxx;"); // change ZZ with country code and xxxxxxxxxxx with phone number to dial
updateSerial();
delay(20000); // wait for 20 seconds...
mySerial.println("ATH"); //hang up
updateSerial();
Код ждёт 20 секунд, давая достаточно времени для звонка. После этого отправляется ATH для завершения вызова. Если вы хотите завершить звонок раньше, уменьшите задержку. Если хотите, чтобы звонок длился дольше — увеличьте.
Поскольку звонок совершается один раз при запуске Arduino, функция loop() пуста. Для повторного звонка нажмите кнопку RESET на Arduino.
Код Arduino — Приём звонка
В отличие от совершения звонка или отправки сообщения, для приёма входящего звонка на модуле SIM800L не требуется специального кода. Arduino просто прослушивает входящие сигналы, и при поступлении звонка информация отображается в мониторе последовательного порта.
Это полезно, когда вы хотите, чтобы Arduino обнаруживал звонки с определённых номеров и выполнял действие — например, разблокировал дверь, включил свет или активировал охранную сигнализацию.
#include <SoftwareSerial.h>
//Create software serial object to communicate with SIM800L
SoftwareSerial mySerial(3, 2); //SIM800L Tx & Rx is connected to Arduino #3 & #2
void setup() {
//Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
Serial.begin(9600);
//Begin serial communication with Arduino and SIM800L
mySerial.begin(9600);
Serial.println("Initializing...");
}
void loop() {
updateSerial();
}
void updateSerial() {
delay(500);
while (Serial.available()) {
mySerial.write(Serial.read()); //Forward what Serial received to Software Serial Port
}
while (mySerial.available()) {
Serial.write(mySerial.read()); //Forward what Software Serial received to Serial Port
}
}
После загрузки кода откройте монитор последовательного порта. В момент звонка на номер SIM-карты модуля вы увидите слово «RING» в мониторе последовательного порта, за которым следует номер звонящего.
Объяснение кода:
Код очень прост, потому что приём звонка не требует отправки AT-команд модулю.
Функция loop() непрерывно выполняет updateSerial(), которая прослушивает данные от модуля SIM800L. При поступлении звонка модуль автоматически выводит «RING», за которым следует номер звонящего и другие данные. Таким образом, вы можете видеть, кто звонит, в реальном времени.
Следующие AT-команды можно использовать для ответа на звонок или его завершения:
ATA — эта команда используется для ответа на звонок.
ATH — эта команда используется для немедленного завершения звонка. После завершения вызова вы увидите «NO CARRIER» в мониторе последовательного порта, что указывает на разъединение.