Привіт друзі! 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 Дякуємо за увагу і до нових зустрічей.
Трансформатор струму 0-100А
Аналоговий датчик змінного струму силою до 100А. Це роз'ємний трансформатор струму з діаметром отвор..
268.69грн.
Використання внутрішнього Watchdog таймера в ESP32
Використання внутрішнього Watchdog таймера в ESP32 Watchdog (WDT) — це вбудований таймер мікрокон..
Шестерня для зубчатого ременю на 16 зубців під вісь 5 мм
Використовується для передачі та редукції обертаючого моменту від двигуна до вісі 5 ммКількість зубц..
38.58грн.
SMD світлодіод 0603
SMD світлодіоди видимого діапазону для поверхневого монтажу на плату Типорозмір 0603 Червоний 619 ..
2.10грн.
Термопровідний клей STARS-922 5г
Теплопровідний клей для кріплення компонентів, що гріються, до радіаторів (світлодіоди, мікросхеми, ..
49.21грн.





