SIM 900 и лишнее в отправленных смс

Serzh251
Offline
Зарегистрирован: 15.11.2017

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

1. при запросе параметров через смс в ответ прилетает смс с параметрами, все хорошо, как и должно быть, но первые две строки в смс это АТ команда модулю SIM 900 "AT + CMGS = \"+79ххххххххх\"

2. при запросе баланса прилетает в ответ смс где только АТ команда "ATD*102#"

ранее при тестировании SIM900 на отправку смс наблюдалась такая картина:

сначала вообще смс не отправлялись, увеличил задерки между посылками АТ команд до 300мс при настройке модуля и до 200мс при командах отправки. смс стали приходить. но так же прилетали АТ команды в смс

увеличил задержки до 500 мс и 300 мс соотв. смс стали приходить как надо

одна мысль- в сериал порту остается команда в буфере, и потом считывается при отправке смс..

модуль Sim 900 и ардуино мега 2650 артемовские

Serzh251
Offline
Зарегистрирован: 15.11.2017

///////////////////////Программа "умного дома" на основе MEGA2650////////////////////////

//Дисплей
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей

//датчики температуры
#include <OneWire.h>// библиотека для DS18B20
#include <DallasTemperature.h>// библиотека для DS18B20
#define ONE_WIRE_BUS 7  // датчики DS18B20 на 7 пин
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);  // Везде где встречается ds - это работа с датчиками Dallas DS18B20
DeviceAddress ZalC =    { 0x10, 0xC2, 0x8C, 0x30, 0x03, 0x08, 0x00, 0x3A }; // Сетевой адрес датчика DS18B20 в доме
DeviceAddress UlicaC =  { 0x28, 0xFF, 0x35, 0x2C, 0xA0, 0x16, 0x05, 0xF3 }; // Сетевой адрес датчика DS18B20 на улице
DeviceAddress podacha = { 0x10, 0xA9, 0x10, 0x31, 0x03, 0x08, 0x00, 0x18 }; // Сетевой адрес датчика DS18B20 температура тосола в подаче
DeviceAddress obratka = { 0x10, 0x81, 0x8A, 0x30, 0x03, 0x08, 0x00, 0x8A }; // Сетевой адрес датчика DS18B20 температура тосола в обратке
float tempC; // для работы с DS18B20
float  TempZalC    = 15;  // Переменная. Измеренная температура в зале    (По умолчанию 15гр.С)
float  TempUlicaC  = 15;  // Переменная. Измеренная температура на улице  (По умолчанию 15гр.С)
float  Temppodacha = 15;  // Переменная. Измеренная температура на кухне  (По умолчанию 15гр.С)
float  Tempobratka  = 15;  // Переменная. Измеренная температура в подполе (По умолчанию 15гр.С)

//датчик атмосферного давления
#include <iarduino_Pressure_BMP.h>
iarduino_Pressure_BMP sensor;
float  AD=0;

//датчик уровня воды
int VodaPin = A0;
int VodaValue = 0; //промежуточная переменная
int Voda = 0; //переменная в литрах

//датчики удара
boolean ydarsperedi=false;
boolean ydarszadi=false;
//_______Все для цикла void otoplenie()______________________________________________________
int tempDust = 24;     // Уставка желаемой температуры в доме (По умолчанию 23гр.С)
int tempDECOust = 12;  // Уставка температуры в доме в режиме "Экономия"(По умолчанию 13гр.С)
boolean SMSVoltOFF=false;    // Флаг "Отправлена СМС об отключении питания 220в"
boolean SMSVoltON=false;     // Флаг "Отправлена СМС о восстановлении питания 220в"
boolean SMSDelete=false;     // Флаг "Удалены все СМС на SIM900"
boolean TimeSMSzapros=false; // Флаг "Отправлена СМС о состоянии дома по таймеру"
boolean SMSVoltIBP=false;    // Флаг "Отправлена СМС о низком заряде аккумулятора"
boolean EcoTempDust=false;   // Флаг "Экономия отопления"
boolean SMSAlarmTemp=false;  // Флаг "Отправлена СМС о критической температуре"

#include <DHT.h>
#define DHTPIN 6     //Датчик DTH11 на pin6
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
float   Vlaga=0;         // Значение влажности в цикле ventilyaciya()

