не отрабатывает функция enterring - входящий звонок. Сигнализация на бале GSM m590 PIR датчика и реле.
- Войдите на сайт для отправки комментариев
Чт, 16/03/2017 - 00:28
Если на модуль поступает звонок, то мы вкл/выкл реле. Если мы обнаружили движение, то мы звоним на телефон. Проблема: когда звоню на модуль, то мне телефон пишет "абонент занят", дозваниваюсь как минимум на второй а то и третий раз, и так всегда, не пойму почему. Где у меня ошибка ?
Вся проблема начинаеться во время вызова функции enterring(). Во время входящего звонка срабатывает "тревого" - как буд-то было движение ...
#include <SoftwareSerial.h> SoftwareSerial mySerial(7, 8); // RX, TX int ch = 0; String val = ""; unsigned int Relay = 4; int calibrationTime = 30; //Время, в которое был принят сигнал отсутствия движения(LOW) long unsigned int lowIn; long unsigned int pause = 5000; //Пауза, после которой движение считается оконченным boolean lockLow = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет boolean takeLowTime; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения int pirPin = 6; //вывод подключения PIR датчика void setup() { delay(2000); //время на инициализацию модуля Serial.begin(9600); //скорость порта // gsm.begin(9600); Serial.println("GSM tester v1.0"); mySerial.begin(9600); mySerial.println("AT+CLIP=1"); //включаем АОН delay(100); mySerial.println("AT+CMGF=1"); //режим кодировки СМС - обычный (для англ.) delay(100); mySerial.println("AT+CSCS=\"GSM\""); //режим кодировки текста delay(100); pinMode(Relay, OUTPUT); digitalWrite(Relay, HIGH); delay(4000); digitalWrite(pirPin, LOW); Serial.print("Calibrating"); //дадим датчику время на калибровку for (int i = 0; i < calibrationTime; i++) { Serial.print("."); delay(1000); } Serial.println("SENSOR ACTIVE"); delay(50); } void loop() { enterring(); // проверяем есть ли входящий звонок //Если обнаружено движение if (digitalRead(pirPin) == HIGH) { enterring(); // проверяем есть ли входящий звонок if (lockLow) { lockLow = false; Serial.println("Motion detected!"); ring(); } takeLowTime = true; } //Ели движения нет if (digitalRead(pirPin) == LOW) { enterring(); // проверяем есть ли входящий звонок //Если время окончания движения еще не записано if (takeLowTime) { lowIn = millis(); //Сохраним время окончания движения takeLowTime = false; //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения } //Если время без движение превышает паузу => движение окончено if (!lockLow && millis() - lowIn > pause) { //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения lockLow = true; } } } void enterring() { if (mySerial.available()) { //если GSM модуль что-то послал нам, то while (mySerial.available()) { //сохраняем входную строку в переменную val ch = mySerial.read(); val += char(ch); delay(19); } if (val.indexOf("RING") > -1) { //если звонок обнаружен, то проверяем номер delay(10); if (val.indexOf("38099059****") > -1) { //если номер звонящего наш. Serial.println("--- MASTER RING DETECTED ---"); delay(3000); mySerial.println("ATH0"); //разрываем связь digitalWrite(Relay, !digitalRead(Relay)); // инвертируем вкл/выкл реле Serial.println("ring - rele"); // выдаем сообщение } } else Serial.println(val); //печатаем в монитор порта пришедшую строку val = ""; } if (Serial.available()) { //если в мониторе порта ввели что-то while (Serial.available()) { //сохраняем строку в переменную val ch = Serial.read(); val += char(ch); delay(10); } val = ""; //очищаем } } void ring() { mySerial.println("ATD+38099059****;"); // звоним delay(14000); mySerial.println("ATH"); // ложим трубку }