#include <Adafruit_NeoPixel.h>
#include <HCSR04.h>
#define PIN_LED 6
#define PIN_BUZZER 3
#define NUMPIXELS 29
#define MAX_DIST_CM 40
#define MIN_DIST_CM 3
#define CRITICAL_DIST 8 // Kritikus távolság (cm), ahol a villogás/gyors pittyegés elkezdődik
Adafruit_NeoPixel pixels(NUMPIXELS, PIN_LED, NEO_GRB + NEO_KHZ800);
UltraSonicDistanceSensor distanceSensor(9, 10);
unsigned long lastBeepTime = 0; // Utolsó pittyenés ideje
unsigned long beepInterval = 0; // A pittyenések közötti szünet hossza
bool ledState = false; // A LED-ek aktuális állapota villogáskor
void setup() {
pixels.begin();
pinMode(PIN_BUZZER, OUTPUT);
pixels.show();
}
void loop() {
float distance = distanceSensor.measureDistanceCm();
if (distance <= 0 || distance > MAX_DIST_CM) {
pixels.clear();
pixels.show();
noTone(PIN_BUZZER);
beepInterval = 0;
return;
}
// Számítások
int numLedsToLight = map(distance, MIN_DIST_CM, MAX_DIST_CM, NUMPIXELS, 0);
numLedsToLight = constrain(numLedsToLight, 0, NUMPIXELS);
int red = map(distance, MIN_DIST_CM, MAX_DIST_CM, 255, 0);
int green = map(distance, MIN_DIST_CM, MAX_DIST_CM, 0, 255);
red = constrain(red, 0, 255);
green = constrain(green, 0, 255);
int pitch = map(distance, MIN_DIST_CM, MAX_DIST_CM, 1500, 150);
pitch = constrain(pitch, 150, 1500);
// LED-ek frissítése (villogás nélkül)
if (distance > CRITICAL_DIST) {
pixels.clear();
for (int i = 0; i < numLedsToLight; i++) {
pixels.setPixelColor(i, pixels.Color(red, green, 0));
}
pixels.show();
ledState = true; // Alap állapotba visszaállítjuk a villogót
}
// --- UPGRADE 1: Szaggatott hangjelzés (tolatóradar) ---
// A távolsággal arányosan csökken a szünet a pittyenések között
beepInterval = map(distance, MIN_DIST_CM, MAX_DIST_CM, 50, 800); // 50ms (gyors) -> 800ms (lassú)
beepInterval = constrain(beepInterval, 50, 800);
if (millis() - lastBeepTime >= beepInterval) {
lastBeepTime = millis();
// 50ms-es pittyenés
tone(PIN_BUZZER, pitch, 50);
}
// --- UPGRADE 2: Villogó piros LED-ek kritikus távolságnál ---
if (distance <= CRITICAL_DIST) {
if (millis() - lastBeepTime >= (beepInterval / 2)) { // A pittyenések ütemére villog
if (ledState) {
pixels.clear(); // Kikapcsol
ledState = false;
} else {
// Bekapcsol piros színnel a szükséges számú LED-ig
for (int i = 0; i < numLedsToLight; i++) {
pixels.setPixelColor(i, pixels.Color(255, 0, 0)); // Csak piros
}
ledState = true;
}
pixels.show();
}
}
delay(10);
}