Доброго времени, мучаюсь с проблемой. Есть проект, в него надо добавить фичу получения от sim800l ответа с зарядом аккумулятора. В проекте используется библиотека для работы с модулем тыц , методом тыка стало понятно, что до инициализации библиотеки все работает, АТ запрос идет, и приходит ответ, но после Sim800l.begin(); все, МК либо виснет, либо ответ приходит пустой потому что превышено время ожидания… прошу помочь…
вот код который работает
#include <SoftwareSerial.h>
#include <Sim800l.h>
Sim800l Sim800l;
SoftwareSerial SIM800(8, 9); // 8 - RX Arduino (TX SIM800L), 9 - TX Arduino (RX SIM800L)
unsigned long last_time;
String txt;
void setup() {
Serial.begin(9600); // Скорость обмена данными с компьютером
Serial.println("Start!");
SIM800.begin(9600); // Скорость обмена данными с модемом
SIM800.println("AT");
Sim800l.begin(); // << если убрать, работает запрос, но не работает библиотека
Serial.println("OK");
}
void loop() {
Serial.println("test");
if (millis() - last_time > 5000) {
Serial.println("send at");
String command = sendATCommand("AT+CBC", true);
Serial.println(command);
Serial.println("at ok");
txt = txt.substring(txt.indexOf(",") + 1, txt.length());
int bat = txt.toInt();
Serial.print(bat);
Serial.println("%");
last_time = millis();
}
}
String sendATCommand(String cmd, bool waiting) {
String _resp = ""; // Переменная для хранения результата
SIM800.println(cmd); // Отправляем команду модулю
if (waiting) { // Если необходимо дождаться ответа...
_resp = waitResponse(); // ... ждем, когда будет передан ответ
// Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
if (_resp.startsWith(cmd)) { // Убираем из ответа дублирующуюся команду
_resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
}
}
txt = _resp;
return _resp; // Возвращаем результат. Пусто, если проблема
}
String waitResponse() { // Функция ожидания ответа и возврата полученного результата
String _resp = ""; // Переменная для хранения результата
long _timeout = millis() + 10000; // Переменная для отслеживания таймаута (10 секунд)
while (!SIM800.available() && millis() < _timeout) {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
if (SIM800.available()) { // Если есть, что считывать...
_resp = SIM800.readString(); // ... считываем и запоминаем
}
else { // Если пришел таймаут, то...
Serial.println("Timeout..."); // ... оповещаем об этом и...
}
return _resp; // ... возвращаем результат. Пусто, если проблема
}