Режим сна 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 UNO — Часть 2. Работа с прерываниями таймеров

Таймеры Arduino UNO — Часть 2. Работа с прерываниями таймеров

Таймеры Arduino UNO — Часть 2. Работа с прерываниями таймеров Теория Что такое прерыва..

Микрофон ёмкостный электретный 6х5мм

Микрофон ёмкостный электретный 6х5мм

Миниатюрный монофонический микрофон с двумя ножкамиДиаметр 6 ммДлина 5 ммТип электретныйЧувствительн..

7.60грн.

Arduino Nano + расширитель пинов + управление двигателем актуатора

Arduino Nano + расширитель пинов + управление двигателем актуатора

Пример реверсивного управления двигателем актуатора при помощи драйвера L298N и расширителя вхо..

Arduino многомерные массивы

Arduino многомерные массивы

Привет друзья! Это уже второе видео о массивах. В первом я рассказал, что знаю об одномерных массива..

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

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

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

112.31грн.