//_______Все для цикла void voltmetr()
float vout = 0.0;      // Напряжение на входе аналового входа
float Vpit = 0.0;      // Измеряемое напряжение на выходе ИБП
int volt = 0;          // Напряжение на входе АЦП

int statushome=0;      // переменная статуса включения умного дома 1 - включен, 0 -выключен
int statusotp=0;       // статус отопления дома                0 - откл , 1- вкл , 2- экономия
int statusAlarm=0;     // Переменная "Наличие тревоги"
int signaliz=0;        // Переменная "Режим работы охр.сигнализации" - 0 - откл , 1- вкл , 2- постановка на охрану, 3-в тревоге
int AlarmTemp=0;       // Переменная "Наличие тревоги по критической температуре"

long previousMillis = 0;    // храним время последнего замера влажности для цикла izmereniya()
long interval = 120000;     // интервал между замерами параметров для цикла  izmereniya() 2 минуты

//_______Для работы терминала по  Sim900______________________________
#include <GPRS_Shield_Arduino.h>// библиотека для работы с GPRS устройством
GPRS gprs(Serial1);// создаём объект класса GPRS и передаём в него объект Serial1 




void setup() {
  pinMode(53, OUTPUT);     // Управление отоплением
  digitalWrite(53,HIGH);
  pinMode(13, OUTPUT);     // Лампа УД включен
  digitalWrite(13,LOW);
  pinMode(52, INPUT);// датчик удара сзади
  pinMode(50, INPUT);//датчик удара спереди
  digitalWrite(52,LOW);
  digitalWrite(50,LOW);
  Serial.begin(9600);// открываем последовательный порт для мониторинга действий в программе
  Serial1.begin(9600);// открываем Serial-соединение с GPRS Shield
  gprs.powerOn();// включаем GPRS шилд
    while (!gprs.init()) // проверяем есть ли связь с GPRS устройством
  {
    // если связи нет, ждём 1 секунду и выводим сообщение об ошибке
    // процесс повторяется в цикле пока не появится ответ от GPRS устройства
    delay(3000);
    Serial.print("GPRS Init error\r\n");
  }
  Serial.println("GPRS init success"); // вывод об удачной инициализации GPRS Shield
  NastroykaGSM();
  dht.begin();                 // Замер влажности с DHT11
  sensors.begin();             // Замер температуры с DS18B20
  sensors.setResolution(ZalC, 10);   
  sensors.setResolution(UlicaC, 10); 
  sensors.setResolution(podacha, 10); 
  sensors.setResolution(obratka, 10);
  sensor.begin();              // Замер атмосферного давления с ВМР 280
  delay(2000);
  lcd.init();                     
  lcd.backlight();// Включаем подсветку дисплея
  lcd.print("YD");
  lcd.setCursor(0, 1);
  lcd.print("Privetstvyet");
}

void loop() {
  readsms();
  izmereniya();
  zapros();
 // alarms();
  if (statushome==1){digitalWrite(13,HIGH);}   else {digitalWrite(13, LOW);} // Лампа "Умный дом включен"
  if (statusotp==1) {otoplenie();} else {digitalWrite(53, HIGH);}             // Управление работой газового котла 1 - вкл., 0 - откл.
//   if (!signaliz==0){signalizSMS();}                                          // Работа сигнализации сигнализации при режимах 1,2,3
}

