Помогите с кодом,не правильно обрабатываются SMS

gatsby163
Offline
Зарегистрирован: 10.03.2014

Подскажите в чем может быть проблема не правильного распознования 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);
    }
}

 

gatsby163
Offline
Зарегистрирован: 10.03.2014

Пробовал отправлять Латиницу, Кириллицу, цифры...все равно в серийном мониторе: я

gatsby163
Offline
Зарегистрирован: 10.03.2014

Нашел причину...если включить сначала 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);
 }

 

 

Araris
Offline
Зарегистрирован: 09.11.2012

Ваш скетч неоправданно часто вызывает sensors.requestTemperatures(), почитайте, например, http://arduino.ru/forum/programmirovanie/kak-oprashivat-ds18b20-v-fone