int ledPins[8] = {2,3,4,5,6,7,8,9};
int PIRPin = 12; // input pin (for PIR sensor)
int pirState = LOW; // we start, assuming no motion detected
int PIRval = 0; // variable for reading the pin status
int NumOfLEDs = 6; // Number of LEDs.. change if you add more
int OnceOrTwice;
int PotVal;
int Ctr;
long LEDval;
long randNumber;
unsigned long TimeToAllOn;
void setup() {
int index;
pinMode(PIRPin, INPUT); // declare Motion Sensor as input
pinMode(A0, INPUT); // declare Potentiometer as input
randomSeed(analogRead(1));
Serial.begin(9600);
for(index = 0; index <= (NumOfLEDs- 1); index++) {
pinMode(ledPins[index],OUTPUT);
// ledPins[index] is replaced by the value in the array.
// For example, ledPins[0] is 2
}
}
// the loop function runs over and over again forever
void loop() {
float delayTimer; // declare floating point variable for Delay (.5 to 2.5)
int val = analogRead(A0); // read Potentiometer (0 thru 1023)
val = 250;
delayTimer = map(val, 0, 1023, 50, 250); // re-map Pot input (val) to delayTimer (50 thru 250)
delayTimer = delayTimer / 100.00; // divide by 100 to get decimal points
// Serial.print(val);
// Serial.println(delayTimer);
PIRval = digitalRead(PIRPin); // read input value of PIR Motion Sensor
if (PIRval == HIGH) { // check if the input is HIGH (motion detected)
if (pirState == LOW) { // motion was just detected this time
// Serial.println("Motion detected!");
pirState = HIGH;
}
randomOnLED(); // Randomly turn ON all LEDs
// TimeToAllOn = millis();
// Serial.print("ALL ON in ");
// Serial.println(TimeToAllOn / 1000.0, 3);
Serial.end();
randomBlinkLED(); // Randomly blink an LED
} else {
if (pirState == HIGH) {
// Serial.println("Motion ended!");
pirState = LOW;
randomOffLED(); // Randomly turn OFF all LEDs
}
}
}
/*
randomOnLED()
Randomly turn on LEDs
First, check to see if the selected one is already on.
If it is, decrement the counter and try another random one
*/
void randomOnLED() {
int Ctr;
int randNumber;
float delayTimer; // declare floating point variable for Delay (.5 to 2.5)
int val = analogRead(A0); // read Potentiometer (0 thru 1023)
val = 250;
delayTimer = map(val, 0, 1023, 50, 250); // re-map Pot input (val) to delayTimer (50 thru 250)
delayTimer = delayTimer / 100.00; // divide by 100 to get decimal points
Ctr = 1;
// Serial.begin(9600);
while (Ctr < (NumOfLEDs + 1)) {
randNumber = random(NumOfLEDs); // generate a random number for an LED to turn ON
// Check the status of a randomly selected LED
// If its already ON, try again
//
LEDval = digitalRead(ledPins[randNumber]);
// Serial.println(LEDval);
// Serial.println(randNumber);
if (LEDval == HIGH) { // LED is already on. Lower the Ctr by one and try again.
Ctr--;
// Serial.println("ON");
}
if (LEDval == LOW) {
// Serial.print("Turning ON "); Serial.println(ledPins[randNumber]);
// Serial.print(val);
// Serial.print(" ");
// Serial.println(delayTimer);
digitalWrite(ledPins[randNumber], HIGH); // turn the LED on (HIGH is the voltage level)
delay(delayTimer * randNumber * 500); // wait for a random time
}
Ctr++;
// Serial.println(Ctr);
}
}
/*
randomBlinkLED()
*/
void randomBlinkLED() {
int i;
int Ctr;
int randNumber;
int RndNum2;
Ctr = 1;
Serial.begin(9600);
while (PIRval == HIGH) { // While motion is still detected, do this
randNumber = random(NumOfLEDs); // generate a random number from 0 to (Number of LEDs - 1)
RndNum2 = random(5); // random number to change DELAY times
OnceOrTwice = random(1, 3); // randomly select to blink ONCE or TWICE
delay(RndNum2 * 250); // wait for a random time before staring to blink an LED
// Serial.print("Pin #");
// Serial.print(ledPins[randNumber]);
// Serial.print(", Blink ");
// Serial.print(OnceOrTwice);
// Serial.println(" time(s)");
// Cause a randomly selected LED to blink
for (i = 1; i <= OnceOrTwice; i++) {
digitalWrite(ledPins[randNumber], LOW); // turn the LED off
delay(i * 200); // wait
digitalWrite(ledPins[randNumber], HIGH); // turn the LED back on
delay(RndNum2 * 400);
}
PIRval = digitalRead(PIRPin); // read the Motion Sensor again
Ctr++;
}
}
/*
randomOffLED()
*/
void randomOffLED() {
int Ctr;
int randNumber;
float delayTimer; // declare floating point variable for Delay (.5 to 2.5)
int val = analogRead(A0); // read Potentiometer (0 thru 1023)
val = 1023;
delayTimer = map(val, 0, 1023, 50, 250); // re-map Pot input (val) to delayTimer (50 thru 250)
delayTimer = delayTimer / 100.00; // divide by 100 to get decimal points
Ctr = 1;
// Serial.begin(9600);
while (Ctr < (NumOfLEDs + 1)) {
randNumber = random(NumOfLEDs); // generate a random number for an LED to turn OFF
// Check the status of a randomly selected LED
// If its already OFF, try again
// Serial.println(ledPins[randNumber]);
LEDval = digitalRead(ledPins[randNumber]);
// Serial.println(LEDval);
// Serial.println(randNumber);
if (LEDval == LOW) { // LED is already off. Lower the Ctr by one and try again.
Ctr--;
// Serial.println("ON");
}
if (LEDval == HIGH) {
// Serial.print("Turning OFF "); Serial.println(ledPins[randNumber]);
// Serial.print(val);
// Serial.print(" ");
// Serial.println(delayTimer);
digitalWrite(ledPins[randNumber], LOW); // turn the LED off (LOW is the voltage level)
delay(delayTimer * randNumber * 500); // wait
}
Ctr++;
// Serial.println(Ctr);
}
}