Привіт друзі! 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 Дякуємо за увагу і до нових зустрічей.
Кусачки PLATO 170
Довгограючі кусачки зі зручними потужними ручкамиЗастосовуються під час монтажу любительських електр..
134.01грн.
Гребінка з'єднувальна 2,54мм папа під пайку 40pin
Гребінка стандарту DIP 2,54 мм на 40 пінів під пайкуМожна ділити на потрібну кількість..
5.40грн.
Уроки Arduino типы данных для начинающих
Привет друзья от geekmatic.in.ua! Пора заняться полезным делом и разобрать типы данных, представле..
Тримач для батарейок 3хAA
Бокс для трьох пальчикових батарейок типу ААЗагальна напруга на вихідних дротах бокса вийде 4,5 В..
31.00грн.
Arduino основи програмування
Arduino основи програмуванняТут ми навчимося писати елементарну програму, здатну зробити що-небудь ц..





