Вопрос по куску кода управления по смс
- Войдите на сайт для отправки комментариев
Втр, 19/04/2016 - 14:17
#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);
}
}
В этом коде есть кусок не понятный для меня. Так как я только учусь. Не по книге, а разбирая чужие коды.
Вот не могу понять, зачем тут этот код
if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); Мы же уже приняли сообщение Green On Green off и так далее. Зачем опять проверять всё?Можно ли вообще в if {} else {} не использовать else вообще, если if и так добивается того, что нам надо? В моём случае включение и выключение светодиода. А другого мне не надо.
новые сообщения приходят в следующем формате:
+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; }Спасибо.
Я подключил вместо светодиода реле, вместо YellowPin написал Relay.
И добавил функцию звонка. Если реле в HIGH то мне поступает звонок с шилда с задержкой 10 секунд и сброс. Чтобы я знал что всё включилось.
А как вот сделать, чтобы звонок был бесконечен?
Вот такой код не дал результат
while(Relay!=LOW)
{
gprs.Serial println("ATD+ +79XXXXXXXXXXX;");
delay(10000);
gprs.Serial println("AT+CHUP");
}
По моему должен идти повторение звонок и сброс, пока Relay в HIGH или нет?
Потому что звонк, сброс и всё
Эммм, как бы, усматриваются непонятки с Relay
вместо YellowPin написал Relay.
while(Relay!=LOW)
Relay это пин или переменная? Может надо while (digitalRead(Relay)!=LOW)...?
Вот так я писал. R#include <SoftwareSerial.h>
}
Вот такой код Relay переменная
Функция digitalRead дала тот же результат
Relay все таки номер пина. Одного я не могу понять, зачем тебе впадать в бесконечный цикл дозвона. Может ты хочешь в перерывах принимать СМС, а каждые 10 сек дозваниваться?
Чтобы вписать номер жертвы и достать звонками
Нет. Смс включает реле, потом идёт мне звонок. Ну для того чтобы мне было спокойно, раз звонок был то всё включилось. ВСё это работает. Как мне надо. Но я хотел так.
подключаем библиотеку
#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");
}
А выход из цикла while(LED==HIGH) как ты намерен делать? Ведь внутри цикла надо когда-то присвоить LED=LOW... иначе это бесконечный цикл.
Так цель достать звонком, поэтому бесконечно
тогда while(1)....
Всё равно. Звонит, сбрасывает и на этом всё
Попробуй после gprsSerial.println("AT+CHUP"); паузу воткнуть.
Всё отлично работает:) Вообще супер.
Просто код коряво написан.
if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; }Действительно, зачем вставлять ветвление туда, где оно совершено не нужно:
isStringMessage = currStr.startsWith("+CMT");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;
Так надо?