Привіт друзі! 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 Дякуємо за увагу і до нових зустрічей.
Ремінь зубчастий 6 мм 200 мм
Зубчастий вкритий гумою ремінь для передачі механічної енергії обертання від одного зубчастого колес..
43.74грн.
Arduino управління двигунами постійного струму
Arduino управління двигунами постійного струму1. Управління маленькими моторчикамиУправління маленьк..
Автоматичне реверсивне управління двигуном з ATtiny85
Постановка задачі проекту Ставимо задачу автоматично тягати двигуном постійного струму корисну ..
Муфта на кроковий двигун 5x5x25мм
Ця муфта слугує перехідником між валами 5 мм та 5 мм. Тобто містить з обох боків отвір діаметром 5 м..
60.04грн.
HTTP запит через GSM GPRS модуль NEOWAY M590
Постановка задачі. В цьому проекті подивимося на практичний приклад відправлення http get запиту за..





