Не вставляется баланс в смс от m590

alexbel620017
Offline
Зарегистрирован: 26.03.2017

Ребята, подскажите пожалуйста - gsm модуль m590, запрашиваю баланс, выделяю в сообщении цифры, перевожу из кода символов в сами символы - Serial.print выводит их в монитор нормально, а в ответном смс при вставке ничего нет. Что не так делаю, или преобразовать надо по другому как-то?

привожу только часть кода

 if (Serial2.available()) {
          char bl = ' ';
          String valbl = "";
          while (Serial2.available())
          {
            bl = Serial2.read();
            //Serial.println(bl);
            valbl += char(bl); //собираем принятые символы в строку
            delay(5);
          }
          Serial.println(valbl);
          if (valbl.indexOf("+CUSD") > -1) {
            Serial.println("est otvet");
            char result1 = valbl.charAt(37);
            char result2 = valbl.charAt(38);
            char result3 = valbl.charAt(39);
            char result4 = valbl.charAt(40);
            char result5 = valbl.charAt(41);
            char result6 = valbl.charAt(42);
            String ss1 = String(result1);
            String ss2 = String(result2);
            String ss3 = String(result3);
            String ss4 = String(result4);
            String ss5 = String(result5);
            String ss6 = String(result6);
            Serial.print(ss1);
            Serial.print(ss2);
            Serial.print(ss3);
            Serial.print(ss4);
            Serial.print(ss5);
            Serial.println(ss6);
          }
        }
        s1 = String(tu);                    // строковая переменная с уличной температурой
        s2 = String(hu);                    // строковая переменная с уличной влажностью
        s3 = String(p);                     // строковая переменная с давлением
        s4 = String(td);                    // строковая переменная с температурой в доме
        s5 = String(tg);                    // строковая переменная с температурой в гараже
        s6 = String(tk);                    // строковая переменная с температурой в котельной
        s7 = String(tkont);                 // строковая переменная с температурой контура
        s8 = String(tb);                    // строковая переменная с температурой бойлера
        s9 = String(ttp);                   // строковая переменная с температурой ТП
        s10 = String(trad);                 // строковая переменная с температурой радиаторов
        s11 = String (ss2);                 // строковая переменная с балансом
        sms(String("Balans: " + ss2 + "rub." + '\n'
                   + "Temp. ulica: " + s1 + '\n'
                   + "Vlagn. ulica: " + s2 + '\n'
                   + "Davlenie: " + s3 + '\n'
                   + "Temp. dom: " + s4 + '\n'
                   + "Temp. garag: " + s5 + '\n'
                   + "Temp. kotelnay: " + s6 + '\n'
                   + "Temp. kontur: " + s7 + '\n'
                   + "Temp. boyler: " + s8 + '\n'
                   + "Temp. tp: " + s9 + '\n'
                   + "Temp. rad.: " + s10 + '\n'
                  ), String("+79122234744")); // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
        delay(500);

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alexbel620017 пишет:

Что не так делаю

Много чего. Для начала, Вы не так вставляете код. Он у Вас без начала и без конца, поэтому что-то о нём говорить можно только потерев хрустальный шар.

Так вот шар мне подсказывает, что где-то Вы ше у Вас уже была описана переменная ss2. Затме Вы её описали в строке 21 - т.е. Вы завели новую переменную с тем же именем. После этого, Вы используете ss2 в строке 44, полагая, что в ней силит значение, полуенное в строке 21. Таки нет!  ss2 в строке 21 и ss2 в строке 44 - это разные переменные, не имеющие друг к другу никакого отношения. См. концепцию экранирования переменных вот здесь.

Возможно, поможет, если Вы удалите слово String в строке 21.

Но, повторяю, всё это из шара, поскольку код у Вас секретный и Вы его показывать не хотите.

alexbel620017
Offline
Зарегистрирован: 26.03.2017

Спасибо большое, Евгений, ваша подсказка помогла. Прочитал ваш материал - тоже много чего уяснил для себя нового (не давно для себя открыл Ардуино и на С++ ранее никогда не приходилось писать). Полный код не стал помещать первый раз поскольку он не маленький, но сейчас выложу весь. Это рабочий код. Прошу не пинать за нерациональность. Железо - китайская Мега, TFT 3.2, GY-GPS6MU2(для синхронизации часов), BMP280, DS3231, DHT22, NEOWAY-m590 и DS18B20. Следующий шаг это прикрутить nrf24 для сбора данных с трёх других ардуин.

