Система домашней автоматизации на базе 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"
,
@JimmyB
Смотрите также:
- Как заставить 5-вольтовое реле работать с NodeMCU
- Когда следует использовать транзистор, МОП-транзистор, а когда следует использовать реле?
- Проблема с получением SMS - GSM-модуль Arduino Uno и SIM900A
- SIM900 3G? Или SIM900A умеет подключаться к 3G?
- Мини-модем SIM900a, IMEI 0, помощь с контактами TX RX
- Как получить данные из базы данных моего сервера в переменную в моем Arduino?
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- SIM800L не регистрируется в сети