не отрабатывает функция enterring - входящий звонок. Сигнализация на бале GSM m590 PIR датчика и реле.

Нет ответов
vladprogramer
Offline
Зарегистрирован: 03.09.2013

Если на модуль поступает звонок, то мы вкл/выкл реле. Если мы обнаружили движение, то мы звоним на телефон. Проблема: когда звоню на модуль, то мне телефон пишет "абонент занят", дозваниваюсь как минимум на второй а то и третий раз, и так всегда, не пойму почему. Где у меня ошибка ? 

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