Режим сну 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 відповідає за режим сну та має три режими:

  1. 0 — режим сну вимкнено
  2. 1 — активуються повільні такти при встановленому DTR=1
  3. 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 для завершення виклику.

Результати

Я прошив контролер цією програмою, перезапускаю його і читаю монітор порту. Бачимо відповіді на три запити:

  1. SIM800 повідомляє про режими сну (0–2)
  2. Поточний режим — 0 (сон вимкнено)
  3. Модуль переведено в режим 2 — автоматичний сон

Контролер переходить у сон, цикл зупиняється. Я телефоную — Arduino прокидається і пише Awake!. Потім отримує інформацію про виклик, кладе трубку, і цикл повторюється.

Альтернативне пробудження

UART працює добре, але в програмі передбачено альтернативне пробудження по сигналу RING через переривання на піні D2. Також є функція wakeup() для пробудження з інших пінів — потрібно лише змінити підключення UART.

SMS-повідомлення

Тепер перевіримо пробудження за допомогою SMS. Все спить. Відправляю SMS з текстом "My SMS" на номер модуля. Бачимо "кракозябри" від GSM-модуля і команду ATH — виклик завершено. SMS можна прочитати додатковою командою.



Висновки

Ми розглянули автоматичний режим сну SIM800L, що особливо корисно при живленні від акумулятора. Це дозволяє значно зменшити споживання енергії в режимі очікування.

Бажаю вам успіхів! Пропонуйте нові теми в коментарях, підписуйтеся і ставте вподобайки.

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Міні кнопка 12 x 12 x 4,3 мм

Міні кнопка 12 x 12 x 4,3 мм

Мініатюрна кнопка для встановлення на плату через отвориРозміри 12 x 12 x 4,3 мм..

4.14грн.

Кроковий двигун 28BYJ-48 з модулем драйвера

Кроковий двигун 28BYJ-48 з модулем драйвера

Кількість фаз 4Робоча напруга 5 ВКоефіцієнт зміни швидкості 1/64Кут повертання мінімальний 5.62..

114.93грн.

Адаптер для радіо модуля NRF24L01

Адаптер для радіо модуля NRF24L01

Модуль, що полегшує підключення радіо приймача-передавача NRF24L01 до любительських к..

26.73грн.

Модуль MicroSD карти пам'яті

Модуль MicroSD карти пам'яті

Модуль картки пам'яті з інтерфейсом SPI. Призначений для зберігання різноманітних даних контролера: ..

38.02грн.

Отримання даних через UART Arduino Nano

Отримання даних через UART Arduino Nano

Усім користувачам контролерів Arduino відомо, що можна передавати дані через апаратний порт UART кон..