void readsms()
{
if(Serial1.available()) //если модуль что-то послал
  { 
    char ch = ' ';
    String val = "";
    while(Serial1.available())
     { 
      ch = Serial1.read();
      val += char(ch); //собираем принятые символы в строку
      delay(3);
     }
    Serial.print("Sim send> ");
    Serial.println(val);
    if(val.indexOf("+CMT") > -1) //если есть входящее sms
     {
      if(val.indexOf("On") > -1) { startOneSMS(); Serial1.println("SISTEMA UMNIY DOM-ON"); EndSMS(); homeON(); Serial.println("SISTEMA UMNIY DOM-ON");} //включение УД

      if(val.indexOf("Off") > -1){ startOneSMS(); Serial1.println("SISTEMA UMNIY DOM-OFF"); EndSMS(); homeOFF(); Serial.println("SISTEMA UMNIY DOM-OFF");} //выключение УД
       
      if(val.indexOf("OTOPLENIE-ON") > -1) { startOneSMS(); Serial1.println("OTOPLENIE-ON"); Serial1.print(TempZalC); EndSMS(); statusotp=1; Serial.println("OTOPLENIE-ON");} //включение отопления
  
      if(val.indexOf("OTOPLENIE-OFF") > -1) { startOneSMS(); Serial1.println("OTOPLENIE-OFF"); EndSMS(); statusotp=0; Serial.println("OTOPLENIE-OFF");} //включение отопления

      if(val.indexOf("OTOPLENIE-ECO") > -1) { startOneSMS(); Serial1.println("OTOPLENIE-ECO"); EndSMS(); statusotp=2; Serial.println("OTOPLENIE-ECO");} //включение отопления

      if(val.indexOf("Zapros") > -1) { startOneSMS(); SMSzapros(); EndSMS();} //запрос параметров

      if(val.indexOf("Balans") > -1) { startOneSMS(); SMSbalance(); EndSMS();} //запрос баланса
       
     }
  }
}
void izmereniya()   //  Замер температур с датчиков DS18B20 и влажности с датчика DHT11 
{
   unsigned long currentMillis = millis();
     
     delay(100);                          // Необязательная задержка
     Vlaga = dht.readHumidity();                // Уровень влажности % с DHT11
     
     sensors.requestTemperatures();            // Замеры температур с DS18B20
     delay(750);                          // Необязательная задержка
     TempZalC    = sensors.getTempC(ZalC);     // Считываем температуру в зале
     delay(100);
     TempUlicaC  = sensors.getTempC(UlicaC);   // Считываем температуру на улице
     delay(100);
     Temppodacha = sensors.getTempC(podacha);  // Считываем температуру в подаче
     delay(100);
     Tempobratka = sensors.getTempC(obratka);  // Считываем температуру в обратке
     delay(100);
     VodaValue = analogRead(VodaPin);//считываем показания с пина датчика уровня воды
     if (VodaValue<=12){Voda=10;}
     if (VodaValue>12&&VodaValue<=20){Voda=15;}
     if (VodaValue>20&&VodaValue<=32){Voda=20;}
     if (VodaValue>32&&VodaValue<=40){Voda=25;}
     if (VodaValue>40&&VodaValue<=47){Voda=35;}
     if (VodaValue>47&&VodaValue<=53){Voda=43;}
     if (VodaValue>53&&VodaValue<=60){Voda=50;}
     if (VodaValue>60&&VodaValue<=67){Voda=58;}
     if (VodaValue>67&&VodaValue<=76){Voda=68;}
     if (VodaValue>76&&VodaValue<=85){Voda=75;}
     if (VodaValue>85&&VodaValue<100){Voda=85;}
     if(TempZalC== -127 || TempUlicaC== -127 || Temppodacha== -127 || Tempobratka== -127) // Перезапрос при ошибке датчика
     {
     sensors.requestTemperatures(); delay(750); // 
     TempZalC    = sensors.getTempC(ZalC);     // Считываем температуру в зале
     delay(100);
     TempUlicaC  = sensors.getTempC(UlicaC);   // Считываем температуру на улице
     delay(100);
     Temppodacha = sensors.getTempC(podacha);  // Считываем температуру в подаче
     delay(100);
     Tempobratka = sensors.getTempC(obratka);  // Считываем температуру в обратке
     delay(100);
     if(sensor.read(1)){AD=sensor.pressure;}// считываем показатель атмосферного давления
  else                     {Serial.println("нет ответа от сенсора давления");}
  delay(3000);
     
     lcd.clear(); 
                          lcd.print("Vlaga:"); lcd.setCursor(6, 0); lcd.print(Vlaga);   lcd.print("%");//вывод уровня влажности на дисплей
     lcd.setCursor(0, 1); lcd.print("Zal:");   lcd.setCursor(6, 1); lcd.print(TempZalC) ;lcd.print("*C");//вывод температуры спереди на дисплей
     delay(3000);
     lcd.clear();
                          lcd.print("Podacha:");   lcd.setCursor(8, 0); lcd.print(Temppodacha) ;lcd.print("*C");//вывод температуры подачи антифриза на дисплей
     lcd.setCursor(0, 1); lcd.print("Obratka:");   lcd.setCursor(8, 1); lcd.print(Tempobratka) ;lcd.print("*C");//вывод температуры обратки антифриза на дисплей

     delay(3000);
     lcd.clear();
                          lcd.print("Atm P:");   lcd.setCursor(8, 0); lcd.print(AD) ;lcd.print("mm.Hg");//вывод атмосферного давления на дисплей
     lcd.setCursor(0, 1); lcd.print("Voda:");   lcd.setCursor(8, 1); lcd.print(Voda) ;lcd.print("L");//вывод уровня воды в баке на дисплей

      }
     voltmetr();                            // Считываем напряжения на выходе ИБП (норма 13,5в)
     previousMillis = currentMillis;       // Сброс таймера
}
void voltmetr()  //____________Цикл "Вольтметр"__измерение напряжения на выходе ИБП
// Взято с http://digitrode.ru/computing-devices/mcu_cpu/87-voltmetr-na-arduino.html
{
   volt = analogRead(A1);                       // А0 аналоговый вход вольтметра
   vout = (volt * 5.0) / 1024.0;             
   Vpit = vout / (10000.0/(100000.0+10000.0));  // По формуле Vpit = vout / (R2/(R1+R2)) 
   if (Vpit<0.09) { Vpit=0.0;}                  // Округление до нуля 
}

