/*
Arduino | coding-help
Čiešalas
Wednesday, May 13, 2026 12:12 PM
yes i need help integrading the leds, for example i want
the leds to light up from the sides and go torwards the
middle as the distance gets very close to the object
*/
#include <Adafruit_NeoPixel.h>
#include <ezBuzzer.h>
// user constants
const long GREEN = 0x0000FF40; // 32 bit color, WRGB
const long YELLOW = 0x00FFFF45;
const long RED = 0x00FF2525;
const long BLACK = 0x00000000;
const int SAFE = 200;
const int WARN = 200;
const int DANGER = 100;
const int BRIGHTNESS = 255;
const int NUM_BTNS = 2;
const int NUM_LEDS = 6;
// pin constants
const int LED_PIN = 12;
const int BUZZ_PIN = 2;
const int ECHO_PIN = 10;
const int TRIG_PIN = 11;
const int BTN_PINS[] = {9, 8};
// time constant
const unsigned long ONE_SEC = 1000;
const unsigned long BLINK_RATE = 200;
// global variables
bool isColor = false;
int btnState[NUM_BTNS];
int oldBtnState[NUM_BTNS];
long distance = 400; // quiet on boot
unsigned long prevBuzzTime = 0;
unsigned long prevPixelTime = 0;
unsigned long prevSenseTime = 0;
ezBuzzer buzzer(BUZZ_PIN, BUZZER_TYPE_PASSIVE, HIGH); // create ezBuzzer object: pin, type, activeLevel (PASSIVE for melody)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
// function returns which button was pressed, or 0 if none
int checkButtons() {
int btnPressed = 0;
for (int i = 0; i < NUM_BTNS; i++) {
btnState[i] = digitalRead(BTN_PINS[i]); // check each button
if (btnState[i] != oldBtnState[i]) { // if it changed
oldBtnState[i] = btnState[i]; // remember state for next time
if (btnState[i] == 0) { // was just pressed
btnPressed = i + 1;
}
delay(20); // debounce
}
}
return btnPressed;
}
int getDistance() { // in centimeters
float dist = 0.0;
// send trigger
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// calculate distance
unsigned long duration = pulseIn(ECHO_PIN, HIGH, 25000);
dist = (duration * 0.0343) / 2;
// return distance as an integer
return (int)(dist + 0.5);
}
void setBuzzer(unsigned long rate) {
if (millis() - prevBuzzTime >= rate) {
buzzer.beep(25, 0, 440);
prevBuzzTime = millis();
}
}
void setPixels(int dist) {
// reset all pixels
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, BLACK);
}
if (dist <= DANGER) {
if (millis() - prevPixelTime >= BLINK_RATE) {
isColor = !isColor;
prevPixelTime = millis();
}
long color = isColor ? RED : BLACK;
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, color);
}
} else if (dist <= WARN) {
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, YELLOW);
}
} else { // safe distance
if (dist < 250) {
strip.setPixelColor(2, GREEN);
strip.setPixelColor(3, GREEN);
} else if (dist < 300) {
strip.setPixelColor(1, GREEN);
strip.setPixelColor(4, GREEN);
} else if (dist < 350) {
strip.setPixelColor(0, GREEN);
strip.setPixelColor(5, GREEN);
} else {
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, GREEN);
}
}
}
if (buzzer.getState() == BUZZER_IDLE) {
strip.show();
}
}
void setup() {
Serial.begin(9600);
strip.begin();
strip.setBrightness(BRIGHTNESS);
pinMode(BTN_PINS[0], INPUT_PULLUP);
pinMode(BTN_PINS[1], INPUT_PULLUP);
pinMode(BUZZ_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.println("ParkTronic V1.00\n");
}
void loop() {
buzzer.loop(); // MUST call the buzzer.loop() function in loop()
int btnNumber = checkButtons();
if (btnNumber) {
Serial.print("Button ");
Serial.print(btnNumber);
Serial.println(" pressed.");
}
if (millis() - prevSenseTime >= ONE_SEC) {
distance = getDistance();
//setPixels(distance);
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
prevSenseTime = millis();
}
setPixels(distance);
if (distance < SAFE) {
long beepRate = map(distance, 2, 400, 100, 1000);
setBuzzer(beepRate);
}
}