Вопрос по куску кода управления по смс

VeD
Offline
Зарегистрирован: 21.02.2016
#include <SoftwareSerial.h>
 
SoftwareSerial gprsSerial(7, 8);
 
//для зелёного светодиода будем использовать второй цифровой вход,
//а для жёлтого - третий
int greenPin = 2;
int yellowPin = 3;
 
void setup()
{
    gprsSerial.begin(19200);
    pinMode(greenPin, OUTPUT);
    pinMode(yellowPin, 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);
}
 
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
 
void loop()
{
    if (!gprsSerial.available())
        return;
 
    char currSymb = gprsSerial.read();    
    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);
    }
}

 

VeD
Offline
Зарегистрирован: 21.02.2016

В этом коде есть кусок не понятный для меня. Так как я только учусь. Не по книге, а разбирая чужие коды. 

Вот не могу понять, зачем тут этот код
 

if (currStr.startsWith("+CMT")) {
                //если текущая строка начинается с "+CMT",
                //то следующая строка является сообщением
                isStringMessage = true;
            }
        }
        currStr = "";
    } else if ('\n' != currSymb) {
        currStr += String(currSymb);


Мы же уже приняли сообщение Green On Green off и так далее. Зачем опять проверять всё? 

 

VeD
Offline
Зарегистрирован: 21.02.2016

Можно ли вообще в if {} else {} не использовать else вообще, если if и так добивается того, что нам надо? В моём случае включение и выключение светодиода. А другого мне не надо.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

новые сообщения приходят в следующем формате:

+CMT: "номер телефона", "", "дата, время", /r/n
"а на следующей строчке с первого символа идёт содержимое сообщения", /r/n

Поэтому получив первый /r проверяют наличие +CMT, если есть, значит следующая строка текст сообщения. Просто код коряво написан.

Напиши так:

        if (!isStringMessage) 
        {
            if (currStr.startsWith("+CMT")) 
            {
                //если текущая строка начинается с "+CMT",
                //то следующая строка является сообщением
                isStringMessage = true;
            }
        } 
        else 
        {
            //если текущая строка - 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;
        }

 

VeD
Offline
Зарегистрирован: 21.02.2016

Спасибо. 

Я подключил вместо светодиода реле, вместо YellowPin написал Relay.

И добавил функцию звонка. Если реле в HIGH то мне поступает звонок с шилда с задержкой 10 секунд и сброс. Чтобы я знал что всё включилось.

 

А как вот сделать, чтобы звонок был бесконечен?

Вот такой код не дал результат

while(Relay!=LOW)

{

gprs.Serial println("ATD+ +79XXXXXXXXXXX;");

delay(10000);

gprs.Serial println("AT+CHUP");

}

 

По моему должен идти повторение звонок и сброс, пока Relay в HIGH или нет?

Потому  что звонк, сброс и всё

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Эммм, как бы, усматриваются непонятки с Relay

VeD пишет:

вместо YellowPin написал Relay.

while(Relay!=LOW)

Relay это пин или переменная? Может надо while (digitalRead(Relay)!=LOW)...?

VeD
Offline
Зарегистрирован: 21.02.2016

Вот так я писал. R#include <SoftwareSerial.h>

 
SoftwareSerial gprsSerial(7, 8);
 
//подключаем реле к третьему пину
int Relay = 3;
 
void setup()
{
  //Включаем GPRS Shield, эмулируя нажатие кнопки POWER
  pinMode(9, OUTPUT);
  digitalWrite(9, HIGH);    // Подаем High на пин 9
  delay(3000);              // на 3 секунды
  digitalWrite(9, LOW);     // и отпускаем в Low. 
  delay(5000);              // Ждём 5 секунд для старта шилда
    gprsSerial.begin(19200);
    pinMode(Relay, 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);
}
 
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
 
void loop()
{
    if (!gprsSerial.available())
       
 
    char currSymb = gprsSerial.read();    
    if ('\r' == currSymb) {
        if (isStringMessage) {
            //если текущая строка - SMS-сообщение,
            //отреагируем на него соответствующим образом
            if (!currStr.compareTo("V on")) {
                digitalWrite(Relay, HIGH);                  
 
 
while(digitalRead(Relay)!=LOW)
{
gprsSerial.println("ATD + +79246142263;");
delay(10000);
gprsSerial.println("AT+CHUP");
}
                
            //smsTextMessage();
               
            } else if (!currStr.compareTo("V off")) {
                digitalWrite(Relay, LOW);
            }
            isStringMessage = false;
        } else {
            if (currStr.startsWith("+CMT")) {
                //если текущая строка начинается с "+CMT",
                //то следующая строка является сообщением
                isStringMessage = true;
            }
        }
        currStr = "";
    } else if ('\n' != currSymb) {
        currStr += String(currSymb);
    }

}

 

Вот такой код Relay переменная 

VeD
Offline
Зарегистрирован: 21.02.2016

Функция digitalRead дала тот же  результат

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Relay все таки номер пина. Одного я не могу понять, зачем тебе впадать в бесконечный цикл дозвона. Может ты хочешь в перерывах принимать СМС, а каждые 10 сек дозваниваться?

VeD
Offline
Зарегистрирован: 21.02.2016

Чтобы вписать номер жертвы и достать звонками

VeD
Offline
Зарегистрирован: 21.02.2016

Нет. Смс включает реле, потом идёт мне звонок. Ну для того чтобы мне было спокойно, раз звонок был то всё включилось. ВСё это работает. Как мне надо. Но я хотел так.

подключаем библиотеку 

#include <SoftwareSerial.h>

SoftwareSerial gprsSerial(7,8);

int LED =13;

void setup()

{

pinMode(LED, OUTPUT);

gprsSerial.begin(9600);

}

void loop()

{

//включаем светодиод 

digitalWrite(LED, HIGH);

//Если светодиод горит, то пошел звонок и сброс бесконечно

while(LED==HIGH);

{

gprsSerial.printl(ATD+ +79XXXXXXXXXX;");

delay(10000);

gprsSerial.println("AT+CHUP");

}

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

А выход из цикла while(LED==HIGH) как ты намерен делать? Ведь внутри цикла надо когда-то присвоить LED=LOW... иначе это бесконечный цикл.

VeD
Offline
Зарегистрирован: 21.02.2016

Так цель достать звонком, поэтому бесконечно

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

тогда while(1)....

VeD
Offline
Зарегистрирован: 21.02.2016

Всё равно. Звонит, сбрасывает и на этом всё

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Попробуй после gprsSerial.println("AT+CHUP"); паузу воткнуть.

VeD
Offline
Зарегистрирован: 21.02.2016

Всё отлично работает:) Вообще супер. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Andy пишет:

Просто код коряво написан.

            if (currStr.startsWith("+CMT")) 
            {
                //если текущая строка начинается с "+CMT",
                //то следующая строка является сообщением
                isStringMessage = true;
            }

Действительно, зачем вставлять ветвление туда, где оно совершено не нужно:

                isStringMessage = currStr.startsWith("+CMT");
VeD
Offline
Зарегистрирован: 21.02.2016

isStringMesssage=currStr.startWith(("+CMT");
//если текст смс V on
// то включаем реле
if(currStr.compare to("V on");
digitalWrite("Relay, HIGH);
//если текст V off, то выключаем.
if(currStr.compare to("V off");
digitlWrite(Relay, LOW);
isStringMessage=true;

Так надо?