Віримо в перемогу ЗСУ!
Працюємо з 09:00 до 19:00 Пн-Пт

Привет друзья! У полюбившегося нам SIM800L есть аналого-цифровой преобразователь, который предназначен для измерения напряжения питания. Для получения измеренной величины предусмотрена отдельная AT-команда CBC. В этом видео мы детально познакомимся и поработаем с этой командой, а так же напишем парсер данных, которые она возвращает в числовые переменные.

Теперь самое время поделиться ссылкой на это видео с друзьями – это очень поможет нам продолжать снимать подобные ролики. Так же помогает подписка и ваши лайки. Идем дальше.


В документации на SIM800L расшифровка команды CBC следующая. Первая команда – информационная AT+CBC=? Она возвратит возможные параметры ответа. То есть, что от неё можно ожидать. А сам запрос нужно подавать без вопросительного знака, то есть AT+CBC. И в ответ мы должны получить напряжение в милливольтах, заряд в процентах, а так же условное состояние зарядного устройства. Тут представлены три таких состояния: не заряжается; заряжается и зарядка завершена. Но у модуля SIM800L я не нашел следов зарядных функций ни на блок-схеме ни на схемах подключения обвязки, поэтому и назвал состояния условными. У других GSM-модулей внутри есть зарядные устройства и у них есть вход питания и выход на аккумулятор.

У SIM800L есть только вход питания и на нем напряжение и будет меряться. Это очень удобная функция изучаемой микросборки. Особенно, если питать устройство от аккумулятора. Так можно дистанционно организовать отправку хозяину сведений о состоянии питания устройства через веб-интерфейс или через смс.

Для демонстрации работы этой AT-команды я как всегда воспользуюсь наработками из прошлых видео. Возьму прошлую программу, а так же наш готовый модуль для Arduino Nano и SIM800.

Открываю программу Arduino IDE со скетчем из прошлого видео. Здесь я сначала убираю команду ATD и задержку delay. Очищаю функцию loop и, вставляю в неё новую команду CBC.

Убираю функцию чтения SIM800read и делаю txt глобальной переменной, выводя её за пределы функций. Она мне понадобится для парсинга измеренных значений напряжения из ответа от SIM800.

Теперь захожу во вкладку GSM и добавляю присвоение текстового ответа GSM-модуля переменной txt.

Загружаю скетч в контроллер и запускаю монитор порта.

На команду CBC, SIM800 отвечает тремя цифрами. Ноль – это не заряжается, согласно инструкции. 63 – это уровень заряда аккумулятора в процентах. А за 100% тут берется где-то 4,2В. Третья цифра – это напряжение в милливольтах. В данном случае у меня напряжение питания составляет 3,911В. 

Команду мы проверили и расшифровали ответ, а теперь я предлагаю выбрать автоматически из этого текста цифры и передать в числовые переменные.

Делаем изменения в программе. Добавляем строки парсинга процента заряда аккумулятора из текстовой переменной txt. Сохранять полученное число будем в переменную bat типа integer. Так же здесь добавилась распечатка значения переменной bat в монитор порта.

Загружаем программу в Arduino Nano  и запускаем монитор порта.

Получаем парсинг уровня заряда аккумулятора.

Теперь идем дальше и организуем парсинг так же напряжения в вольтах.

#include <SoftwareSerial.h>

SoftwareSerial SIM800serial (2, 3);

#define OK 1
#define NOTOK 2
#define TIMEOUT 3

String txt;

void setup() {
  pinMode(7, OUTPUT); //relay1
  pinMode(8, OUTPUT); //relay2
  
  Serial.begin(9600);
  SIM800serial.begin(9600);
  delay(10000);
  SIM800command("AT", "OK", "ERROR", 500, 5);
}

void loop() {
  
  SIM800command("AT+CBC", "OK", "ERROR", 5000, 1);

  txt = txt.substring(txt.indexOf(",") + 1, txt.length());
  int bat = txt.toInt();
  txt = txt.substring(txt.indexOf(",") + 1, txt.length());
  float Ubat = txt.toFloat();

  Serial.print("Battery: ");
  Serial.print(bat);
  Serial.print("% U: ");
  Serial.print(Ubat/1000.0, 3);
  Serial.print("V");
  
  delay(2000);
}

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;
  }
  txt = reply;
  return retVal;
}

String SIM800read() {
  String reply = "";

  if (SIM800serial.available())  {
    reply = SIM800serial.readString();
  }

  if (reply!=""){
    Serial.print("Reply: ");
    Serial.println(reply);
  }
  
  return reply;
}

Загружаю новую программу и слежу за монитором порта.

Вот мы и получили напряжение питания SIM800L. Теперь эти данные легко включить в отправку сообщения хозяину через различные технологии связи, поддерживаемые модулем.

А теперь не забудьте подписаться и поделиться этим видео с друзьями. Ожидайте наши новые выпуски в ближайшее время. Так же заходите на сайт geekmatic.in.ua Спасибо за внимание и до новых встреч.

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

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

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

Обмен данными между двумя Arduino при помощи программного UART

Обмен данными между двумя Arduino при помощи программного UARTКоммуникация по последовательному порт..

Концевой выключатель или концевик

Концевой выключатель или концевик

Имеет одну группу переключающихся контактов. На кончике рычага установлен подвижный ролик.Максимальн..

22.63грн.

Электронный термостат на нагрев или охлаждение

Электронный термостат на нагрев или охлаждение

ОписаниеПрограммируемый терморегулятор предназначен для контроля температуры в диапазоне от -50 °С д..

178.96грн.

Мотор шилд для Arduino UNO MEGA

Мотор шилд для Arduino UNO MEGA

Шилд под платы контроллеров Arduino UNO, Arduino MEGA с четырёхканальным драйвером дв..

115.78грн.

Прото шилд для WeMos D1 mini

Прото шилд для WeMos D1 mini

Монтажный шилд для прототипирования под плату контроллера WeMos D1 miniВ комплекте традиционно ..

36.25грн.