Віримо в перемогу ЗСУ!
Працюємо з 09:00 до 18: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 разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Блок питания 12 В 5 А ноутбучный

Блок питания 12 В 5 А ноутбучный

Входное напряжение переменного тока 165...240 В 50/60 ГцВыходное стабилизированное напряжение 12 ВМа..

278.52грн.

Трансформатор тока 0-30А

Трансформатор тока 0-30А

Аналоговый датчик переменного тока силой до 30А. Это раскрывающийся трансформатор тока с диаметром о..

251.27грн.

Стойка латунная М3 высотой 20мм шестигранник мама-мама

Стойка латунная М3 высотой 20мм шестигранник мама-мама

Латунная стойка мама-мама с резьбой М3 и шестигранным внешним сечениемПрименяется при конструировани..

12.78грн.

LM317 линейный регулятор напряжения

LM317 линейный регулятор напряжения

Популярная микросхема - регулируемый регулятор напряженияВыходное напряжение 1,25 ... 37 ВВыходной т..

13.89грн.

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

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

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

178.96грн.