Привет друзья! У полюбившегося нам 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 Спасибо за внимание и до новых встреч.
Блок питания 12 В 5 А ноутбучный
Входное напряжение переменного тока 165...240 В 50/60 ГцВыходное стабилизированное напряжение 12 ВМа..
278.52грн.
Трансформатор тока 0-30А
Аналоговый датчик переменного тока силой до 30А. Это раскрывающийся трансформатор тока с диаметром о..
251.27грн.
Стойка латунная М3 высотой 20мм шестигранник мама-мама
Латунная стойка мама-мама с резьбой М3 и шестигранным внешним сечениемПрименяется при конструировани..
12.78грн.
LM317 линейный регулятор напряжения
Популярная микросхема - регулируемый регулятор напряженияВыходное напряжение 1,25 ... 37 ВВыходной т..
13.89грн.
Электронный термостат на нагрев или охлаждение
ОписаниеПрограммируемый терморегулятор предназначен для контроля температуры в диапазоне от -50 °С д..
178.96грн.