Помогите с кодом,не правильно обрабатываются SMS
- Войдите на сайт для отправки комментариев
Вс, 22/01/2017 - 21:39
Подскажите в чем может быть проблема не правильного распознования SMS. Любая SMS распознается как символ "я"

#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(7, 8);
//для зелёного светодиода будем использовать второй цифровой вход,
//а для жёлтого - третий
int greenPin = 2;
int yellowPin = 3;
void setup()
{
Serial.begin(9600);
gprsSerial.begin(19200);
pinMode(greenPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
//Включаем GPRS Shield, эмулируя нажатие кнопки POWER
pinMode(9, OUTPUT);
digitalWrite(9, HIGH); // Подаем High на пин 9
delay(3000); // на 3 секунды
digitalWrite(9, LOW); // и отпускаем в Low.
delay(5000); // Ждём 5 секунд для старта шилда
// Настраиваем приём сообщений с других устройств
// Между командами даём время на их обработку
gprsSerial.print("AT+CMGF=1\r");
delay(300);
gprsSerial.print("AT+IFC=1, 1\r");
delay(300);
gprsSerial.print("AT+CPBS=\"SM\"\r");
delay(300);
gprsSerial.print("AT+CNMI=1,2,2,1,0\r");
delay(500);
Serial.println("Send me sms ");
}
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
void loop()
{
if (!gprsSerial.available())
return;
char currSymb = gprsSerial.read();
Serial.print("Sostoyanie isStringMessage: ");
Serial.println(isStringMessage);
Serial.println(currSymb);
if ('\r' == currSymb) {
if (isStringMessage) {
//если текущая строка - SMS-сообщение,
//отреагируем на него соответствующим образом
if (!currStr.compareTo("Green on")) {
digitalWrite(greenPin, HIGH);
} else if (!currStr.compareTo("Green off")) {
digitalWrite(greenPin, LOW);
} else if (!currStr.compareTo("Yellow on")) {
digitalWrite(yellowPin, HIGH);
} else if (!currStr.compareTo("Yellow off")) {
digitalWrite(yellowPin, LOW);
}
isStringMessage = false;
} else {
if (currStr.startsWith("+CMT")) {
//если текущая строка начинается с "+CMT",
//то следующая строка является сообщением
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
}
Пробовал отправлять Латиницу, Кириллицу, цифры...все равно в серийном мониторе: я
Нашел причину...если включить сначала GSM модуль а потом Arduino секунд через 15 то все работает...только команды медленно обрабатываются) Выводил в серийный монитор процесс обработки он как будто по символу выводил значение currSymb в общем обработка входящей смс занимает примерно секунд 40
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <OneWire.h> #include <DallasTemperature.h> #include <SoftwareSerial.h> SoftwareSerial gprsSerial(7, 8); #define ONE_WIRE_BUS 2 // Датчики ds18b20 подключены на 2 пин #define TEMPERATURE_PRECISION 9 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress sensor1 = {0x28, 0xFF, 0x46, 0xB2, 0x50, 0x16, 0x04, 0xF7}; DeviceAddress sensor2 = {0x28, 0xFF, 0xA1, 0x92, 0x47, 0x16, 0x03, 0xBF}; LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей int relayPin = 3; float tempC; String currStr = ""; // Переменная принимает значение True, если текущая строка является сообщением boolean isStringMessage = false; void setup(){ //Serial.begin(9600); sensors.begin(); lcd.init(); lcd.backlight();// Включаем подсветку дисплея lcd.print("arduino.ru"); lcd.setCursor(3, 1); lcd.print("LCD 1602"); gprsSerial.begin(19200); pinMode(relayPin, OUTPUT); // Настраиваем приём сообщений с других устройств // Между командами даём время на их обработку gprsSerial.print("AT+CMGF=1\r"); delay(300); gprsSerial.print("AT+IFC=1, 1\r"); delay(300); gprsSerial.print("AT+CPBS=\"SM\"\r"); delay(300); gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); delay(500); //Serial.println("Send me sms "); } void loop() { GetTemp(); if (!gprsSerial.available()) return; char currSymb = gprsSerial.read(); //Serial.print(currSymb); if ('\r' == currSymb) { if (isStringMessage) { //если текущая строка - SMS-сообщение, //отреагируем на него соответствующим образом if (!currStr.compareTo("On")) { digitalWrite(relayPin, HIGH); } else if (!currStr.compareTo("Off")) { digitalWrite(relayPin, LOW); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } } void GetTemp(){ sensors.requestTemperatures(); lcd.setCursor(0, 0); lcd.print("Temp1: "); lcd.print(sensors.getTempC(sensor1)); lcd.println("C"); lcd.setCursor(0, 1); lcd.print("Temp2: "); lcd.print(sensors.getTempC(sensor2)); lcd.println("C"); sensors.requestTemperatures(); //delay(2000); }Ваш скетч неоправданно часто вызывает sensors.requestTemperatures(), почитайте, например, http://arduino.ru/forum/programmirovanie/kak-oprashivat-ds18b20-v-fone