Система домашней автоматизации на базе Arduino

Я работаю над своим проектом системы домашней автоматизации с использованием Arduino GSM SIM900 и четырехканального релейного модуля. Столкнулся с проблемой в своем коде. Может ли кто-нибудь помочь мне в этом, SMS получает, но не переключает реле?

#include <SoftwareSerial.h>

// EN: Строковый буфер для сообщения GPRS shield
String msg = String("");
// EN: Установите значение 1, когда следующее сообщение GPRS shield будет содержать SMS-сообщение
int SmsContentFlag = 0;
//управляющие контакты реле.
int relay_a=4;
int relay_b=5;
int relay_c=6;
int relay_d=7;

// RU: Кодовый контакт pin SIM-карты (если применяется)
//String SIM_PIN_CODE = String( "XXXX" );

void setup()
{
  Serial.begin(19200);                 // скорость передачи данных GPRS в бодах
  // Инициализация контактов
  pinMode( 4, OUTPUT ); 
  pinMode( 5, OUTPUT ); 
  pinMode( 6, OUTPUT ); 
  pinMode( 7, OUTPUT ); 
  digitalWrite( 4, LOW ); 
  digitalWrite( 5, LOW ); 
  digitalWrite( 6, LOW );
  digitalWrite( 7, LOW );
 Serial.println( "AT+CMGF=1" ); 
 delay(200);
}

void loop()
{
    char SerialInByte;
    if(Serial.available())
    {       
        SerialInByte = (unsigned char)Serial.read();
       delay(5);

        // -------------------------------------------------------------------
        // RU: Программа также прослушивает сообщение GPRS shield.
        // -------------------------------------------------------------------
       // RU: Если сообщение заканчивается на <CR>, то обработайте его
        if( SerialInByte == 13 ){
          // RU: Сохраните символ в буфере сообщений
          ProcessGprsMsg();
         }
         if( SerialInByte == 10 ){
            // RU: Пропустить подачу строки
         }
         else {
           // RU: сохранение текущего символа в буфере строки сообщения
           msg += String(SerialInByte);
         }
     }   
}
// RU: Сделайте действие, основанное на содержании SMS. 
// Обратите внимание, что содержание SMS является результатом обработки нескольких сообщений GPRS shield.
void ProcessSms( String sms ){

  if( sms.indexOf("ona") >= 0 ){
    digitalWrite( relay_a, HIGH );
  }
   if( sms.indexOf("onb") >= 0 ){
    digitalWrite(  relay_b, HIGH );
  }
   if( sms.indexOf("onc") >= 0 ){
    digitalWrite(  relay_c, HIGH );
  }
  if( sms.indexOf("ond") >= 0 ){
    digitalWrite(  relay_d, HIGH );
  }
  if( sms.indexOf("offa") >= 0 ){
    digitalWrite(  relay_a, LOW );
  }
  if( sms.indexOf("offb") >= 0 ){
    digitalWrite(  relay_b, LOW );
  }
  if( sms.indexOf("offc") >= 0 ){
    digitalWrite(  relay_c, LOW );
  }
  if( sms.indexOf("offd") >= 0 ){
    digitalWrite(  relay_d, LOW );
  }
}
// RU: Запрос текстового режима для SMS-сообщений
void GprsTextModeSMS(){
  Serial.println( "AT+CMGF=1" );
}

void GprsReadSmsStore( String SmsStorePos ){
  Serial.print( "AT+CMGR=" );
  Serial.println( SmsStorePos );
}

// RU: Очистить буфер сообщений GPRS shield
void ClearGprsMsg(){
  msg = "";
}

// RU: интерпретируйте сообщение GPRS shield и действуйте соответствующим
void ProcessGprsMsg() {
  if( msg.indexOf( "Call Ready" ) >= 0 ){
   //  Serial.println( "*** GPRS Shield зарегистрирован в мобильной сети ***" );
     GprsTextModeSMS();
  }

  // RU: незапрашиваемое сообщение, полученное при получении SMS-сообщения
  if( msg.indexOf( "+CMTI" ) >= 0 ){
   //  Serial.println( "*** SMS Received ***" );
     // RU: Ищите кому в полном сообщении (+CMTI: "SM",6)
     // В образце SMS хранится в позиции 6
     int iPos = msg.indexOf( "," );
     String SmsStorePos = msg.substring( iPos+1 );
   //  Serial.print( "SMS stored at " );
  //   Serial.println( SmsStorePos );     
     // RU: Попросите прочитать SMS store
     GprsReadSmsStore( SmsStorePos );
  }

  // RU: SMS store считывается через UART (результат запроса GprsReadSmsStore)  
  if( msg.indexOf( "+CMGR:" ) >= 0 ){
    // RU: Следующее сообщение будет содержать ТЕЛО SMS
    SmsContentFlag = 1;
    // RU: Следующие строки очень важны для того, чтобы не очищать флаг!
    ClearGprsMsg();
    return;
  }

  // EN: +CMGR сообщение непосредственно перед этим указывает на то, что следующее сообщение GRPS Shield 
  // (это сообщение) будет содержать тело SMS-сообщения 
  if( SmsContentFlag == 1 ){
 // Serial.println ( "СОДЕРЖИМОЕ SMS-СООБЩЕНИЯ***" );
 // Serial.println( msg );
 // Serial.println( "*** КОНЕЦ SMS-СООБЩЕНИЯ ***" );
    ProcessSms( msg );
  }

  ClearGprsMsg();
  // EN: Всегда очищайте флаг
  SmsContentFlag = 0; 
}

, 👍0


1 ответ


1

Я думаю, вы хотели бы включить вызов ClearGprsMsg() прямо перед строкой GprsReadSmsStore( SmsStorePos );.

Тогда msg += Строка(СериалИнБайт); вероятно, неверно, см., например http://arduino.cc/en/Tutorial/StringConstructors:

// использование постоянного целого числа:
stringOne =  String(13);        
Serial.println(stringOne);      // напечатает "13"
,