не отрабатывает функция 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"); // ложим трубку
}