void alarms()  //______________Цикл "тревожные сигналы"____// http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...
{

             }

//else if (Vpit<=12.0 && SMSVoltIBP==false)             { startOneSMS(); Serial2.println("Alarm! Min zaryad akkumulyatora IBP!"); EndSMS(); SMSVoltIBP=true;}             // Низкий заряд аккумулятора
//else if (Vpit>=14.0 && SMSVoltIBP==false)             { startOneSMS(); Serial2.println("Alarm! Max zaryad akkumulyatora IBP!"); EndSMS(); SMSVoltIBP=true;}             // Перезаряд аккумулятора
//  else {statusAlarm=0; AlarmTemp=0;}

//}
void SMSbalance()
{
  Serial1.println("ATD*102#");
  delay(2000);                            
}
void homeON() //Цикл включения умного дома
{
  statushome=1;      // статус умного дома                   0 - откл , 1- вкл
  Serial.print("HOME vkl");   
}
void homeOFF() //Цикл выключения умного дома
{
  statushome=0;      // статус питания дома                  0 - откл , 1- вкл
  Serial.print("HOME vikl");
}
void otoplenie() // Цикл управления электро котлом (Сигнал инвертированный!(Особенность подключения к котлу))
{
  if ( statusotp==0) // Отключено
     {  digitalWrite(53,HIGH);
        Serial.print("Otoplenie vikl");} // Отключить отопление
  
  if ( statusotp==1) // Климат-контроль
     {  if ( TempZalC > (tempDust)){digitalWrite(53,HIGH);
            Serial.print("Otoplenie vikl");} // Отключить отопление если температура больше желаемой
        if (TempZalC < tempDust)   {digitalWrite(53,LOW);
            Serial.print("Otoplenie vkl");}  // Включить отопление если температура меньше желаемой
     }
  if ( statusotp==2) // Экономия
     {  if ( TempZalC > (tempDECOust)){digitalWrite(53,HIGH);
            Serial.print("OtoplenieEco vikl");} // Отключить отопление если температура больше желаемой на 1грС
        if (TempZalC < tempDECOust)   {digitalWrite(53,LOW);
            Serial.print("OtoplenieEco vkl");}  // Включить отопление если температура меньше желаемой
     }
}  
void zapros()  //Передача всех параметров в терминал
{
  Serial.print("SmartHOME = ");
  if (statushome==1){Serial.println("ON");}
  if (statushome==0){Serial.println("OFF");}
  Serial.print("Klimat kontrol= ");
  if (statusotp==1){Serial.print("ON: "); Serial.print("Ustavka: "); Serial.print(tempDust); Serial.println("*C");}
  if (statusotp==0){Serial.println("OFF");}
  if (statusotp==2){Serial.println("ECONOMIA");}
  
  Serial.println("Parametry:");
    
 // int chk = dht.read(DHT11PIN);
 // switch (chk)
// {
  //  case DHTLIB_OK: break; // Serial1.println("DHT-OK"); 
 //   case DHTLIB_ERROR_CHECKSUM: Serial1.println("DHT Checksum error"); break;
 //   case DHTLIB_ERROR_TIMEOUT:  Serial1.println("DHT Time out error"); break;
//    default: Serial1.println("DHT Unknown error"); break;
//  }
  Serial.print("Voda="); Serial.print(Voda);Serial.println("L");
  Serial.print("P="); Serial.print(AD); Serial.println(" mm.Hg");
  Serial.print("Vlaga: ");    Serial.print(Vlaga);    Serial.println(" %");
  Serial.print("Zal: ");    Serial.print(TempZalC);    Serial.println(" *C");
  Serial.print("Ulica:");   Serial.print(TempUlicaC);  Serial.println(" *C");
  Serial.print("Podacha:"); Serial.print(Temppodacha); Serial.println(" *C");
  Serial.print("Obratka:"); Serial.print(Tempobratka); Serial.println(" *C");
//  Serial.print("IBP:+");    Serial.print(Vpit);    Serial.println(" V");
//  if (Vpit<=12.0)   { Serial.println("Alarm! Min zaryad akkumulyatora IBP!"); }
//  if (Vpit>=14.0)   { Serial.println("Alarm! Max zaryad akkumulyatora IBP!"); }
//  Serial.print("SMS:");     Serial.println(SMSschet);
//  Serial.print("DS18B20 ERROR:");// Serial.println(dsshet);
}
void SMSzapros()
{
    startOneSMS();
    Serial1.print("HOME=");
    if (statushome==1){Serial1.println("ON");}
    if (statushome==0){Serial1.println("OFF");}
//    Serial1.print("Ohrana:");
//    if (signaliz==2){Serial1.println("START");}
//    if (signaliz==1){Serial1.println("ON");}
//    if (signaliz==0){Serial1.println("OFF");}
    
//    if (AlarmTemp==1) { Serial1.println("Temperatura!"); }
    Serial1.print("KLIMAT=");    
    if (statusotp==1){Serial1.print("ON:"); Serial1.print(tempDust); Serial1.println("*C");}
    if (statusotp==0){Serial1.println("OFF");}
    if (statusotp==2){Serial1.println("ECO");}
  Serial1.print("Voda="); Serial1.print(Voda);Serial1.println("L");
  Serial1.print("P="); Serial1.print(AD); Serial1.println(" mm.Hg");
  Serial1.print("Vlaga: ");    Serial1.print(Vlaga);    Serial1.println(" %");
  Serial1.print("Zal: ");    Serial1.print(TempZalC);    Serial1.println(" *C");
//  Serial1.print("Ulica:");   Serial1.print(TempUlicaC);  Serial1.println(" *C");
  Serial1.print("Podacha:"); Serial1.print(Temppodacha); Serial1.println(" *C");
  Serial1.print("Obratka:"); Serial1.print(Tempobratka); Serial1.println(" *C");
//  Serial1.print("IBP:+");    Serial1.print(Vpit);    Serial1.println(" V");
    EndSMS();                                 
}
void NastroykaGSM()
{
    Serial1.print("AT+CMGF=1\r"); //устанавливает текстовый режим смс-сообщения
    Serial.println("text:");
    delay(500);
    Serial1.print("AT+IFC=1, 1\r");       //устанавливает программный контроль потоком передачи данных
    delay(500);
    Serial1.print("AT+CPBS=\"SM\"\r");    //открывает доступ к данным телефонной книги SIM-карты
    delay(500);
    // Serial1.print("AT+GSMBUSY=1, 1\r");   //запрет всех входящих звонков
   // delay(500);
    Serial1.print("AT+CMGDA=\"DEL ALL\"\r"); //Очищаем накопившиеся СМС 
    delay(500);
    Serial.println("SMS to terminal:");
    Serial1.print("AT+CNMI=1,2,2,1,0\r"); //включает оповещение о новых сообщениях
    delay(500);
    }
