Ви не увійшли.
Благодарю. Буду пробовать.
Для меня, как новичка, такие вещи совсем не очевидные. Учусь, разбираюсь.
Спасибо всем неравнодушным
И чо ж тебе, родной, неясно на .ru объяснили? Удаляй нахер все свои объявления бесчисленные объявления стрингов из глобального уровня, а объявляй каждую локально по месту использования и будет тебе много счастья !
Здравствуйте
Прошу подсказки в следующей ситуации. Набросал скетч, котрый по содержимому входящей смс активирует соотв. реле и при этом отвечает смской со статусом реле и дополнительными данными - температурой, влажностью и напряжением.
Проблема в том, что при различной комбинации команд, ответная смс от ардуино не всегда содержит весь набор данных. На каком-то этапе из строки просто "выпадают" значения. Иногда ответное смс вообще пустое.
Если продолжать слать команды в хаотичной последовательности - в какой-то момент снова появляется полное смс в ответ на ту же команду, на которую отвечало с потерей данных.
В терминале это выглядит так:
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 = "";
}
}
Всем спасибо!!!