Спасибо! 

#include <Time.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
#include <TinyGPS.h>
#include <OneWire.h>
#include <stDHT.h>
#include <UTFT.h>
#include <iarduino_Pressure_BMP.h>

DHT sens(DHT22);

iarduino_Pressure_BMP sensor;   // активация датчика давления

extern uint8_t BigFont[];       // шрифты
extern uint8_t DGR24[];
extern uint8_t DGR56[];

OneWire sensDs1(11);  // 18B20 подключен к выводу 11
OneWire sensDs2(12);  //                          12
OneWire sensDs3(13);  //                          13
byte bufData1[9];     // буфер данных 18B20
byte bufData2[9];
byte bufData3[9];
byte addr1[8];        // массив адреса 18B20
byte addr2[8];
byte addr3[8];

UTFT myGLCD(TFT32MEGA, 38, 39, 40, 41);    // задаем тип дисплея

TinyGPS gps;
void getgps(TinyGPS &gps);
bool newdata = false;

int h, m, s;
unsigned long sinhr;             // переменная в мс задающ. период синхронизации
unsigned long start;             // переменная в мс задающ. цикл считывания данных gps
int tpred;                       // предудщая температура для правильной индикации
int tu;                          // температура на улице
int hu;                          // влажность на улице
int p;                           // давление
int td;                          // температура в доме
int tg;                          // температура в гараже
int tk;                          // температура в котельной
int tkont = 83;                  // температура контура
int tb = 65;                     // температура в бойлере
int ttp = 31;                    // температура входа ТП
int trad = 56;                   // температура входа РАД
int bal;                         // баланс
int bal1;

String(s1), (s2), (s3), (s4), (s5), (s6), (s7), (s8), (s9), (s10), (ss1), (ss2), (ss3), (ss4), (ss5), (ss6); // строковые переменные для sms

