#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel pixels1(16, 8, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels2(16, 9, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels3(16, 10, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels4(16, 11, NEO_GRB + NEO_KHZ800);
#define buzPin 15
int chastota[3] = {50, 100, 200};
const int TRIG_PINS[] = {17, 19, 18};
const int ECHO_PINS[] = {6, 7, 5};
uint8_t RGB[3];
// Конфигурация регистров гистограмм
int BAR_PINS[3][3] = { // DS, SHCP (Clock), STCP (Latch)
{23, 27, 25}, // Красный гистограмма
{53, 49, 51}, // Синий гистограмма
{39, 35, 37} // Зеленый гистограмма
};
// Параметры системы
const float MAX_DISTANCE = 20.0;
const int NUM_LEDS = 16;
const int BAR_SEGMENTS = 10;
bool zajugalka[3][16];
void setup() {
pixels1.begin();
pixels2.begin();
pixels3.begin();
pixels4.begin();
// Инициализация датчиков расстояния
for(int i = 0; i < 3; i++) {
pinMode(TRIG_PINS[i], OUTPUT);
pinMode(ECHO_PINS[i], INPUT);
digitalWrite(TRIG_PINS[i], LOW);
}
// Инициализация регистров гистограмм
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
pinMode(BAR_PINS[i][j], OUTPUT);
digitalWrite(BAR_PINS[i][j], LOW);
}
clearZajugalka(zajugalka[i]);
writeZajugalka(zajugalka[i], i);
}
// Инициализация пьезодинамика
pinMode(buzPin, OUTPUT);
}
void loop() {
byte s = 0;
for(int i = 0; i < 3; i++) {
float distance = measureDistance(i);
int brightness = 0;
int segments = 0;
if(distance <= MAX_DISTANCE) {
s++;
if (distance < 2.0) {
distance = 2;
}
brightness = map(distance, MAX_DISTANCE, 2, 1, 255);
segments = map(brightness, 1, 255, 1, BAR_SEGMENTS);
RGB[i] = brightness;
updateZajugalk(zajugalka[i], segments);
}
else {
RGB[i] = 0;
clearZajugalka(zajugalka[i]);
}
writeZajugalka(zajugalka[i], i);
}
updateRGB();
playTone(s);
}
void writeZajugalka(bool zajugalka[16], byte color) {
digitalWrite(BAR_PINS[color][2], LOW);
for (int i = 0; i < 16; i++) {
digitalWrite(BAR_PINS[color][1], LOW);
digitalWrite(BAR_PINS[color][0], zajugalka[i]);
digitalWrite(BAR_PINS[color][1], HIGH);
}
digitalWrite(BAR_PINS[color][2], HIGH);
}
void clearZajugalka(bool zajugalka[16]) {
for (int i = 15; i >= 0; i--) {
zajugalka[i] = LOW;
}
}
void updateZajugalk(bool zajugalka[16], uint8_t len) {
for (int i = len - 1; i >= 0; i--) {
zajugalka[i] = HIGH;
}
for (int i = len; i < 16; i++) {
zajugalka[i] = LOW;
}
}
float measureDistance(int sensor) {
digitalWrite(TRIG_PINS[sensor], HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PINS[sensor], LOW);
long duration = pulseIn(ECHO_PINS[sensor], HIGH, 30000);
return duration > 0 ? (duration * 0.0343) / 2 : MAX_DISTANCE + 1;
}
void updateRGB() {
for(int i = 0; i < NUM_LEDS; i++) {
pixels1.setPixelColor(i, RGB[0], RGB[1], RGB[2]);
pixels1.show();
}
for(int i = 0; i < NUM_LEDS; i++) {
pixels2.setPixelColor(i, RGB[0], RGB[1], RGB[2]);
pixels2.show();
}
for(int i = 0; i < NUM_LEDS; i++) {
pixels3.setPixelColor(i, RGB[0], RGB[1], RGB[2]);
pixels3.show();
}
for(int i = 0; i < NUM_LEDS; i++) {
pixels4.setPixelColor(i, RGB[0], RGB[1], RGB[2]);
pixels4.show();
}
}
void playTone(byte s) {
if (s > 0) {
tone(buzPin, chastota[s - 1], 50);
}
else {
noTone(buzPin);
}
}