#include <Arduino.h>
const int potPin = A0;
const int ledPins[] = {
D3, D4, D5, D6, D7,
D8, D9, D10, D11, D12
};
const int ledCount = 10;
const int adcMax = 4095;
const int center = adcMax / 2;
const int deadZone = 180;
volatile int adcValue = 0;
volatile bool needUpdate = false;
HardwareTimer *timer = new HardwareTimer(TIM1);
void onTimer()
{
adcValue = analogRead(potPin);
needUpdate = true;
}
void clearLeds()
{
for (int i = 0; i < ledCount; i++) {
digitalWrite(ledPins[i], LOW);
}
}
void showLevel(int value)
{
int delta = value - center;
int absDelta = abs(delta);
clearLeds();
if (absDelta < deadZone) {
return;
}
int level = map(absDelta, deadZone, center, 1, ledCount);
level = constrain(level, 1, ledCount);
if (delta > 0) {
// Условно положительный полюс: слева направо
for (int i = 0; i < level; i++) {
digitalWrite(ledPins[i], HIGH);
}
} else {
// Условно отрицательный полюс: справа налево
for (int i = 0; i < level; i++) {
digitalWrite(ledPins[ledCount - 1 - i], HIGH);
}
}
}
void setup()
{
Serial.begin(115200);
analogReadResolution(12);
for (int i = 0; i < ledCount; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW);
}
timer->setOverflow(100000, MICROSEC_FORMAT);
timer->attachInterrupt(onTimer);
timer->resume();
}
void loop()
{
if (needUpdate) {
needUpdate = false;
int value = adcValue;
showLevel(value);
Serial.print("ADC: ");
Serial.print(value);
if (value > center + deadZone) {
Serial.println(" POSITIVE");
} else if (value < center - deadZone) {
Serial.println(" NEGATIVE");
} else {
Serial.println(" CENTER");
}
delay(100);
}
}