void startOneSMS() //__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
{
      delay(300);
      Serial1.print("AT+CMGF=1\r");
      delay(300);
      Serial1.println("AT + CMGS = \"+79ххххххххх\""); 
      delay(300);
}      
void EndSMS() //__________________Цикл окончания и отправки СМС-сообщения_______________________
{
   delay(300);
   Serial1.println((char)26);    // Команда отправки СМС
   delay(5000);
}

 

Serzh251
Offline
Зарегистрирован: 15.11.2017

забыл добавить. при остальных командах по смс, кроме запроса параметров и запроса баланса ответное смс приходит как надо

b707
Offline
Зарегистрирован: 26.05.2017

Serzh251 пишет:

2. при запросе баланса прилетает в ответ смс где только АТ команда "ATD*102#"

А что вы хотели, вы же вместо того, чтобы отправить запрос баланса оператору, потом принять ответ, распарсить его и вытащить собственно сумму - вы вместо всего этого просто пихаете команду баланса в СМС - она и приходит.

Serzh251 пишет:

сначала вообще смс не отправлялись, увеличил задерки между посылками АТ команд до 300мс при настройке модуля и до 200мс при командах отправки. смс стали приходить. но так же прилетали АТ команды в смс

потому что код уродский. Типичный "умный дом на СМС" из инета.  По уму после каждой команды модему вы должны дождаться ответа, проверить, что это "ОК", и только потом отсылать следующую команду. И задержки ответа модема могут быть как 100мс, так и пять секунд.

