"сигнализация" не правильно работает функция, не пойму где ошибка
- Войдите на сайт для отправки комментариев
Втр, 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")) { этот?
Да, это условие обрабатывает входящий звонок.
получаеться я написал не правильно условие ?
получаеться я написал не правильно условие ?
не правильно.
спасибо, буду думать .