// Пины
const int ldrPin = A0;
const int potPin = A1;
const int buttonPin = 2;
const int ledPins[] = {3, 5, 6, 9, 10}; // PWM пины
const int numLeds = 5;
// Переменные для фильтрации (скользящее среднее)
const int numReadings = 10;
int readings[numReadings];
int readIndex = 0;
int total = 0;
int average = 0;
// Переменные для кнопки и режима
int mode = 1; // 1 - плавный, 2 - пороговый
bool lastButtonState = HIGH;
unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;
// Переменные для гистерезиса
const int hysteresis = 20;
bool lightState = false; // текущее состояние светодиодов в пороговом режиме
// Переменные для таймера опроса
unsigned long prevSensorTime = 0;
const long sensorInterval = 50; // 50 мс
void setup() {
Serial.begin(9600);
// Инициализация пинов светодиодов
for (int i = 0; i < numLeds; i++) {
pinMode(ledPins[i], OUTPUT);
}
pinMode(buttonPin, INPUT_PULLUP); // используем внутреннюю подтяжку
// Инициализация массива для фильтрации
for (int i = 0; i < numReadings; i++) {
readings[i] = 0;
}
}
void loop() {
// Периодическое выполнение (опрос датчиков, фильтрация, обновление режима)
if (millis() - prevSensorTime >= sensorInterval) {
prevSensorTime = millis();
// Чтение и фильтрация фоторезистора
int rawLdr = analogRead(ldrPin);
total = total - readings[readIndex];
readings[readIndex] = rawLdr;
total = total + readings[readIndex];
readIndex = (readIndex + 1) % numReadings;
average = total / numReadings;
// Чтение порога с потенциометра
int threshold = analogRead(potPin);
// Обработка кнопки (переключение режима)
int buttonState = digitalRead(buttonPin);
if (buttonState != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (buttonState == LOW) { // кнопка нажата (так как подтяжка к питанию)
mode = (mode == 1) ? 2 : 1;
Serial.print("Mode switched to: ");
Serial.println(mode);
}
}
lastButtonState = buttonState;
// Логика режимов
int brightness = 0;
if (mode == 1) {
// Плавный режим: инверсия
brightness = map(average, 0, 1023, 255, 0);
brightness = constrain(brightness, 0, 255);
// Применяем ко всем светодиодам
for (int i = 0; i < numLeds; i++) {
analogWrite(ledPins[i], brightness);
}
} else { // mode == 2
// Пороговый режим с гистерезисом
if (!lightState && average < threshold - hysteresis) {
lightState = true;
} else if (lightState && average > threshold + hysteresis) {
lightState = false;
}
int outVal = lightState ? 255 : 0;
for (int i = 0; i < numLeds; i++) {
analogWrite(ledPins[i], outVal);
}
}
// Отладочная печать (можно убрать после отладки)
Serial.print("LDR: ");
Serial.print(average);
Serial.print(" Threshold: ");
Serial.print(threshold);
Serial.print(" Mode: ");
Serial.print(mode);
Serial.print(" LightState: ");
Serial.println(lightState);
}
}