Режим сна SIM800L и пробуждение Arduino
Привет, друзья! Тему этой статьи предложили подписчики. Их интересует режим сна GSM-модуля SIM800L.
На фото — собранный и работающий стенд для тестирования моей программы. После включения Arduino Nano обменивается командами с SIM800, отправляет команду перехода в режим сна и затем сам засыпает.
Оба устройства находятся в режиме ожидания звонка. Амперметр показывает общий ток потребления шилда — 15 мА, включая контроллер, GSM-модуль, стабилизаторы питания и светодиод.
Теперь я совершаю звонок на номер SIM-карты в модуле. При этом ток возрастает, устройство принимает вызов и сразу сбрасывает. После этого схема возвращается в режим сна, и ток снова падает до 15 мА.
Я отдельно измерил ток потребления SIM800L в режиме сна. При питании 4 В он составляет около 13 мА.
Схема подключения
Подключение аналогично предыдущим проектам. Используется программный UART Arduino Nano. Пробуждение также происходит через UART.
Для упрощения сборки я использую
наш шилд, доступный на сайте geekmatic.in.ua. Но вы можете собрать схему самостоятельно.
Энергосберегающие режимы SIM800L
Модуль SIM800L поддерживает несколько режимов энергосбережения, но только в режиме сна (Sleep) он способен принимать вызовы и SMS.
Пробуждение SIM800 возможно по следующим событиям:
- Нулевым уровнем на пин DTR
- Входящим звонком
- Входящим SMS
- Внешним прерыванием
В нашем случае интересны звонок и SMS.
AT-команда CSCLK
Команда AT+CSCLK управляет режимом сна. У неё три режима:
- 0 — сон отключен
- 1 — включение медленных тактов при DTR=1
- 2 — автоматический переход в сон: при отсутствии активности модуль засыпает, при обращении — просыпается
Программа для Arduino
//https://geekmatic.in.ua | https://pinout.uno
#include "LowPower.h"
#include <SoftwareSerial.h>
SoftwareSerial SIM800serial (2, 3);
#define OK 1
#define NOTOK 2
#define TIMEOUT 3
String txt;
void setup() {
pinMode(5, OUTPUT);
digitalWrite(5, HIGH); //SIM800 ON only for this module
Serial.begin(9600);
SIM800serial.begin(9600);
delay(8000);
SIM800command("AT", "SMS Ready", "ERROR", 500, 5);
}
void loop() {
//list of supported sleep modes
Serial.println("Loop");
SIM800command("AT+CSCLK=?", "OK", "ERROR", 5000, 1);
SIM800command("AT+CSCLK?", "OK", "ERROR", 5000, 1);
delay(5000);
SIM800command("AT+CSCLK=2", "OK", "ERROR", 5000, 1);
delay(1000);
//int wakeUpPin = 2;
//pinMode(wakeUpPin, INPUT);
//attachInterrupt(0, wakeUp, LOW);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
//detachInterrupt(0);
Serial.println("Awake!");
SIM800command("AT", "OK", "ERROR", 200, 5);
//SIM800command("AT+CSCLK=0", "OK", "ERROR", 5000, 1);
SIM800command("ATH", "OK", "ERROR", 500, 3);
delay(5000);
SIM800command("AT", "OK", "ERROR", 200, 5);
}
void wakeUp()
{
// Just a handler for the pin interrupt.
}
byte SIM800command(String command, String response1, String response2, uint16_t timeOut, uint16_t repetitions) {
byte returnValue = NOTOK;
byte countt = 0;
while (countt < repetitions && returnValue != OK) {
SIM800serial.println(command);
if (SIM800waitFor(response1, response2, timeOut) == OK) {
returnValue = OK;
} else {returnValue = NOTOK;}
countt++;
}
return returnValue;
}
byte SIM800waitFor(String response1, String response2, uint16_t timeOut) {
uint16_t entry = 0;
uint16_t count = 0;
String reply = SIM800read();
byte retVal = 99;
do {
reply = SIM800read();
delay(1);
entry ++;
} while ((reply.indexOf(response1) + reply.indexOf(response2) == -2) && entry < timeOut );
if (entry >= timeOut) {
retVal = TIMEOUT;
} else {
if (reply.indexOf(response1) + reply.indexOf(response2) > -2) retVal = OK;
else retVal = NOTOK;
}
return retVal;
}
String SIM800read() {
String reply = "";
if (SIM800serial.available()) {
reply = SIM800serial.readString();
}
if (reply!=""){
Serial.print("Reply: ");
Serial.println(reply);
txt = reply;
}
return reply;
}
В начале кода подключаются две библиотеки: LowPower — для сна Arduino, и SoftwareSerial — для UART.
Пин D5 подаётся в высокий уровень для включения питания SIM800 — это особенность нашего шилда.
Далее в цикле:
- Запрос поддерживаемых режимов сна
- Запрос текущего режима
- Перевод SIM800 в автоматический режим сна (режим 2)
Затем Arduino засыпает. Пробуждение происходит через UART: если SIM800L отправит сообщение, контроллер проснётся, выведет Awake! и отправит ATH — сброс вызова.
Результаты
Я загрузил программу, перезапускаю контроллер и читаю ответы в мониторе порта. Видим:
- Поддерживаемые режимы от 0 до 2
- Текущий режим — 0 (сон отключён)
- Модуль переведён в режим 2 — автоматический сон
Контроллер уходит в сон, цикл останавливается. Я звоню на номер SIM-карты — Arduino просыпается, пишет Awake!, обрабатывает звонок и сбрасывает его.
Альтернативное пробуждение
Если пробуждения по UART недостаточно, в коде есть закомментированные строки для пробуждения по сигналу RING через прерывание на пине D2. Также реализована функция wakeup() — для этого UART нужно будет перенести на другие пины.
Проверка пробуждения по SMS
Все спят. Отправляю SMS с текстом «My SMS» на номер модуля. Видим в мониторе «кракозябры» от модуля и команду ATH. Содержимое SMS можно прочитать отдельной AT-командой.
Выводы
Мы рассмотрели автоматический режим сна SIM800L. Он особенно полезен при автономном питании и позволяет значительно продлить время работы устройства от одного заряда. Отличный выбор для GSM-устройств, ожидающих команду от пользователя.
Желаю вам успехов! Пишите в комментариях темы, которые вас интересуют, подписывайтесь и ставьте лайки.
Пушка Гауса
Подключаем к контроллеру Arduino, stm32, Raspberry PI пушку Гауса через электропускателиА если ещё с..
Адаптер USB 2.0 в TTL UART
Коммуникационный конвертер USB 2.0 в TTL UARTОснован на микросхеме CP2102Имеется самовоста..
125.05грн.
Контроллер WeMos D1 mini ESP8266
Очень маленькая и дешевая плата контроллера с WiFi связью на борту. Не может похвастаться множеством..
112.31грн.
Arduino SIM800 управление реле по исходящему звонку
Предлагаю вашему вниманию пример простого применения возможностей SIM800 при исходящем звонке. В рез..
Модуль блока питания 5В 700мА
Миниатюрный безкорпусный трансформаторный блок питания для любительских проектов.Входное напряжение ..
70.15грн.






