#1 2019-05-10 12:55:55

SHA_MAN82
Учасник
Зареєстрований: 2019-05-10
Повідомлень: 2

пропадают данные при отправке смс

Здравствуйте

Прошу подсказки в следующей ситуации. Набросал скетч, котрый по содержимому входящей смс активирует соотв. реле и при этом отвечает смской со статусом реле и дополнительными данными  - температурой, влажностью и напряжением.

Проблема в том, что при различной комбинации команд, ответная смс от ардуино не всегда содержит весь набор данных. На каком-то этапе из строки просто "выпадают" значения. Иногда ответное смс вообще пустое.

Если продолжать слать команды в хаотичной последовательности - в какой-то момент снова появляется полное смс в ответ на ту же команду, на которую отвечало с потерей данных.

В терминале это выглядит так:

ROP  (команда)

AT+CMGS="+380957314297"

> Yes, Capitan!!! Humi: 45.00  Temp:   22.00 Voltage: 0.00  Cool OFF  Vent OFF  Light OFF  (ответ полный, как надо)
>

COOL ON  (команда)

AT+CMGS="+380957314297"

> Yes, Capitan!  Humi: 45.00  Temp: 22.00 Voltage: 0.00  Cool ON  Vent OFF  Light OFF (ответ полный, как надо)
>
COOL OFF (команда)

AT+CMGS="+380957314297"

> (ответ пустой, никаких данных)
>

COOL ON (команда)


AT+CMGS="+380957314297"

> Yes, Capitan!  Humi: 45.00  Temp: 22.00 Voltage: 0.00  Cool ON  Vent OFF  Light OFF (ответ полный, как надо)
>

ROP   (команда)

AT+CMGS="+380957314297"

> Vent OFF  Light OFF (ответ неполный, потеряны данные о температуре, влажности, напряжению, статусе)
>

COOL OFF

AT+CMGS="+380957314297"

>    (пустой ответ вообще)
>
COOL ON

AT+CMGS="+380957314297"

> Yes, Capitan!  Humi: 46.00  Temp: 22.00 Voltage: 0.00  Cool ON  Vent OFF  Light OFF (снова все ок)
>

ROP (запрос данных и статусов)
AT+CMGS="+380957314297"

> Vent OFF  Light OFF (только два значения из всех)
>
VENT OFF

AT+CMGS="+380957314297"

> 45.00     Temp: 22.00
>
LIGHT OFF

AT+CMGS="+380957314297"

> Yes! Capitan!  voltage: 0.00  Cool ON  Vent OFF  Light OFF Humi: 45.00     Temp: 22.00
>

LIGHT ON

AT+CMGS="+380957314297"

>      Temp: 22.00
>

ROP

AT+CMGS="+380957314297"

> Vent OFF  Light ON

Ну и дальше в том же духе.

Это мои первые шаги в освоении, прошу отнестись с пониманием.
Буду очень благодарен за подсказки - что не так? Куда и почему пропадают данные?
Вот сам текст скетча:

void setup()

{

analogReference(INTERNAL); // выбираем внутреннее опорное напряжение 1.1
pinMode(6, OUTPUT);
pinMode(8, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, INPUT); // вход массы
pinMode(4, INPUT); // вход датчика движения
  statusCool = "Cool OFF";
  statusVent = "Vent OFF";
  statusLight = "Light OFF";


Serial.begin(9600);
Serial.println("ROP Progect");

  dht.begin();  // DHT11
  mySerial.begin(9600);                //подключаем порт модема на скорости по умолчанию (можно менять AT-командой)
  mySerial.println("ATI");              //вывести в терминал иноформацию о модеме
  delay(100);
  mySerial.println("AT+CSQ");          //вывести в терминал уровень сигнала (если 99, то связи нет)
  delay(100);
  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 (5000);
}

void sms(String text, String phone){  //процедура отправки СМС
if (Smsoff==false)
{
  Serial.println("SMS send started");
  mySerial.println("AT+CMGS=\"" + phone + "\"");
  delay(500);
  mySerial.print(text);
  delay(500);
  mySerial.print((char)26);
  delay(500);
  Serial.println("SMS send complete");
  delay(2000);
}
}