Serzh251
Offline
Зарегистрирован: 15.11.2017

распарсить-да, но для меня это пока сложновато

в ходе множественных исканий был как то код, там насколько помню баланс был заюзан аналогично, работало, но утверждать не буду, уже и не помню, если честно

согласен, код уродский и типичный из инета..

с ОК как то пытался, не пошло что то. знаю, да. ждать можно долго и не всегда одинаково занимает время ответа

стратегия у меня такая- для начала лишь бы чтоб работало, ( времени сделать все сразу хорошо нет, система постоянно используется) а потом доработка и прочее

b707
Offline
Зарегистрирован: 26.05.2017

Serzh251 пишет:

в ходе множественных исканий был как то код, там насколько помню баланс был заюзан аналогично, работало, но утверждать не буду, уже и не помню, если честно

Баланс так работать точно не будет.

b707
Offline
Зарегистрирован: 26.05.2017

Вот еще, нашел, почему у вас приходит AT + CMGS = \"+79ххххххххх\" в запросе. Вы дважды вызываете функцию StartOneSMS() - сначала до процедуры Zapros. а потом в самой процедуре...

 

Serzh251
Offline
Зарегистрирован: 15.11.2017

b707 пишет:

Вот еще, нашел, почему у вас приходит AT + CMGS = \"+79ххххххххх\" в запросе. Вы дважды вызываете функцию StartOneSMS() - сначала до процедуры Zapros. а потом в самой процедуре...

 

черт, точно ж.. невнимательность всего лишь..спасибо за помощь

по запросу баланса буду еще читать

MaksVV
Offline
Зарегистрирован: 06.08.2015

про баланс. строка 149. Вы распознаете команду "Balance". Далее начинаете отсылать сразу смс, потом делаете запрос баланса. 

А надо сначала сделать запрос баланса, и потом, когда смс с балансом придёт на GSM модуль, уже отправлять его пользователю. 

Т.е. строка 149 далжна выглядеть так

if(val.indexOf("Balans") > -1) { SMSbalance(); }

и далее вставляете рядом, где у вас парсятся все команды, распознавание, что прилетело смс с балансом 

иногда оно начинается не +CMT, а с +USD тогда будет так 

 if(val.indexOf("+CMT") > -1) //если есть входящее sms
     {
      if(val.indexOf("On") > -1) { startOneSMS(); Serial1.println("SISTEMA UMNIY DOM-ON"); EndSMS(); homeON(); Serial.println("SISTEMA UMNIY DOM-ON");} //включение УД

      if(val.indexOf("Off") > -1){ startOneSMS(); Serial1.println("SISTEMA UMNIY DOM-OFF"); EndSMS(); homeOFF(); Serial.println("SISTEMA UMNIY DOM-OFF");} //выключение УД
       
      if(val.indexOf("OTOPLENIE-ON") > -1) { startOneSMS(); Serial1.println("OTOPLENIE-ON"); Serial1.print(TempZalC); EndSMS(); statusotp=1; Serial.println("OTOPLENIE-ON");} //включение отопления
  
      if(val.indexOf("OTOPLENIE-OFF") > -1) { startOneSMS(); Serial1.println("OTOPLENIE-OFF"); EndSMS(); statusotp=0; Serial.println("OTOPLENIE-OFF");} //включение отопления

      if(val.indexOf("OTOPLENIE-ECO") > -1) { startOneSMS(); Serial1.println("OTOPLENIE-ECO"); EndSMS(); statusotp=2; Serial.println("OTOPLENIE-ECO");} //включение отопления

      if(val.indexOf("Zapros") > -1) { startOneSMS(); SMSzapros(); EndSMS();} //запрос параметров

      if(val.indexOf("Balans") > -1) { SMSbalance(); } //запрос баланса
       
     }
