Пытаюсь запрограммировать сигнализацию, управлять ей хочу с помощью смсок с телефона. В самом коде пытаюсь определить несколько состояний, соответственно когда выключена, когда включена и когда необходимо подать сигнал тревоги. Переход между состояниями включения и выключения хочу сделать посредством отправки смс. Проблема в следующем: насколько я понял, плата не постоянно готова принимать смс. В период, когда она мигает светодиодом или пищит пищалкой, либо просто идет ожидание (delay), приема смс не происходит. Подскажите, как решить эту проблему, чтобы плата постоянно была готова к приему смс, независимо от того, какое действие она выполняет.
как вариант обойти это: 1) не знаю через что вы получаете СМС, если это что-то поддерживает сигнал о приходе сообщения, ловить этот сигнал и передавать как прерывание 2) взять ат-тини за 90 рублей, посадить его на работу с СМС, и при приеме смски она будет кидать прерывание основному МК 3) написать скетч так чтобы он вовремя ловил СМС, к примеру: чтобы моргнуть светодиодом ему нужно несколько тактов, та что задержка прихода СМС на несколько долей миллисекунды, погоды не делает ( с учетом что она будет гулять по просторам ОПСОСА хз сколько). делей можно исключить из программы
Uno получает смс через GPRS Shield К примеру, я отправляю сообщение "secure on" что означает включить сигнализацию. После этого плата должна мигать светодиодом, до тех пор пока не получит новое сообщение. Например, это будет сообщение "alarm" - принудительный запуск тревоги. Тогда плата должна прекратить мигать одним цветом и начинает мигать другим, а также пищать зуммером. До тех пор пока не получит новое. А проблема в том, что, к примеру, я запустил "alarm". Цикл выполняется постоянно и сообщение об отмене тревоги плата не получает. Вот мой примитивный код, я отталкиваюсь от скетча с вики про управление светодиодами с помощью смс. http://wiki.amperka.ru/беспроводная-связь:gprs-shield #include <SoftwareSerial.h> SoftwareSerial gprsSerial(7, 8); int sost = 1; //1 - на страже //2 - выключена //3 - тревога boolean wheel, saddle, device; int redPin = 12; int greenPin = 13; int bluePin = 6; void setup() { gprsSerial.begin(19200); Serial.begin(9600); pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, 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 = ""; boolean isStringMessage = false; int updateTime = 0; void loop() { if (!gprsSerial.available()) return; char currSymb = gprsSerial.read(); if ('\r' == currSymb) { if (isStringMessage) { if (!currStr.compareTo("Secure on")) { sost = 1; } else if (!currStr.compareTo("Secure off")) { sost = 2; } else if (!currStr.compareTo("Alarm")) { sost = 3; } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } Serial.println(sost); if (sost == 1) { secure_on(); } if (sost == 2) { secure_off(); } if (sost == 3) { alarm(); } } void secure_on() { digitalWrite(bluePin, HIGH); delay(50); digitalWrite(bluePin, LOW); delay(2000); } void secure_off() { digitalWrite(greenPin, HIGH); delay(50); digitalWrite(greenPin, LOW); delay(2000); } void alarm() { sost = 3; digitalWrite(redPin, HIGH); delay(50); digitalWrite(redPin, LOW); delay(500); }
Частично решил вопрос, кому интересно код: #include <SoftwareSerial.h> SoftwareSerial gprsSerial(7, 8); int sost = 1; //1 - на страже //2 - выключена //3 - тревога boolean wheel, saddle, device; int redPin = 12; int greenPin = 13; int bluePin = 6; void setup() { gprsSerial.begin(19200); Serial.begin(9600); pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, 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 = ""; boolean isStringMessage = false; int updateTime = 0; void loop() { if (sost == 1) secure_on(); if (sost == 2) secure_off(); if (sost == 3) alarm(); /* if (!gprsSerial.available()) return; char currSymb = gprsSerial.read(); if ('\r' == currSymb) { if (isStringMessage) { if (!currStr.compareTo("Secure on")) { sost = 1; secure_on(); } else if (!currStr.compareTo("Secure off")) { sost = 2; secure_off(); } else if (!currStr.compareTo("Alarm")) { sost = 3; alarm(); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } Serial.println(sost); */ } void secure_on() { while (sost == 1) { char currSymb = gprsSerial.read(); if ('\r' == currSymb) { if (isStringMessage) { if (!currStr.compareTo("Secure off")) { sost = 2; // digitalWrite(redPin, LOW); return; } else if (!currStr.compareTo("Alarm")) { sost = 3; return; } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } digitalWrite(bluePin, HIGH); delay(50); digitalWrite(bluePin, LOW); delay(50); } } void secure_off() { while (sost == 2) { char currSymb = gprsSerial.read(); if ('\r' == currSymb) { if (isStringMessage) { if (!currStr.compareTo("Secure on")) { sost = 1; // digitalWrite(redPin, LOW); return; } else if (!currStr.compareTo("Alarm")) { sost = 3; return; } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } digitalWrite(greenPin, HIGH); delay(50); digitalWrite(greenPin, LOW); delay(50); } } void alarm() { while (sost == 3) { char currSymb = gprsSerial.read(); if ('\r' == currSymb) { if (isStringMessage) { if (!currStr.compareTo("Receive")) { sost = 2; // digitalWrite(redPin, LOW); return; } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } digitalWrite(redPin, HIGH); delay(50); tone(5,900,50); digitalWrite(redPin, LOW); delay(50); } }