Народ, помогайте уже весь мозг сломал, хотя только начинаю пользоваться ардуиной есть затея сделать ночную подстветку в комнатах и коридоре, что бы включалась по ходу человека, считывая движения по PIR датчикам. Для одного код нашел, немного поправил, работает, как дописать второй в loop не понимаю, не работает как бы не писал помогите дописать //Время калибровки датчика (10-60 сек. по даташиту) int calibrationTime = 30; //Время, в которое был принят сигнал отсутствия движения(LOW) long unsigned int lowIn; //Пауза, после которой движение считается оконченным long unsigned int pause = 5000; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет boolean lockLow = true; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения boolean takeLowTime; int pirPin = 2; //вывод подключения PIR датчика int pirPin1 = 3; int ledPin = 13; //вывод сигнального диода int relayPin = 5; //реле пин int relayPin1 = 7; void setup() { pinMode(pirPin, INPUT); pinMode(pirPin1, INPUT); pinMode(ledPin, OUTPUT); pinMode(relayPin, OUTPUT); pinMode(relayPin1, OUTPUT); //!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять HIGH на LOW digitalWrite(relayPin, HIGH); digitalWrite(relayPin1, HIGH); delay(4000); digitalWrite(pirPin, LOW); digitalWrite(pirPin1, LOW); //дадим датчику время на калибровку for(int i = 0; i < calibrationTime; i++) { //Во время калибровки будет мигать сигнальный диод i % 2 ? digitalWrite(ledPin, HIGH) : digitalWrite(ledPin, LOW); delay(1000); } //По окончанию калибровки зажжем сигнальный диод digitalWrite(ledPin, HIGH); delay(50); } void loop() { //Если обнаружено движение if(digitalRead(pirPin) == HIGH) { //Если до этого момента еще не включили реле if(lockLow) { lockLow = false; //Включаем реле. //!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять LOW на HIGH digitalWrite(relayPin, LOW); delay(50); } takeLowTime = true; } //Ели движения нет if(digitalRead(pirPin) == LOW) { //Если время окончания движения еще не записано if(takeLowTime) { lowIn = millis(); //Сохраним время окончания движения takeLowTime = false; //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения } //Если время без движение превышает паузу => движение окончено if(!lockLow && millis() - lowIn > pause) { //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения lockLow = true; digitalWrite(relayPin, HIGH); delay(50); } } }
если дописываю второй датчик и второе реле в лууп то они начинают тупить(((( а еще если не трудно - подскажите как дописать туда еще сенсор освещенности прошу сильно не пинать - так как пока только начинаю осваивать данное все
для датчика освещенности (фоторезистора) - я правильно понимаю что для начала его надо прописать в начале, как: int PhotoRPin = A8; //Фоторезистор (любой выход) int PhotoRValue; и потом прописать после обнаружения движения if (PhotoRValue < 500) так? или ошибаюсь, хотя надо где то прописать еще как получает PhotoRValue значения от фоторезистора, а где?
Надо отказываться от Delay() в программе. Сейчас уезжаю, на выходных не будет. Но в понедельник могу накидать код. Вообще эта задача легко решается вообще без контроллера. Если делать централизовано на одном контроллере, то придется решать проблему передачи TTL3,3V сигнала от PIR датчиков на большие расстояния. Есть варианты беспроводных PIR-датчиков, но Крона, от которых они питаются сдыхает через месяц. При современных ценниках на Arduino-Nano($2,5) проще сделать 3-4 локальных системы, в каждой из которых PIR-датчик, Arduino-Nano, 5V-реле модуль для коммутировавший нагрузки. Все на общей шине питания 12V. Шину можно рубить связкой модуля датчика освещенности+ 5V-реле модуль.
Какой PIR датчик используешь, какая ардуина и т.д и т.п. Нарисуй полную схему подключений.Эл. схему. Читай ВИКИ по чаще и поиск в инете. Функция считывания аналогового входа тут описание. Алгоритм вроде не сложный .Вошел в зону ПИР он выдаст сигнал высокого уровня HIGH включит СВЕТ, вышли из зоны он сам выключит, через установленное в нем время таймера. Можно обойтись вообще без ардуино. Фоторезистор - это хорошо. Вот так он подключается и еще. Вот один из примеров использования ПИР
используется arduino uno, но наверно переведу на nano, PIR - HC-SR501 , располагаются они не на больших расстояниях друг от друга, подсветка включается от реле. Про фоторезистор примерно понял, что его надо добавить в условие когда появляется движение и тогда же надо проверить получаемое значение освещенности на фоторезистор, если оба условия удовлетворяют - то включаем реле, так? вопрос остается в коде для двух, а может и трех PIR, как написать код что бы срабатывали реле от своего PIR? сейчас оставил один PIR все работает норм, но на одном реле.
Да, про фоторезистор правильно мыслишь. Для двух ПИР, смотря что ты задумал. А то, как то не понятно задачу описываешь. Если от одного ПИР работает нормально, то и для других делаешь тоже самое. каждый ПИР управляет своим реле и своей лампочкой, а фоторезистор у них общий.
при дописывании второго ПИР в код они срабатывают почему то через раз, я так понимаю всему виной как раз delay , и пока не могу понять как правильно переписать код
Пользуйся активно поисковиками в инете, там много примеров, иногда трудно найти то что надо. Вот к примеру, и вот. Да и тут на амперке есть примеры
код на 2 PIR в одном проце. Код (Text): #include <Timer_P.h> #define pirPin1 2 //вывод подключения PIR датчика #define pirPin2 3 #define ledPin 13 //вывод сигнального диода #define relayPin1 5 //реле пин #define relayPin2 7 //Время калибровки датчика (10-60 сек. по даташиту) int calibrationTime = 30; Timer_P PIR1_T, PIR2_T; void setup() { pinMode(pirPin1, INPUT); pinMode(pirPin2, INPUT); pinMode(ledPin, OUTPUT); pinMode(relayPin1, OUTPUT); pinMode(relayPin2, OUTPUT); //дадим датчику время на калибровку for(int i = 0; i < calibrationTime; i++) { //Во время калибровки будет мигать сигнальный диод digitalWrite(ledPin, i % 2 ? HIGH : LOW); delay(1000); } //По окончанию калибровки зажжем сигнальный диод digitalWrite(ledPin, HIGH); delay(50); } void loop() { digitalWrite(relayPin1, PIR1_T.Timer(digitalRead(pirPin1), false, 1, 20000)); digitalWrite(relayPin2, PIR2_T.Timer(digitalRead(pirPin2), false, 1, 20000)); } Если вывод заработает с инверсией, то так Код (Text): #include <Timer_P.h> #define pirPin1 2 //вывод подключения PIR датчика #define pirPin2 3 #define ledPin 13 //вывод сигнального диода #define relayPin1 5 //реле пин #define relayPin2 7 //Время калибровки датчика (10-60 сек. по даташиту) int calibrationTime = 30; Timer_P PIR1_T, PIR2_T; void setup() { pinMode(pirPin1, INPUT); pinMode(pirPin2, INPUT); pinMode(ledPin, OUTPUT); pinMode(relayPin1, OUTPUT); pinMode(relayPin2, OUTPUT); digitalWrite(relayPin1, HIGH); digitalWrite(relayPin2, HIGH); //дадим датчику время на калибровку for(int i = 0; i < calibrationTime; i++) { //Во время калибровки будет мигать сигнальный диод digitalWrite(ledPin, i % 2 ? HIGH : LOW); delay(1000); } //По окончанию калибровки зажжем сигнальный диод digitalWrite(ledPin, HIGH); delay(50); } void loop() { digitalWrite(relayPin1, !PIR1_T.Timer(digitalRead(pirPin1) , false, 1, 20000); digitalWrite(relayPin2, !PIR2_T.Timer(digitalRead(pirPin2) , false, 1, 20000); } понадобится библиотека https://yadi.sk/d/hGQy8xu1fZNks Включается при срабатывании PIR датчика и держится 20 секунд после последнего срабатывания. Но еще крайне советую сделать несколько локальных устройств в nano+PIR+реле. На крайнем в дополнение датчик освещенности и еще одно реле. Все сидит на одной шине питания 12В. Крайнее устройство рубит эту шину своим вторым реле, при высокой освещенности. Программу можно сделать универсальную для всех устройств. Каждое устройство легко умещается в обыкновенную клеммную коробку хоть для открытой, хоть для скрытой проводки