No luck as of yet. I did try adding a delay(200); but that delayed everything...yikes
The Good.
What works so far is:
ldr senses light and only when at or below minlight does ledPin1 fade on and off continuous until daylight.
pir senses motion and only if ldr is HIGH, it turns ledPins2,3,4,5 HIGH
when pir does not sense motion ledPins2,3,4,5 & go LOW & ledPin1 continues High (fade) unless its light out
The Bad.
Having trouble with:
at the point when the pir senses motion, i want only ledPins2&3 go HIGH
and IF the pir continues to sense motion after 5 seconds, turn ledPins4&5 HIGH
I attached the code that has a delay in it, but it doesn't work.
/*
This example shows the output of an analogRead() of a Photocell.
By M.Gonzalez
www.codingcolor.com
The example code is in the public domain
*/
int photocellPin = 0;// Photocell connected to analog pin 0
int photocellVal = A0; // define photocell variable
int pirVal = LOW;// motion sensor variable
int ledState = 0;//state of the led
int minLight = 20;//min light threshold
int maxLight = 20;//max light threshold
//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
int calibrationTime = 30;
//the time when the sensor outputs a low impulse
unsigned long lowIn;
//the amount of milliseconds the sensor has to be low
//before we assume all motion has stopped
unsigned long pause = 5000UL;
boolean lockLow = true;
boolean takeLowTime;
int pirPin = 2; //the digital pin connected to the PIR sensor's output
int ledPin1 = 3;
int ledPin2 = 4;
int ledPin3 = 5;
int ledPin4 = 6;
int ledPin5 = 7;
void setup() {
Serial.begin(9600);
pinMode(photocellPin, INPUT);
pinMode(pirPin, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(ledPin5, OUTPUT);
//give the sensor some time to calibrate
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() {
photocellVal = analogRead(photocellPin);
pirVal = digitalRead(pirPin);
if (photocellVal < minLight && ledState == 0){
// fade in from min to max in increments of 5 points:
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// sets the value (range from 0 to 255):
analogWrite(ledPin1, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
if (pirVal == HIGH) {
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, HIGH);
delay(200);
digitalWrite(ledPin4, HIGH);
digitalWrite(ledPin5, HIGH);}
if(lockLow){
//makes sure we wait for a transition to LOW before any further output is made:
lockLow = false;
Serial.println("---");
Serial.print("motion detected at ");
Serial.print(millis()/1000);
Serial.println(" sec");
delay(50);
}
takeLowTime = true;
}
//Serial.println("fade up");
}
if(pirVal == LOW)
{
digitalWrite(ledPin1, LOW); //the led visualizes the sensors output pin state
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
digitalWrite(ledPin5, LOW);
if(takeLowTime){
lowIn = millis(); //save the time of the transition from high to LOW
takeLowTime = false; //make sure this is only done at the start of a LOW phase
}
//if the sensor is low for more than the given pause,
//we assume that no more motion is going to happen
if(!lockLow && millis() - lowIn > pause){
//makes sure this block of code is only executed again after
//a new motion sequence has been detected
lockLow = true;
Serial.print("motion ended at "); //output
Serial.print((millis() - pause)/1000);
Serial.println(" sec");
delay(50);
}
}
}