Віримо в перемогу ЗСУ!
Працюємо з 09:00 до 18:00 Пн-Пт

Привіт друзі! 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 Дякуємо за увагу і до нових зустрічей.

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Двигун 12В з редуктором 150RPM двохсторонній

Двигун 12В з редуктором 150RPM двохсторонній

Двигун постійного струму з потужним черв'ячним редуктором для використання в різноманітній робототех..

558.37грн.

Прото модуль для WeMos D1 mini

Прото модуль для WeMos D1 mini

Монтажний шилд під плату контролера WeMos D1 miniВ комплекті традиційно зібрані усілякі гребінк..

36.25грн.

Уроки Arduino типы данных для начинающих

Уроки Arduino типы данных для начинающих

Привет друзья от geekmatic.in.ua! Пора заняться полезным делом и разобрать типы данных, представле..

Уроки Arduino для новачків 1.1.3 Пряме програмування мікроконтролера ICSP

Уроки Arduino для новачків 1.1.3 Пряме програмування мікроконтролера ICSP

На цей раз ми поговоримо про те, як програмувати Arduino, не звичайним способом, не через звичн..

Світлодіод 5мм

Світлодіод 5мм

Світлодіод з діаметром 5мм. LED Максимальний струм 20 мА ..

1.90грн.