Как установить таймеры, используя миллисекунды на 3 датчиках PIR?
Я хочу, чтобы датчики PIR оставались включенными примерно на 1 минуту. Я нашел код, который может сделать это для 1 PIR, но я не знаю, как применить код для 3 PIR.
Вот код для 1 PIR с таймером, использующим millis
:
int ledPin = 8;
int pirPin = 3;
unsigned long piron;
//время, которое мы даем датчику на калибровку (10-60 сек по даташиту)
int calibrationTime = 10;
int off;
int on;
const int LDR = A0;
int ldrStatus;
unsigned long currentMillis =( millis()/1000 ) / 60;
//////////////////////////////
//НАСТРАИВАТЬ
void setup(){
Serial.begin(9600);
pinMode(pirPin, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(pirPin, LOW);
// даем датчику время на калибровку
Serial.print("calibrating sensor ");
for(int i = 0; i < calibrationTime; i++){
Serial.print(".");
delay(1000);
}
Serial.println(" done");
Serial.println("SENSOR ACTIVE");
delay(50);
}
/////////////////////////////
//ПЕТЛЯ
void loop()
{
ldrStatus = analogRead (LDR);
if (ldrStatus <= 700) // чтение переменной(ldrStatus) согласно ldr
// чем выше значение(ldrStatus), тем тусклее свет
// чем ниже значение (ldrStatus), тем ярче свет
{
analogRead (pirPin) == off;
Serial.println ("Its SUNNY DAY !!!");
digitalWrite(ledPin, LOW);
}
if (ldrStatus >= 700)
{
Serial.println ("Its DARK already");
if(digitalRead(pirPin) == HIGH){
digitalWrite (ledPin, HIGH);
piron = ( millis()/1000 ) / 60;
}
if ((currentMillis - piron) > 1) {
digitalWrite(ledPin, LOW);
}
}
}
`
and here is the code for 3 PIRs without the timer
int calibrationTime = 10;
int pirPin = 3;
int ledPin = 8;
int pirPin1 = 4;
int ledPin1 = 9;
int pirPin2 = 5;
int ledPin2 = 10;
int ledPin3 = 11;
int off;
int on;
const int LDR = A0;
int ldrStatus;
//////////////////////////////
//НАСТРАИВАТЬ
void setup(){
Serial.begin(9600);
pinMode(pirPin, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(pirPin, LOW);
pinMode(pirPin1, INPUT);
pinMode(ledPin1, OUTPUT);
digitalWrite(pirPin1, LOW);
pinMode(pirPin2, INPUT);
pinMode(ledPin2, OUTPUT);
digitalWrite(pirPin2, LOW);
pinMode (ledPin3, OUTPUT);
// даем датчику время на калибровку
Serial.print("calibrating sensor ");
for(int i = 0; i < calibrationTime; i++){
Serial.print(".");
delay(1000);
}
Serial.println(" done");
Serial.println("SENSOR ACTIVE");
delay(50);
}
/////////////////////////////
//ПЕТЛЯ
void loop()
{
ldrStatus = analogRead (LDR);
if (ldrStatus <= 700) // чтение переменной(ldrStatus) согласно ldr
// чем выше значение(ldrStatus), тем тусклее свет
// чем ниже значение (ldrStatus), тем ярче свет
{
analogRead (pirPin) == off;
analogRead (pirPin1) == off;
analogRead (pirPin2) == off;
Serial.println ("Its SUNNY DAY !!!");
digitalWrite(ledPin, LOW);
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
}
if (ldrStatus >= 700)
{
Serial.println ("Its DARK already");
digitalWrite(ledPin3, HIGH);
if(digitalRead(pirPin) == HIGH && digitalRead(pirPin1)== LOW && digitalRead(pirPin2) == LOW){
digitalWrite (ledPin, HIGH);
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2,LOW);
}
if(digitalRead(pirPin) == LOW && digitalRead(pirPin1)== HIGH && digitalRead(pirPin2) == LOW){
digitalWrite (ledPin1, HIGH);
digitalWrite (ledPin, LOW);
digitalWrite(ledPin2,LOW);
}
if(digitalRead(pirPin) == LOW && digitalRead(pirPin1)== LOW && digitalRead(pirPin2) == HIGH){
digitalWrite (ledPin2, HIGH);
digitalWrite (ledPin1, LOW);
digitalWrite (ledPin, LOW);
}
if(digitalRead(pirPin) == HIGH && digitalRead(pirPin1)== HIGH && digitalRead(pirPin2) == LOW){
digitalWrite (ledPin1, HIGH);
digitalWrite (ledPin, HIGH);
digitalWrite (ledPin2, LOW);
}
if(digitalRead(pirPin) == HIGH && digitalRead(pirPin1)== LOW && digitalRead(pirPin2) == HIGH){
digitalWrite (ledPin, HIGH);
digitalWrite (ledPin2, HIGH);
digitalWrite (ledPin1, LOW);
}
if(digitalRead(pirPin) == LOW && digitalRead(pirPin1)== HIGH && digitalRead(pirPin2) == HIGH){
digitalWrite (ledPin2, HIGH);
digitalWrite (ledPin1, HIGH);
digitalWrite (ledPin, LOW);
}
if(digitalRead(pirPin) == HIGH && digitalRead(pirPin1)== HIGH && digitalRead(pirPin2) == HIGH){
digitalWrite (ledPin2, HIGH);
digitalWrite (ledPin1, HIGH);
digitalWrite (ledPin, HIGH);
}
if(digitalRead(pirPin) == LOW && digitalRead(pirPin1)== LOW && digitalRead(pirPin2) == LOW){
digitalWrite (ledPin2, LOW);
digitalWrite (ledPin1, LOW);
digitalWrite (ledPin, LOW);
}
}
}
@ann, 👍0
Обсуждение1 ответ
Лучший ответ:
▲ 1
Это не полный ответ, а идея того, как выполнить задачу.
Я просто набрал его, не проверяя код.
Используйте массивы для хранения переменных. Таким образом, можно использовать контур для обслуживания трех датчиков и трех светодиодов.
for (i = 0; i<3; i++) {
currentTime = millis(); // сохранить текущее значение millis()
if (digitalRead(pirPin[i]) == HIGH) { // проверяем, обнаруживает ли PIR движение
trigTime[i] = millis(); // сохранить время срабатывания
trig[i] = true; // устанавливаем переменную состояния, которая указывает
} // что сработал триггер
if (trig[i]) { // если сработал триггер
if (currentTime - trigTime[i] < 50000) { // меньше 50 секунд с момента последнего движения?
digitalWrite (ledPin[i], HIGH);
}
else {
trig[i] = false; // 50-секундный таймер истек
digitalWrite (ledPin[i], LOW);
}
}
}
,
@jsotola
большое спасибо!! хотя я сделал некоторые изменения в этом коде и поместил пирс и светодиоды в разные петли . я наконец понял. еще раз спасибо, я очень ценю это. :D, @ann
Смотрите также:
- Количество мигающих светодиодов с датчиком LDR
- KY-022 ИК-приемник, светодиод всегда горит, нет выхода
- Кнопка переключения переключает между операторами обращения с разблокированием кнопки
- Как запустить 4 светодиода последовательно на основе кнопочного входа?
- Как написать скрипт, если датчик воды контактирует с водой более 2 минут и загорается светодиод
- Схемы мигания светодиодов с несколькими светодиодами с помощью millis() без использования Delay()
- Игнорирование первого высокого выходного сигнала датчика
- Как игнорировать датчик, срабатывающий в первый раз, и начать запись в миллисекундах при втором срабатывании
@jsotola попробую переписать первый код из
if(digitalRead(pirPin) == HIGH){ digitalWrite (ledPin, ВЫСОКИЙ); Пирон = (миллис()/1000)/60; } если ((текущий Миллис - Пирон) > 1) { digitalWrite (светодиодный контакт, НИЗКИЙ); }
todigitalWrite (ledPin, digitalRead (pirPin)); Пирон = (миллис()/1000)/60; если ((текущий Миллис - Пирон) > 1) { digitalWrite (светодиодный контакт, НИЗКИЙ); }
но, похоже, он игнорирует таймер или я неправильно пишу код, @annи спасибо! теперь я знаю, что мне не нужно использовать
if
:), @annХорошо, я попытался изменить этот код на 50 секунд
digitalWrite(ledPin, digitalRead(pirPin)); Пирон = миллис(); текущийМиллис = Миллис(); если ((текущий Миллис - Пирон) > 50000) { digitalWrite(ledPin, !digitalRead(pirPin)); startMillis = currentMillis;
но таймер по-прежнему не работает. Светодиод гаснет примерно через 3 секунды...., @annМожете ли вы привести пример? извините, что задаю слишком много вопросов... я все еще новичок в этом., @ann
это означает, что pir on = светодиод включен, я хочу включить светодиод с помощью pir, и через 1 минуту светодиод автоматически выключится., @ann
в вашем вопросе по-прежнему говорится: «заставьте PIR оставаться включенными примерно на 1 минуту».... пожалуйста, отредактируйте вопрос и удалите комментарий, @jsotola