Как установить таймеры, используя миллисекунды на 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);
     }

}

}

, 👍0

Обсуждение

@jsotola попробую переписать первый код из if(digitalRead(pirPin) == HIGH){ digitalWrite (ledPin, ВЫСОКИЙ); Пирон = (миллис()/1000)/60; } если ((текущий Миллис - Пирон) > 1) { digitalWrite (светодиодный контакт, НИЗКИЙ); } to digitalWrite (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


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);
      }
   }
}
,

большое спасибо!! хотя я сделал некоторые изменения в этом коде и поместил пирс и светодиоды в разные петли . я наконец понял. еще раз спасибо, я очень ценю это. :D, @ann