Вопрос по куску кода управления по смс
- Войдите на сайт для отправки комментариев
Втр, 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 {} else {} не использовать else вообще, если if и так добивается того, что нам надо? В моём случае включение и выключение светодиода. А другого мне не надо.
новые сообщения приходят в следующем формате:
+CMT: "номер телефона", "", "дата, время", /r/n
"а на следующей строчке с первого символа идёт содержимое сообщения", /r/n
Поэтому получив первый /r проверяют наличие +CMT, если есть, значит следующая строка текст сообщения. Просто код коряво написан.
Напиши так:
Спасибо.
Я подключил вместо светодиода реле, вместо 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"); паузу воткнуть.
Всё отлично работает:) Вообще супер.
Просто код коряво написан.
Действительно, зачем вставлять ветвление туда, где оно совершено не нужно:
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;
Так надо?