Привіт друзі! 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 Дякуємо за увагу і до нових зустрічей.
Електронний термостат на нагрів або охолодження
ОписПрограмований терморегулятор призначений для контролю температури в діапазоні від -50 °С до +110..
178.96грн.
Raspberry PI управление servo-мотором при помощи ползунка на экране
Отже ставимо перед собою задачу: керувати серво-мотором від Raspberry PI, використовуючи візуальний ..
Шилд для Arduino Nano и GSM SIM800 с 2реле
Шилд для проектів з використанням плати контролера Arduino Nano та GSM модуля SIM800. Вирішує пробле..
459.84грн.
Регулятор обертів двигуна 30А 6-60В постійного струму з індикатором
Регулятор швидкості обертання двигуна постійного струму. Швидкість задається змінним резистором. ..
333.81грн.
Кінцевик з коліщатком для 3D принтера або CNC ramps 1.4
Кінцевий вимикач для встановлення на 3D-принтер або CNC-верстат системи ramps 1.4В комплекті кабель ..
50.19грн.