Режим сна 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 управляет режимом сна. У неё три режима:

  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 подаётся в высокий уровень для включения питания SIM800 — это особенность нашего шилда.

Далее в цикле:

  • Запрос поддерживаемых режимов сна
  • Запрос текущего режима
  • Перевод SIM800 в автоматический режим сна (режим 2)

Затем Arduino засыпает. Пробуждение происходит через UART: если SIM800L отправит сообщение, контроллер проснётся, выведет Awake! и отправит ATH — сброс вызова.

Результаты

Я загрузил программу, перезапускаю контроллер и читаю ответы в мониторе порта. Видим:

  1. Поддерживаемые режимы от 0 до 2
  2. Текущий режим — 0 (сон отключён)
  3. Модуль переведён в режим 2 — автоматический сон

Контроллер уходит в сон, цикл останавливается. Я звоню на номер SIM-карты — Arduino просыпается, пишет Awake!, обрабатывает звонок и сбрасывает его.

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

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

Проверка пробуждения по SMS

Все спят. Отправляю SMS с текстом «My SMS» на номер модуля. Видим в мониторе «кракозябры» от модуля и команду ATH. Содержимое SMS можно прочитать отдельной AT-командой.



Выводы

Мы рассмотрели автоматический режим сна SIM800L. Он особенно полезен при автономном питании и позволяет значительно продлить время работы устройства от одного заряда. Отличный выбор для GSM-устройств, ожидающих команду от пользователя.

Желаю вам успехов! Пишите в комментариях темы, которые вас интересуют, подписывайтесь и ставьте лайки.

<< Проекты << Все товары >> Статьи, уроки >>

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Пушка Гауса

Пушка Гауса

Подключаем к контроллеру Arduino, stm32, Raspberry PI пушку Гауса через электропускателиА если ещё с..

Адаптер USB 2.0 в TTL UART

Адаптер USB 2.0 в TTL UART

Коммуникационный конвертер USB 2.0 в TTL UARTОснован на микросхеме CP2102Имеется самовоста..

125.05грн.

Контроллер WeMos D1 mini ESP8266

Контроллер WeMos D1 mini ESP8266

Очень маленькая и дешевая плата контроллера с WiFi связью на борту. Не может похвастаться множеством..

112.31грн.

Arduino SIM800 управление реле по исходящему звонку

Arduino SIM800 управление реле по исходящему звонку

Предлагаю вашему вниманию пример простого применения возможностей SIM800 при исходящем звонке. В рез..

Модуль блока питания 5В 700мА

Модуль блока питания 5В 700мА

Миниатюрный безкорпусный трансформаторный блок питания для любительских проектов.Входное напряжение ..

70.15грн.