"сигнализация" не правильно работает функция, не пойму где ошибка
- Войдите на сайт для отправки комментариев
Втр, 14/03/2017 - 04:27
"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"); // сбрасываем вызов
}
}
проблемы начинают именно тогда, когда я вызываю функцию enterring
проблемы начинают именно тогда, когда я вызываю функцию enterring
Не пойму, в enterring у Вас if (gsm.find("RING")) {
а где gsm может получить "RING"?
это же входящий вызво вы хотите поймать?
проблемы начинают именно тогда, когда я вызываю функцию enterring
Не пойму, в enterring у Вас if (gsm.find("RING")) {
а где gsm может получить "RING"?
это же входящий вызво вы хотите поймать?
Да все верно, это и есть условие которое находит входящий звонок. Когда на GSM модуль поступает входящий звонок, он в сериал отпрвляет "RING". Потом мы проверяем номер который звонит, можно ли ему звонить или нет, и дальше включаем или выключаем реле.
проблемы начинают именно тогда, когда я вызываю функцию enterring
Не пойму, в enterring у Вас if (gsm.find("RING")) {
а где gsm может получить "RING"?
это же входящий вызво вы хотите поймать?
Да все верно, это и есть условие которое находит входящий звонок. Когда на GSM модуль поступает входящий звонок, он в сериал отпрвляет "RING". Потом мы проверяем номер который звонит, можно ли ему звонить или нет, и дальше включаем или выключаем реле.
в каком месте кода,когда на GSM поступает звонок это обрабатывается? я не увидел.
Если Вы считаете что if (gsm.find("RING")) { этот?
в каком месте кода,когда на GSM поступает звонок это обрабатывается? я не увидел.
Если Вы считаете что if (gsm.find("RING")) { этот?
Да, это условие обрабатывает входящий звонок.
получаеться я написал не правильно условие ?
получаеться я написал не правильно условие ?
не правильно.
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(); }спасибо, буду думать .