"сигнализация" не правильно работает функция, не пойму где ошибка

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

"GSM сигналиция".

Если (PIR) датчик движения обнаружил активность, то мы звоним на телефон("тревога"), если я звоню на GSM модуль(M590) то включаем или отключаем реле.

Проблема: когда я звоню на GSM модуль должно сработать только реле, а срабатывает одновременно реле вместе PIR датчиком, как буд-то было ещё и движение... помогите исправить ошибку в коде. За ранее спасибо

P.S. По отдельности все модули работают стабильно. За основу была взята эта статья http://zelectro.cc/PIR_sensor.

#include <SoftwareSerial.h>
int val = 0;
SoftwareSerial gsm(7, 8); // TX, RX
unsigned int Relay = 4;
int calibrationTime = 30;
//Время, в которое был принят сигнал отсутствия движения(LOW)
long unsigned int lowIn;

//Пауза, после которой движение считается оконченным
long unsigned int pause = 5000;

//Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean lockLow = true;
//Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
boolean takeLowTime;

int pirPin = 6;    //вывод подключения PIR датчика
int ledPin = 13;   //вывод сигнального диода
int relayPin = 4;  //реле пин

void setup()
{
  Serial.begin(9600);
  gsm.begin(9600);
  pinMode(pirPin, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(relayPin, OUTPUT);


  digitalWrite(relayPin, 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()
{
  //Если обнаружено движение
  if (digitalRead(pirPin) == HIGH)
  {
    enterring();  // проверяем нету ли входящего звонка 
    
    if (lockLow)
    {
      lockLow = false;
      Serial.print("Motion ");
      ring(); //звоним на телефон "тревога" 
      delay(50);
    }
    takeLowTime = true;
  }

  //Ели движения нет
  if (digitalRead(pirPin) == LOW)
  {
    enterring(); //проверяем нету ли входящего звонка 
    //Если время окончания движения еще не записано
    if (takeLowTime)
    {
      lowIn = millis();          //Сохраним время окончания движения
      takeLowTime = false;       //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
    }
    //Если время без движение превышает паузу => движение окончено
    if (!lockLow && millis() - lowIn > pause)
    {
      //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
      lockLow = true;

    }
  }
}




void ring() {
  gsm.println("ATD+38099059****;");
  delay(14000);
  gsm.println("ATH");
}



void enterring() {
  if (gsm.find("RING")) {
      Serial.println("RING!");
      gsm.println("AT+CLIP=1"); // включаем АОН,
      while (1) { // в цикле
        if (gsm.find("38099059****") || ("38050204****") || ("38097669***")) { // ищем номер телефона с которого звонили на модуль, если нашли
          digitalWrite(Relay, !digitalRead(Relay)); // инвертируем выход. вкл/выкл  реле
          Serial.println("ring - rele"); // выдаем сообщение
          break; // и выходим
        }
       
        else { // иначе
          gsm.println("AT+CPAS"); // спрашиваем состояние модема
          delay(100);
          if (gsm.find("+CPAS: 0")) break; // и если он в «готовности», выходим из цикла
        } // если звонок в процессе, возвращает +CPAS: 3
      } // и крутимся дальше
      gsm.println("AT+CLIP=0"); // выключаем АОН,
      delay(100);
      gsm.println("ATH0"); // сбрасываем вызов
  }
}

 

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

проблемы начинают именно тогда, когда я вызываю функцию enterring 

obuhanoe
Offline
Зарегистрирован: 18.05.2016

vladprogramer пишет:

проблемы начинают именно тогда, когда я вызываю функцию enterring 

Не пойму, в  enterring у Вас if (gsm.find("RING")) {

а где gsm может получить "RING"? 

это же входящий вызво вы хотите поймать?

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

obuhanoe пишет:

vladprogramer пишет:

проблемы начинают именно тогда, когда я вызываю функцию enterring 

Не пойму, в  enterring у Вас if (gsm.find("RING")) {

а где gsm может получить "RING"? 

это же входящий вызво вы хотите поймать?

Да все верно, это и есть условие которое находит входящий звонок. Когда на GSM модуль поступает входящий звонок, он в сериал отпрвляет "RING". Потом мы проверяем номер который звонит, можно ли ему звонить или нет, и дальше включаем или выключаем реле. 

obuhanoe
Offline
Зарегистрирован: 18.05.2016

vladprogramer пишет:

obuhanoe пишет:

vladprogramer пишет:

проблемы начинают именно тогда, когда я вызываю функцию enterring 

Не пойму, в  enterring у Вас if (gsm.find("RING")) {

а где gsm может получить "RING"? 

это же входящий вызво вы хотите поймать?

Да все верно, это и есть условие которое находит входящий звонок. Когда на GSM модуль поступает входящий звонок, он в сериал отпрвляет "RING". Потом мы проверяем номер который звонит, можно ли ему звонить или нет, и дальше включаем или выключаем реле. 

в каком месте кода,когда на GSM поступает звонок это обрабатывается? я не увидел.

Если Вы считаете что if (gsm.find("RING")) {  этот? 

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

Цитата:

в каком месте кода,когда на GSM поступает звонок это обрабатывается? я не увидел.

Если Вы считаете что if (gsm.find("RING")) {  этот? 

Да, это условие обрабатывает входящий звонок. 

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

получаеться я написал не правильно условие ? 

obuhanoe
Offline
Зарегистрирован: 18.05.2016

vladprogramer пишет:

получаеться я написал не правильно условие ? 

не правильно.


void read_buffer(){


    String currStr = "";
    char currSymb; 
  
    if (!gsm.available())
       return;

   
  while (gsm.available()) {
     currSymb = gsm.read();    
     if ('\r' == currSymb) {         

         if (currStr.startsWith("+RING")) { // этот пример для sim800l, для M590 возможно придется переделать                       
              // ВХОДЯЩИЙ вызов
		 }		 
        
       currStr = "";
       
     } else if ('\n' != currSymb) {
         currStr += String(currSymb);
       }
       
   delay(10);
  }    
    
}

void loop() {
   
   read_buffer();

} 

 

 

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

спасибо, буду думать .