Привет друзья! У полюбившегося нам 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 Спасибо за внимание и до новых встреч.
Торцевые держатели линейных направляющих 8мм
Держатель цилиндрической направляющей диаметром 8 ммПодходит для любой оси 3D-принтера или CNCДиамет..
72.01грн.
Термостат с термопарой -60...+500°C 10А
Интересный термостатик, для задач, где не хватает диапазона температур обычных термостатов с резисти..
706.58грн.
Универсальная монтажная плата на 400 отверстий
Макетная плата на 400 отверстий для макетирования любительских схемотехнических проектов. Имеет 4 ли..
85.85грн.
Моно усилитель мощности 18 Вт TDA2030A
Модуль одноканального усилителя мощности звуковой частоты на основе легендарной микросхемы TDA2030A...
62.86грн.





