Arduino + SIM800 заряд батареи

Тема в разделе "Arduino & Shields", создана пользователем eltax21, 8 янв 2019.

  1. eltax21

    eltax21 Нуб

    Всем привет! Имею Arduino и GSM модуль SIM800, давно мучаюсь, никак не могу сделать... Хочу написать скетч с отправкой СМС в которой будет уровень заряда батареи только в процентах. В скетче, в СМС вставляю
    Код (C++):
    mySerial.println("AT+CBC");
    val = val.substring(val.indexOf(","), val.lastIndexOf(",")) //Нахождение процентов
    Когда модуль отсылает мне СМС, я получаю: AT+CBC;
    Когда пробую без СМС, не находит процент, просто пишет пробел
    Что мне делать?
    Помогите пожалуйста, буду очень благодарен
     
  2. fogary

    fogary Гик

    Гм, а процент при этом находит?
     
  3. b707

    b707 Гуру

    вы бы код целиком выложили или хотя бы код нахождения процента и отправки СМС
     
  4. eltax21

    eltax21 Нуб

    Вот код
    Код (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;
     
  5. fogary

    fogary Гик

    После строки
    Код (C++):
    mySerial.println(Hydronic + val);
    переменная val будет содержать ON или OFF. Откуда возьмется информация о процентах?
     
  6. eltax21

    eltax21 Нуб

    Дело в том, что мне пока-что надо чтобы он выводил мне ответ который придёт из CBC, а не AT+CBC;, а затем только проценты
     
  7. eltax21

    eltax21 Нуб

    Выше изложенный скетч рабочий, в ответ на звонок выводит смс о статусе реле и температуру с датчика ds18b20, хотелось чтобы в этом же смс приходил ещё и ответ на команду AT+CBC о заряде аккамулятора в %, в ответ на голую команду модуль выдаёт -
    Пример:
    AT+CBC; // ввожу я

    +CBC: 0,95,4134 // выводит модуль
    OK
    Первый параметр: // значие параметров
    0 – не заряжается
    1 – заряжается
    2 – зарядка окончена
    Второй параметр:
    1-100 % — уровень заряда батареи
    Третий параметр:
    Напряжение питание модуля (VBAT), мВ

    Помогите пожалуйста
     
  8. fogary

    fogary Гик

    Пологаю, ответ на команду AT+CBC нужно получить до начала составления СМС, а не в процессе.