Захотелось реализовать простую систему сигнализации с помощью датчика движения, gsm и ардуино, но столкнулся с небольшими трудностями, а именно: Как избавится от "пачки смс за раз" хотелось бы реализовать так: уходя ставлю на сигнализацию кнопкой дается некоторое время покинуть квартиру. Приходя снимаю с охраны нажатием кнопки, датчик движения выключается. В принципе можно повесить кнопку на разрыв питания датчика движения, но как решить проблему , что если сработал датчик пришла 1 смс, а не пачка.
завести переменную-флаг boolean isSMSsend = false, после отправки первой СМС установить её в isSMSsend = true. Перед любой отправкой проверять её состояние - если равно true, то отправку сообщения не производить. По приходу домой, либо автоматом через час, возвращать её состояние в false.
Пока пытаюсь на простом примере. но что-то не так датчик вообще не реагирует... Код (C++): int PIRPIN = 7; int PIRPINPIT = 6; int LDpin = 13; int calibrationTime = 15; boolean flag = false; void setup() { Serial.begin(9600); pinMode(PIRPIN, INPUT); pinMode(PIRPINPIT, OUTPUT); pinMode(LDpin,OUTPUT); digitalWrite(PIRPIN, LOW); digitalWrite(PIRPINPIT, HIGH); //дадим датчику время на калибровку Serial.print("calibrating sensor "); for(int i = 0; i < calibrationTime; i++){ Serial.print("."); delay(1000); } Serial.println(" done"); delay(50); } void loop() { if (flag = false) { int pirVal = digitalRead(PIRPIN); //Если обнаружили движение if(pirVal == HIGH) { Serial.println("SENSOR ACTIVE"); digitalWrite(LDpin, HIGH); delay(2000); } else { digitalWrite(LDpin,LOW); }flag = true;} }
если отбросить все внутренние блоки, то получается: Код (C++): void loop() { if (flag = false) { ... flag = true; } } Поэтому и не работает.
А почему приходит пачка СМС?Если бы была кнопка можно было бы грешить на дребезг контактов.Попробуйте так Код (C++): //Если обнаружили движение if(pirVal == HIGH) { delay(50); //немного потупим Serial.println("SENSOR ACTIVE"); digitalWrite(LDpin, HIGH); delay(2000); }
Я вообще сделал задержку при сработке секунд на 10, за которые нужно успеть нажать кнопку в заданном месте. А при сработке на воришку приходит 1 смс сразу и потом раз в заданное кол-во минут. Правда у меня смс-модуль другой.
пачка приходит потому что: Если сработал датчик - отправить смс. и получается что если у нас воришка то датчик будет срабатывать несколько раз соответственно и смс несколько, хотелось бы: Постановка на сигнализацию секунд 20 на то, что бы уйти из дома, если воришка, то подождать немного (вдруг пришел хозяин и не успел нажать кнопку дезактивации) засечь движение отправить 1 смс и подождать несколько минут, что бы проверить снова. Я вот думаю, мб это лучше на чем то другом организовать, например на дальномере.... что-то сильно заморочено с датчиком движения.
Доброго времени суток! Решил попробовать сделать на ультозвуковом дальномере, так даже лучше, но не могу сообразить как его снять с охраны) т.е ставлю на охрану кнопкой и он работает, снимать планирую рфид меткой, но как его программно остановить, что бы он не мерил расстояние, подскажите пожалуйста
Да кода пока особо нет, все собрано на простом примере. Код (C++): #include "Ultrasonic.h" // sensor connected to: // Trig - 12, Echo - 13 Ultrasonic ultrasonic(12, 13); int led = 11; void setup() { Serial.begin(9600); pinMode (led, OUTPUT); // start the serial port } void loop() { int dist_cm = ultrasonic.Ranging(CM); // get distance Serial.println(dist_cm); // print the distance delay(100); if (dist_cm < 100) {digitalWrite(led, HIGH); delay(2000); digitalWrite(led, LOW);// arbitary wait time. }} Задача в его отключение. Что бы я пришел домой приложил карточку и Дальномер выключился програмно, вот что мне нужно. Физически я проверял, если выключить на него питание то светодиод (он же имитирует смску) начинает постоянно моргать... если скинуть землю то он продолжает нормально мерить расстояние и срабатывает то же самое с ногами триг и эхо, по одной выдергиваю он мерит расстояние, сразу оба - светодиод моргает... Проблема именно не в выключение его карточкой, а именно отключение САМОГО модуля, надеюсь вы поняли меня
Что мешает взять процедуру замера расстояния в if и выполнять ее либо игнорировать по условию? Сделайте флаг, который принимает true в рабочем положении и false если режим не рабочий.
Объяви переменную, например boolean AlowAlarm=false. Далее ставишь на охрану: AlowAlarm=true. В коде пишешь нечто подобное: Код (C++): if ( AlowAlarm ) { int dist_cm = ultrasonic.Ranging(CM); // get distance Serial.println(dist_cm); // print the distance delay(100); if (dist_cm < 100) {digitalWrite(led, HIGH); delay(2000); digitalWrite(led, LOW);// arbitary wait time. } Когда снял с охраны, то AlowAlarm = false. Все.