Всем привет! Имею Arduino и GSM модуль SIM800, давно мучаюсь, никак не могу сделать... Хочу написать скетч с отправкой СМС в которой будет уровень заряда батареи только в процентах. В скетче, в СМС вставляю Код (C++): mySerial.println("AT+CBC"); val = val.substring(val.indexOf(","), val.lastIndexOf(",")) //Нахождение процентов Когда модуль отсылает мне СМС, я получаю: AT+CBC; Когда пробую без СМС, не находит процент, просто пишет пробел Что мне делать? Помогите пожалуйста, буду очень благодарен
Вот код Код (C++): /* arduino SIM800L D2 RING D4 TX D5 RX D6 DTR */ #include <SoftwareSerial.h> #include <OneWire.h> #include <DallasTemperature.h> #include <avr/sleep.h> #include <avr/power.h> OneWire oneWire(7); DallasTemperature ds(&oneWire); SoftwareSerial mySerial(4, 5); // RX, TX int pin = 2; // подключается к ring пину gsm модуля byte PIN_RELAY = 13; int ch = 0; String val = ""; boolean isStringMessage = false; String currStr = ""; // String phone = ""; // String cels = "C"; String Hydronic = "Hydronic: "; void setup() { set_sleep_mode(SLEEP_MODE_STANDBY); //Определяем режим сна pinMode(pin, INPUT); digitalWrite(pin, HIGH); pinMode(6, OUTPUT); // к DTR пину GSM модуля digitalWrite(6, LOW); // пробуждаем GSM модуль ds.begin(); Serial.begin(9600); //подключаем порт компьютера mySerial.begin(9600); //подключаем порт модема (при других скоростях не отвечает) mySerial.println("AT+CLIP=1");//включаем АОН delay(100); mySerial.println("AT+CMGF=1"); //режим кодировки СМС - обычный (для англ.) delay(100); mySerial.println("AT+CSCS=\"GSM\""); //режим кодировки текста delay(100); mySerial.println("AT+CNMI=2,2"); delay(100); mySerial.println("AT+CSCLK=1"); delay(100); pinMode(PIN_RELAY, OUTPUT); digitalWrite(PIN_RELAY, LOW); } void loop() { if (mySerial.available()) { //есть данные от GSM модуля delay(200); //выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана while (mySerial.available()) { //сохраняем входную строку в переменную val ch = mySerial.read(); val += char(ch); delay(10); } if (val.indexOf("RING") > -1) { //если звонок обнаружен Serial.println("RING DETECT"); if (val.indexOf("375375*********") > -1) { //если номер звонящего наш. Укажите свой номер без "+" Serial.println("IT IS ADMIN NUMBER"); delay(100); mySerial.println("ATH0"); //разрываем связь Serial.println("DISCONNECTION"); delay(500); Serial.println("PIN_RELAY: INVERT"); digitalWrite(PIN_RELAY, !digitalRead(PIN_RELAY)); // инвертируем 13 выход delay(2000); val = ""; Serial.println("START SEND SMS"); mySerial.println("AT+CMGS=\"375*********\""); delay(200); if (digitalRead(13) == HIGH || 1) { Serial.println("13: HIGH"); val = "ON"; } if (digitalRead(13) == LOW || 0) { Serial.println("13: LOW"); val = "OFF"; } mySerial.println(Hydronic + val); delay(150); ds.requestTemperatures(); mySerial.print("Temp: "); Serial.print(ds.getTempCByIndex(0)); delay(120); mySerial.print(ds.getTempCByIndex(0)); // отправляем температуру mySerial.println("C"); delay(100); mySerial.println("AT+CBC;"); delay(100); val = val.substring(val.indexOf(","), lastIndexOf(",")); delay(100); mySerial.println(val); delay(100); Serial.println("SMS SEND"); delay(1500); mySerial.print((char)26); delay(1000); val = ""; } } else { Serial.println(val); } } digitalWrite(6, HIGH); // вырубаем GSM модуль EnterSleep(); //Пора спать } void wakeUp() { Serial.println("WakeUp"); //Проснулись detachInterrupt(0); //Отключаем прерывания digitalWrite(6, LOW); // пробуждаем GSM модуль delay(500); } void EnterSleep() { attachInterrupt(0, wakeUp, LOW); //Если на 0-вом прерываниии - ноль, то просыпаемся. delay(100); sleep_enable(); //Разрешаем спящий режим sleep_mode(); //Спим (Прерывания продолжают работать.) Программа останавливается. sleep_disable(); //Запрещаем спящий режим } Выводит смс: Temp: тут температура Hydronic: ON или OFF AT+CBC;
После строки Код (C++): mySerial.println(Hydronic + val); переменная val будет содержать ON или OFF. Откуда возьмется информация о процентах?
Дело в том, что мне пока-что надо чтобы он выводил мне ответ который придёт из CBC, а не AT+CBC;, а затем только проценты
Выше изложенный скетч рабочий, в ответ на звонок выводит смс о статусе реле и температуру с датчика ds18b20, хотелось чтобы в этом же смс приходил ещё и ответ на команду AT+CBC о заряде аккамулятора в %, в ответ на голую команду модуль выдаёт - Пример: AT+CBC; // ввожу я +CBC: 0,95,4134 // выводит модуль OK Первый параметр: // значие параметров 0 – не заряжается 1 – заряжается 2 – зарядка окончена Второй параметр: 1-100 % — уровень заряда батареи Третий параметр: Напряжение питание модуля (VBAT), мВ Помогите пожалуйста