Hi I am trying to eventually make an array of 16 PIR sensors triggering 16 relays at random. Right now I am trying to figure out how do it with 3 PIR sensors and a 8 relay module on an atmega2560. My sketch is able to see PIR sensors 1 and 2 but it is unable to detect 3.
Here is a video of the code in action:
https://vimeo.com/785091848
Here is the code:
const int pir1Pin = 2;
const int pir2Pin = 3;
const int pir3Pin = 4;
const int relay1Pin = 5;
const int relay2Pin = 6;
const int relay3Pin = 7;
const int relay4Pin = 8;
const int relay5Pin = 9;
const int relay6Pin = 10;
const int relay7Pin = 11;
const int relay8Pin = 12;
unsigned long lastPir1Time = 0;
unsigned long lastPir2Time = 0;
unsigned long lastPir3Time = 0;
int relayState[8] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW};
unsigned long relayLastChangeTime[8] = {0, 0, 0, 0, 0, 0, 0, 0};
char relayString[4];
void setup() {
pinMode(pir1Pin, INPUT);
pinMode(pir2Pin, INPUT);
pinMode(pir3Pin, INPUT);
pinMode(relay1Pin, OUTPUT);
pinMode(relay2Pin, OUTPUT);
pinMode(relay3Pin, OUTPUT);
pinMode(relay4Pin, OUTPUT);
pinMode(relay5Pin, OUTPUT);
pinMode(relay6Pin, OUTPUT);
pinMode(relay7Pin, OUTPUT);
pinMode(relay8Pin, OUTPUT);
Serial.begin(9600);
randomSeed(analogRead(A0));
attachInterrupt(digitalPinToInterrupt(pir1Pin), handlePir1Interrupt, CHANGE);
attachInterrupt(digitalPinToInterrupt(pir2Pin), handlePir2Interrupt, CHANGE);
attachInterrupt(digitalPinToInterrupt(pir3Pin), handlePir3Interrupt, CHANGE);
}
void loop() {
for (int i = 0; i < 8; i++) {
if (millis() - relayLastChangeTime[i] > 1000) {
digitalWrite(i + 5, LOW);
relayState[i] = LOW;
relayLastChangeTime[i] = millis();
}
}
}
// Interrupt service routine for PIR 1
void handlePir1Interrupt() {
if (digitalRead(pir1Pin) == HIGH) {
int relayToTurnOn = random(8);
digitalWrite(relayToTurnOn + 5, HIGH);
relayState[relayToTurnOn] = HIGH;
relayLastChangeTime[relayToTurnOn] = millis();
sprintf(relayString, "%d", relayToTurnOn + 1);
Serial.println("PIR 1 triggered, turning on relay " + String(relayString));
}
}
// Interrupt service routine for PIR 2
void handlePir2Interrupt() {
if (digitalRead(pir2Pin) == HIGH) {
int relayToTurnOn = random(8);
digitalWrite(relayToTurnOn + 5, HIGH);
relayState[relayToTurnOn] = HIGH;
relayLastChangeTime[relayToTurnOn] = millis();
sprintf(relayString, "%d", relayToTurnOn + 1);
Serial.println("PIR 2 triggered, turning on relay " + String(relayString));
}
}
// Interrupt service routine for PIR 3
void handlePir3Interrupt() {
if (digitalRead(pir3Pin) == HIGH) {
int relayToTurnOn = random(8);
digitalWrite(relayToTurnOn + 5, HIGH);
relayState[relayToTurnOn] = HIGH;
relayLastChangeTime[relayToTurnOn] = millis();
sprintf(relayString, "%d", relayToTurnOn + 1);
Serial.println("PIR 3 triggered, turning on relay " + String(relayString));
}
}
Sketch of the schematic. PIR sensors are powered with an external power supply: