Режим сну SIM800L та пробудження Arduino
Привіт, друзі! Тему цієї статті запропонували підписники. Їх цікавить режим сну у GSM-модуля SIM800L.
Перед вами вже зібраний і працездатний стенд для тестування моєї програми. Після ввімкнення Arduino Nano обмінюється кількома командами з SIM800, а потім надсилає команду для переходу в режим сну та сам також засинає.
В обох пристроях активовано режим очікування виклику. Амперметр показує споживання струму всього шилда — 15 мА, що включає Arduino, модуль GSM, стабілізатори живлення і світлодіод.
Тепер я здійснюю дзвінок, щоб "розбудити" схему. Під час виклику струм зростає, пристрій приймає дзвінок і відразу кладе трубку. Після цього схема знову переходить у режим сну, і споживання падає до 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 одразу піднімається в логічну 1 — це включає живлення SIM800 (особливість нашого шилда).
Далі в циклі:
- Запит підтримуваних режимів
- Запит поточного режиму сну
- Переведення SIM800 у режим автосну (режим 2)
Після цього Arduino засинає. Пробудження відбувається через UART: якщо SIM800 надсилає повідомлення, контролер прокидається, виводить Awake! і надсилає ATH для завершення виклику.
Результати
Я прошив контролер цією програмою, перезапускаю його і читаю монітор порту. Бачимо відповіді на три запити:
- SIM800 повідомляє про режими сну (0–2)
- Поточний режим — 0 (сон вимкнено)
- Модуль переведено в режим 2 — автоматичний сон
Контролер переходить у сон, цикл зупиняється. Я телефоную — Arduino прокидається і пише Awake!. Потім отримує інформацію про виклик, кладе трубку, і цикл повторюється.
Альтернативне пробудження
UART працює добре, але в програмі передбачено альтернативне пробудження по сигналу RING через переривання на піні D2. Також є функція wakeup() для пробудження з інших пінів — потрібно лише змінити підключення UART.
SMS-повідомлення
Тепер перевіримо пробудження за допомогою SMS. Все спить. Відправляю SMS з текстом "My SMS" на номер модуля. Бачимо "кракозябри" від GSM-модуля і команду ATH — виклик завершено. SMS можна прочитати додатковою командою.
Висновки
Ми розглянули автоматичний режим сну SIM800L, що особливо корисно при живленні від акумулятора. Це дозволяє значно зменшити споживання енергії в режимі очікування.
Бажаю вам успіхів! Пропонуйте нові теми в коментарях, підписуйтеся і ставте вподобайки.
Міні кнопка 12 x 12 x 4,3 мм
Мініатюрна кнопка для встановлення на плату через отвориРозміри 12 x 12 x 4,3 мм..
4.14грн.
Кроковий двигун 28BYJ-48 з модулем драйвера
Кількість фаз 4Робоча напруга 5 ВКоефіцієнт зміни швидкості 1/64Кут повертання мінімальний 5.62..
114.93грн.
Адаптер для радіо модуля NRF24L01
Модуль, що полегшує підключення радіо приймача-передавача NRF24L01 до любительських к..
26.73грн.
Модуль MicroSD карти пам'яті
Модуль картки пам'яті з інтерфейсом SPI. Призначений для зберігання різноманітних даних контролера: ..
38.02грн.
Отримання даних через UART Arduino Nano
Усім користувачам контролерів Arduino відомо, що можна передавати дані через апаратний порт UART кон..