else if (val.indexOf("+USD") > -1) {startOneSMS(); Serial1.println (val); EndSMS();}

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

А команду запроса баланса лучше писать не так как у вас  Serial1.println("ATD*102#");

а вот так Serial1.println("ATD#102#"); . Потому как в вашем варианте, возможно, смс с балансом будет приходить на кириллице, и оно будет не читаемо для вашего скетча. 

 

Serzh251
Offline
Зарегистрирован: 15.11.2017

MaksVV пишет:

А команду запроса баланса лучше писать не так как у вас  Serial1.println("ATD*102#");

а вот так Serial1.println("ATD#102#"); . Потому как в вашем варианте, возможно, смс с балансом будет приходить на кириллице, и оно будет не читаемо для вашего скетча. 

 

спасибо за помощь, вроде разобрался, заработало

только в моем случае смс с балансом начинается не +USD, а с +СUSD

и в ответном смс кроме баланса опять команда 

ATD#102#
 
OK
 
+CUSD: 0," Vash balans 96.59 r.
Serzh251
Offline
Зарегистрирован: 15.11.2017

есть еще такая особенность:

сейчас все датчики работают исправно и дают адекватные показания

но стоит в 15 строку вставить адрес другого датчика температуры 0x10, 0x57, 0x39, 0xBE, 0x02, 0x08, 0x00, 0x9A

то пропадают показания барометра, при чем данные с этого датчика температуры адекватные..

барометр BMP280

MaksVV
Offline
Зарегистрирован: 06.08.2015

Serzh251 пишет:

и в ответном смс кроме баланса опять команда 

ATD#102#
 
OK
 
+CUSD: 0," Vash balans 96.59 r.

код покажите. скорее всего нужно убрать задержку 2 сек после команды запроса баланса 

т.е. убираем совсем функцию SMSbalance() и строку запроса делаем в виде

if(val.indexOf("Balans") > -1) { Serial1.println ("ATD#102#"); }

Пока идёт эта задержка 2 сек. Модуль успевает ответить на команду эхом

ATD#102#

OK
всё это пишется в строку стринг
 
И за эти 2 секунды видать успевает прилететь баланс, поэтому в буфере ещё есть информация, поэтому вы не  выходите из цикла while , строка стринг не обнуляется, т.к. обнуление идёт вне цикла while. и в строку стринг пишется далее прилетевший баланс вместе с уже ранее записанным ATD#102#  OK и далее эта строка благополучно вам отправляется в смс
Serzh251
Offline
Зарегистрирован: 15.11.2017

MaksVV пишет:

Serzh251 пишет:

и в ответном смс кроме баланса опять команда 

ATD#102#
 
OK
 
+CUSD: 0," Vash balans 96.59 r.

код покажите. скорее всего нужно убрать задержку 2 сек после команды запроса баланса 

т.е. убираем совсем функцию SMSbalance() и строку запроса делаем в виде

if(val.indexOf("Balans") > -1) { Serial1.println ("ATD#102#"); }

Пока идёт эта задержка 2 сек. Модуль успевает ответить на команду эхом

ATD#102#

OK
всё это пишется в строку стринг
 
И за эти 2 секунды видать успевает прилететь баланс, поэтому в буфере ещё есть информация, поэтому вы не  выходите из цикла while , строка стринг не обнуляется, т.к. обнуление идёт вне цикла while. и в строку стринг пишется далее прилетевший баланс вместе с уже ранее записанным ATD#102#  OK и далее эта строка благополучно вам отправляется в смс

сделал вот так

if(val.indexOf("Balans") > -1) {  Serial1.println("ATD#102#");} //запрос баланса  
     }
     else if (val.indexOf("+CUSD") > -1) {startOneSMS(); Serial1.println (val); EndSMS();}
тоже самое. и кстати, это отключено. при подключении через USB конвентер к компу и терминальную программу, эха нет