void setup()
{
  Serial1.begin(9600);
  Serial2.begin(9600);
  Serial.begin(9600);
  myGLCD.InitLCD();                        // инициируем дисплей
  sensor.begin();                          // инициируем BMP280
  myGLCD.clrScr();                         // очистка дисплея
  sensDs1.search(addr1);        // поиск и запись адреса 1 датчика 18B20
  sensDs2.search(addr2);        //                       2 датчика 18B20
  sensDs3.search(addr3);        //                       3 датчика 18B20
  setSyncProvider(RTC.get);     // библиотечная команда извлечения данных из модуля часов
  sinhr = millis();
  pinMode(3, INPUT);                      // пин для датчика света
  delay(200);
  Serial2.println("AT+CLIP=1");        // включить АОН
  delay(200);
  Serial2.println("AT+CMGF=1");        // текстовый формат SMS
  delay(200);
  Serial2.println("AT+CSCS=\"GSM\"");  // кодировка текста - GSM
  delay(200);
}
void loop()
{
  myGLCD.setColor(VGA_AQUA);             // Рисование полосы на дисплее и надписей
  myGLCD.drawLine(300, 10, 300, 310);
  myGLCD.setColor(VGA_WHITE);
  myGLCD.setFont(BigFont);                //    BigFont
  myGLCD.print("Davlenie:", 325, 160);
  myGLCD.print("mm.r.st.", 340, 220);
  myGLCD.print("Vlagnosty:", 315, 255);
  myGLCD.print("Temperatura:", 50, 50);
  myGLCD.print("Teplonosit.", 45, 210);
  myGLCD.print("Bojler", 45, 235);
  myGLCD.print("Podaha TP", 45, 260);
  myGLCD.print("Podaha Rad.", 45, 285);

  myGLCD.printNumI(tkont, 235, 210);          // темп. теплоноситель
  myGLCD.printNumI(tb, 235, 235);             // температура бойлера
  myGLCD.printNumI(ttp, 235, 260);            // температура ТП
  myGLCD.printNumI(trad, 235, 285);           // температура Рад

  myGLCD.setFont(DGR24);                      //    24 шрифт
  myGLCD.print("Ulica", 330, 15);
  myGLCD.print("Dom", 10, 80);
  myGLCD.print("Garag", 10, 120);
  myGLCD.print("Koteljnay", 10, 160);

  // ---------------------------- чтение, формирование и печать давления ----------------------

  sensor.read(1);
  p = sensor.pressure;
  if ((sensor.pressure - p) > 0.5) {
    p = p + 1;
  }
  myGLCD.printNumI(p, 360, 185);                // печать давления

  // ----------------------- Темп. и влажность на улице -------------------

  tu = sens.readTemperature(2);             // температура улица
  hu = sens.readHumidity(2);                // влажность улица
  delay(2000);
  myGLCD.setFont(DGR56);
  myGLCD.setColor(VGA_WHITE);

  // Очистка места при переходе с 3 на 2 знакоместа и с 2 на 1
  if ((tpred == -1 && tu == 0) || (tpred == 10 && tu == 9) || (tpred == -10 && tu == -9)) {
    myGLCD.print("===", 305, 50);
  }
  tpred = tu;                                   // запись температуры для сравнения в следующем цикле
  if (tu >= 0) {                                // положительная температура
    if (tu < 10) {
      myGLCD.printNumI(tu, 361, 50);
    }
    else {
      myGLCD.printNumI(tu, 333, 50);
    }
  }
  else {                                        // отрицательная температура
    tu = abs(tu);                               // выделение модуля температуры
    if (tu < 10) {                              // отрицательная 1 знак
      myGLCD.printNumI(tu, 389, 50);            // рисуем цифру
      myGLCD.print(":", 333, 50);               // рисуем минус
    }
    else {                                      // отрицательная 2 знака
      myGLCD.printNumI(tu, 361, 50);
      myGLCD.print(":", 305, 50);
    }
  }
  myGLCD.setFont(DGR24);
  myGLCD.printNumI(hu, 360, 280);               // улица влажность
  myGLCD.print("%", 408, 280);

  //----------------------------- Работа с датчиками температуры -------------------
  sensDs1.reset();
  sensDs1.select(addr1);
  sensDs1.write(0x44, 0);               // инициализация измерения с первого датчика
  sensDs2.reset();
  sensDs2.select(addr2);
  sensDs2.write(0x44, 0);
  sensDs3.reset();
  sensDs3.select(addr3);
  sensDs3.write(0x44, 0);
  delay(400);
  sensDs1.reset();
  sensDs1.select(addr1);
  sensDs1.write(0xBE);                  // команда чтения памяти датчика
  sensDs1.read_bytes(bufData1, 9);      // чтение памяти датчика, 9 байтов
  sensDs2.reset();
  sensDs2.select(addr2);
  sensDs2.write(0xBE);
  sensDs2.read_bytes(bufData2, 9);
  sensDs3.reset();
  sensDs3.select(addr3);
  sensDs3.write(0xBE);
  sensDs3.read_bytes(bufData3, 9);
  // ------------------------- Обработка данных датчиков ----------------------------

  td =  (float)((int)bufData1[0] | (((int)bufData1[1]) << 8)) * 0.0625;
  tg =  (float)((int)bufData2[0] | (((int)bufData2[1]) << 8)) * 0.0625;
  tk =  (float)((int)bufData3[0] | (((int)bufData3[1]) << 8)) * 0.0625;

  // ----------------- Вывод на печать трёх температур с датчиков --------------
  myGLCD.printNumI(td, 235, 75);
  myGLCD.printNumI(tg, 235, 115);
  myGLCD.printNumI(tk, 235, 155);

  // ----------------------- Часы ------------------------------------------
  if (millis() - sinhr < 40000) {     // счетчик на 11 часов для синхронизации (40 млн.)
    goto P1;
  }
  newdata = false;
  start = millis();
  while (millis() - start < 2000)
  {
    if (Serial1.available())
    {
      char c = Serial1.read();    // чтение массива, переданного NEO-6M
      //Serial.print(c);          // вывести на печать массив из NEO-6M
      if (gps.encode(c))          // проверка данных на правильность
      {
        newdata = true;
        break;                    // остановить цикл при нормальной декодировке
      }
    }
  }
  if (newdata)
  {
    getgps(gps);                  // при нормальной декодеровке уходим на выполнение getgps(TinyGPS &gps)
  }

P1:

  // ================================ Вывод часов на дисплей ============================
  myGLCD.setFont(DGR24);                   // задаём шрифт цифр
  myGLCD.setColor(VGA_LIME);
  if (hour() < 10) {                       // вывод часов
    myGLCD.printNumI(0, 170, 10);
    myGLCD.printNumI(hour(), 194, 10);
  }
  else {
    myGLCD.printNumI(hour(), 170, 10);
  }
  delay(5);
  if (minute() < 10) {                     // вывод минут
    myGLCD.printNumI(0, 242, 10);
    myGLCD.printNumI(minute(), 266, 10);
  }
  else {
    myGLCD.printNumI(minute(), 242, 10);
  }
  myGLCD.print(":", 218, 10);


  // ======================== Работа GSM ===============================================

  if (Serial2.available()) //если модуль что-то послал
  {
    delay(500);
    char ch = ' ';
    String val = "";
    Serial.print(val);
    while (Serial2.available())
    {
      ch = Serial2.read();
      val += char(ch); //собираем принятые символы в строку
    }
    Serial.println(val);

    if (val.indexOf("RING") > -1) //если есть входящий вызов, то проверяем номер
    {
      if (val.indexOf("791222ХХХХХ") > -1) // ВПИШИТЕ НОМЕР, с которого Вы будете звонить на модуль
      {
        Serial2.println("ATH");  //разрываем связь
        delay(5000);
        Serial2.println("ATD*100#");  //запрос баланса
        delay(10000);
        if (Serial2.available()) {
          char bl = ' ';
          String valbl = "";
          while (Serial2.available())
          {
            bl = Serial2.read();
            valbl += char(bl); //собираем принятые символы в строку
          }
          Serial.println(valbl);
          if (valbl.indexOf("+CUSD") > -1) {
            char result1 = valbl.charAt(38);
            char result2 = valbl.charAt(39);
            char result3 = valbl.charAt(40);
            char result4 = valbl.charAt(41);
            char result5 = valbl.charAt(42);
            char result6 = valbl.charAt(43);
            ss1 = String(result1);
            ss2 = String(result2);
            ss3 = String(result3);
            ss4 = String(result4);
            ss5 = String(result5);
            ss6 = String(result6);
          }
        }
        s1 = String(tu);                    // строковая переменная с уличной температурой
        s2 = String(hu);                    // строковая переменная с уличной влажностью
        s3 = String(p);                     // строковая переменная с давлением
        s4 = String(td);                    // строковая переменная с температурой в доме
        s5 = String(tg);                    // строковая переменная с температурой в гараже
        s6 = String(tk);                    // строковая переменная с температурой в котельной
        s7 = String(tkont);                 // строковая переменная с температурой контура
        s8 = String(tb);                    // строковая переменная с температурой бойлера
        s9 = String(ttp);                   // строковая переменная с температурой ТП
        s10 = String(trad);                 // строковая переменная с температурой радиаторов
        sms(String("Balans: " + ss1 + ss2 + ss3 + ss4 + ss5 + ss6 + "rub." + '\n'
                   + "Davlenie: " + s3 + "mm" + '\n'
                   + "Vlagn. ulica: " + s2 + "%" + '\n'
                   + "Temperatura:" + '\n'
                   + "ulica: " + s1 + '\n'
                   + "dom: " + s4 + '\n'
                   + "garag: " + s5 + '\n'
                   + "kotelnay: " + s6 + '\n'
                   + "kontur: " + s7 + '\n'
                   + "boyler: " + s8 + '\n'
                   + "tp: " + s9 + '\n'
                   + "rad: " + s10 + '\n'), String("+791222ХХХХХ")); // номер на кот пойдет смс
        delay(500);
      }
    }
  }
}

//=================  подпрограмма вывода данных из gps и синхронизации модуля часов (раз в 11 часов) =============

void getgps(TinyGPS &gps)
{
  int year;
  byte month, day, hour, minute, second, hundredths;
  // вынимание данных из массива, полученного из модуля gps
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);
  m = minute;
  h = hour + 3;                   // переделка час. пояса
  s = second;
  if (h > 23)                     // избежание 25, 26 часов на дисплее
  {
    h = h - 24;
  }
  // ------------------ непосредственно синхронизация -----------
  setTime(h, m, s, 01, 4, 2016);     // устанавливаем: часы, минуты, секунды (и день, месяц, год)
  RTC.set(now());                    // применяем значение
  sinhr = millis();
}

//===================== Подпрограмма посылки SMS ========================================================

void sms(String text, String phone)  // отправка СМС
{
  Serial.println("Start SMS send");
  Serial2.println("AT + CMGS = \"" + phone + "\"");
  delay(500);
  Serial2.print(text);
  //Serial.print(text);
  delay(500);
  Serial2.print((char)26);
  delay(500);
  Serial2.print("AT+CMGD=1,4\r");
}