void loop() {
    float humi = dht.readHumidity();
    float temp = dht.readTemperature();
    int analogValue = analogRead(analogPin); // читаем значение на аналоговом входе 3         
    float volt  = (analogValue * 12.40) / 1023; // пересчет измерения в вольты

if (mySerial.available()) {          //если есть данные от GSM модуля

    delay(400);                        //выждем, чтобы строка успела попасть в порт целиком раньше чем будет считана
    while (mySerial.available()) {      //сохраняем входную строку в переменную val
    ch = mySerial.read();
    val += char(ch);
    delay(10);
    }

    Serial.println(val);                    // дублируем сообщение в терминал

     
     
      if (val.indexOf("SMS OFF") > -1) {      // если обнаружено кодовое слово SMS OFF 
          smsoffStr = "Yes, Capitan! SMS OFF";
          Serial.println("sms disabled");      // сообщаем об этом в терминал
          sms(smsoffStr, MASTER);            // отвечаем смской смс отключены
          Smsoff = true;                    // отключаем смс
        }
//else
   
        if (val.indexOf("ROP") > -1) {      // если обнаружено кодовое слово ROP
        ropStr = "Yes, Capitan!!! Humi: "+ String (humi)+"  "  +  "Temp: "+"  " +String (temp)+ " "+ "Voltage: " +String (volt)+"  "+String (statusCool)+"  "+String (statusVent)+"  " +String (statusLight); // ответ на запрос смс РОП
        Smsoff = false;
        Serial.println("ROP request");      // сообщаем об этом в терминал
        sms(ropStr, MASTER);            // отвечаем смской температура, влажность, напряжение, статусы
          }
//else
     if (val.indexOf("COOL ON") > -1) {      // если обнаружено кодовое слово Cool On
              statusCool = "Cool ON"; 
              coolStr = "Yes, Capitan!  Humi: "+ String (humi)+"  "  +  "Temp: "+String (temp)+" "+  "Voltage: "+ String (volt)+"  "+String (statusCool)+"  "+String (statusVent)+"  " +String (statusLight);
              Serial.println("Cool ON");      // сообщаем об этом в терминал
              sms(coolStr, MASTER);            // отвечаем смской
              digitalWrite(LED12Pin, HIGH); //включаем 12 пин плюс
                                      }

//else
        if (val.indexOf("COOL OFF") > -1) {      // если обнаружено кодовое слово Cool off
               statusCool = "Cool OFF" ;
               cooloffStr = "Yes, Capitan!  Humi: "+ String (humi)+"  "  +  "Temp: "+String (temp)+" "+  "Voltage: "+ String (volt)+"  "+String (statusCool)+"  "+String (statusVent)+"  " +String (statusLight);
               Serial.println("COOL OFF");      // сообщаем об этом в терминал (если нужно)
               sms(cooloffStr, MASTER);            // отвечаем смской
               digitalWrite(LED12Pin, LOW);
                                          }

//else
     if (val.indexOf("VENT ON") > -1) {      // если обнаружено кодовое слово Vent On
              statusVent = "Vent ON" ;     
              ventStr = String (statusCool)+"  "+String (statusVent)+"  " +String (statusLight)+"  " + "Humi: "+ String (humi)+"    "  +  "Temp: "+String (temp)+"  "+  "Voltage: " +String (volt);
              Serial.println("VENT ON");      // сообщаем об этом в терминал
              sms(ventStr, MASTER);            // отвечаем смской
              digitalWrite(LED11Pin, HIGH); //включаем 11 пин плюс
                                       }

// else
        if (val.indexOf("VENT OFF") > -1) {      // если обнаружено кодовое слово vent off
               statusVent = "Vent OFF" ; 
               ventoffStr = "VENT OFF Voltage: " +String (volt)+"  "+String (statusCool)+"  "+String (statusVent)+"  " +String (statusLight)+" Humi: "+ String (humi)+"     "  +  "Temp: "+String (temp);
               Serial.println("Vent OFF");      // сообщаем об этом в терминал
               sms(ventoffStr, MASTER);            // отвечаем смской
               digitalWrite(LED11Pin, LOW);
                                          }
   
//else
     if (val.indexOf("LIGHT ON") > -1) {      // если обнаружено кодовое слово Light On
              statusLight = "Light ON" ;
              lightStr = "Yes! Capitan!  voltage: " +String (volt)+"  "+String (statusCool)+"  "+String (statusVent)+"  " +String (statusLight)+" " +"Humi: "+ String (humi)+"     "  +  "Temp: "+String (temp);
              Serial.println("Light ON");      // сообщаем об этом в терминал
              sms(lightStr, MASTER);            // отвечаем смской
              digitalWrite(LED10Pin, HIGH);
                                       }
   
//else
        if (val.indexOf("LIGHT OFF") > -1) {      // если обнаружено кодовое слово light off
               statusLight = "Light OFF";
               lightoffStr = "Yes! Capitan!  voltage: " +String (volt)+"  "+String (statusCool)+"  "+String (statusVent)+"  " +String (statusLight)+" " +"Humi: "+ String (humi)+"     "  +  "Temp: "+String (temp);
               Serial.println("Light OFF");      // сообщаем об этом в терминал
               sms(lightoffStr, MASTER);            // отвечаем смской
               digitalWrite(LED10Pin, LOW);
                                           }

     
       val = "";
     
}


               

}


Всем спасибо!!!

Неактивний

#2 2019-05-11 13:39:21

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: пропадают данные при отправке смс

И чо ж тебе, родной, неясно на .ru объяснили? Удаляй нахер все свои объявления бесчисленные объявления стрингов из глобального уровня, а объявляй каждую локально по месту использования и будет тебе много счастья !

Неактивний

#3 2019-05-11 16:51:16

SHA_MAN82
Учасник
Зареєстрований: 2019-05-10
Повідомлень: 2

Re: пропадают данные при отправке смс

Благодарю. Буду пробовать.
Для меня, как новичка, такие вещи совсем не очевидные. Учусь, разбираюсь.
Спасибо всем неравнодушным

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму