#include <Adafruit_NeoPixel.h>
#define PIN 6 // Neopixelek csatlakoztatására használt Arduino láb
#define NUMPIXELS 16 // Neopixel LED-ek száma// Sensor pin definitions
#define LDR_PIN A0 //Ambient light sensor on Analaog 0 pin
const int sensor1A = 2; // First sensor at Point A pin 2
const int sensor1B = 4; // Second sensor at Point A pin 4
const int sensor2A = 3; // First sensor at Point B pin 3
const int sensor2B = 5; // Second sensor at Point B pin 5
// Counter for the number of objects in the area
int objectsInArea = 0;
// Variable for ambient light
int lightState = 0; // 0 = sötét, 1 = közepes, 2 = világos
// Timing variables
unsigned long lastTime1A = 0;
unsigned long lastTime1B = 0;
unsigned long lastTime2A = 0;
unsigned long lastTime2B = 0;
unsigned long lastMotionTime = 0;
const unsigned long timeout = 500; // 500 milliseconds to complete passage
const unsigned long resetTimeout = 5000; // 5 seconds to reset counter
// State tracking for each sensor
bool lastState1A = LOW;
bool lastState1B = LOW;
bool lastState2A = LOW;
bool lastState2B = LOW;
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
pixels.begin(); // Neopixel objektum inicializálása
pixels.show();
// Initialize sensor pins as inputs
pinMode(sensor1A, INPUT);
pinMode(sensor1B, INPUT);
pinMode(sensor2A, INPUT);
pinMode(sensor2B, INPUT);
// Start the serial communication
Serial.begin(9600);
}
void loop() {
// Read sensor states
bool currentState1A = digitalRead(sensor1A);
bool currentState1B = digitalRead(sensor1B);
bool currentState2A = digitalRead(sensor2A);
bool currentState2B = digitalRead(sensor2B);
unsigned long currentTime = millis();
int ldrValue = analogRead(LDR_PIN);
// Három tartomány meghatározása az LDR értékei alapján
if (ldrValue < 341) {
lightState = 0; // Sötét állapot
} else if (ldrValue < 682) {
lightState = 1; // Közepes állapot
} else {
lightState = 2; // Világos állapot
}
// Detect object entering the area from A to B
if (lastState1A == LOW && currentState1A == HIGH) {
lastTime1A = currentTime;
lastMotionTime = currentTime;
}
if (lastState1B == LOW && currentState1B == HIGH && (currentTime - lastTime1A) < timeout) {
objectsInArea++;
lastTime1A = 0; // Reset the timer
lastMotionTime = currentTime;
Serial.print("Objects in area: ");
Serial.println(objectsInArea);
Serial.println("Entry at A");
if (objectsInArea <= 1) {
for(int i=NUMPIXELS-1; i>=0; i--) {
for(int brightness = 0; brightness <= 255; brightness++) {
pixels.setPixelColor(i, pixels.Color(brightness, brightness, brightness));
pixels.show();
}
}
}
}
// Detect object entering the area from B to A
if (lastState2A == LOW && currentState2A == HIGH) {
lastTime2A = currentTime;
lastMotionTime = currentTime;
}
if (lastState2B == LOW && currentState2B == HIGH && (currentTime - lastTime2A) < timeout) {
objectsInArea++;
lastTime2A = 0; // Reset the timer
lastMotionTime = currentTime;
Serial.print("Objects in area: ");
Serial.println(objectsInArea);
Serial.println("Entry at B");
if (objectsInArea <= 1) {
for(int i=0; i<NUMPIXELS; i++) {
for(int brightness = 0; brightness <= 255; brightness++) {
pixels.setPixelColor(i, pixels.Color(brightness, brightness, brightness));
pixels.show();
}
}
}
}
// Detect object leaving the area from B to A
if (lastState2B == LOW && currentState2B == HIGH) {
lastTime2B = currentTime;
lastMotionTime = currentTime;
}
if (lastState2A == LOW && currentState2A == HIGH && (currentTime - lastTime2B) < timeout) {
objectsInArea--;
lastTime2B = 0; // Reset the timer
lastMotionTime = currentTime;
Serial.print("Objects in area: ");
Serial.println(objectsInArea);
Serial.println("Exit at B");
if (objectsInArea < 1) {
for(int i=NUMPIXELS-1; i>=0; i--) {
for(int brightness = 255; brightness >= 0; brightness--) {
pixels.setPixelColor(i, pixels.Color(brightness, brightness, brightness));
pixels.show();
}
}
}
}
// Detect object leaving the area from A to B
if (lastState1B == LOW && currentState1B == HIGH) {
lastTime1B = currentTime;
lastMotionTime = currentTime;
}
if (lastState1A == LOW && currentState1A == HIGH && (currentTime - lastTime1B) < timeout) {
objectsInArea--;
lastTime1B = 0; // Reset the timer
lastMotionTime = currentTime;
Serial.print("Objects in area: ");
Serial.println(objectsInArea);
Serial.println("Exit at A");
if (objectsInArea < 1) {
for(int i=0; i<NUMPIXELS; i++) {
for(int brightness = 255; brightness >= 0; brightness--) {
pixels.setPixelColor(i, pixels.Color(brightness, brightness, brightness));
pixels.show();
}
}
}
}
// Reset counter if no motion detected for resetTimeout duration
if (objectsInArea != 0) {
if (currentTime - lastMotionTime > resetTimeout) {
objectsInArea = 0;
Serial.println("Objects in area reset to 0 due to inactivity.");
lastMotionTime = currentTime; // Reset the last motion time to avoid repeated reset messages
for(int brightness = 255; brightness >= 0; brightness--) {
for(int i=0; i<NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(brightness, brightness, brightness));
}
pixels.show();
delay(10);
}
}
}
// Update last states
lastState1A = currentState1A;
lastState1B = currentState1B;
lastState2A = currentState2A;
lastState2B = currentState2B;
// Small delay to avoid bouncing issues
delay(50);
}
/*
{
else if (lightState == 0)
for(int brightness = 0; brightness <= 50; brightness++) {
for(int i=0; i<NUMPIXELS; i++) {
pixels.setPixelColor(0, pixels.Color(brightness, 0, brightness));
pixels.setPixelColor(15, pixels.Color(brightness, 0, brightness));
}
pixels.show();
delay(10);
}
else if (lightState == 1)
for(int brightness = 0; brightness <= 50; brightness++) {
for(int i=0; i<NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(brightness, 0, brightness));
}
pixels.show();
delay(10);
}
else if (lightState == 2)
for(int brightness = 0; brightness <= 100; brightness++) {
for(int i=0; i<NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(brightness, brightness, brightness));
}
pixels.show();
delay(10);
}
}
}*/