Привет друзья! У полюбившегося нам 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 Спасибо за внимание и до новых встреч.
Шестерня для зубчатого ремня на 30 зубьев под ось 8 мм
Используется для передачи и редукции крутящего момента от двигателя до оси 8 ммКоличество зубьев 30 ..
80.11грн.
Управление тиристорами и симисторами
Самое простое включение тиристора и симистора В различных электронных устройствах в цепях перемен..
Трансформатор тока 0-30А
Аналоговый датчик переменного тока силой до 30А. Это раскрывающийся трансформатор тока с диаметром о..
261.79грн.
Подключение шагового двигателя
Привет, друзья! Предлагаю вам практический алгоритм, как правильно подключить обмотки шагового дви..
Припой с канифолью 0,5мм 30г
Нить припоя для тонкой пайки мелких радиодеталей, содержащая флюсСвинца 40 %Олова 60 %Флюса 1,2 %Нап..
211.57грн.





