‘’'/* ИСХОДНЫЕ ДАННЫЕ:
1). Потенциометр, одним концом подключенный к питанию, другим к земле.
Средний контакт - к аналоговому входу микроконтроллера.
2). Семисигментный светодиодный индикатор с общим катодом 5161А.
Он взят просто для экономии места, чтобы не ставить кучу светодиодов.
ЗАДАЧА:
1). Условно разбить весь диапазон значений 0…1023, которые считывает контроллер
при вращении оси потенциометра, на 3 неравных отрезка.
2). При вращении оси потенциометра от нуля направо, т.е. при увеличении напряжения,
светодиоды должны бегать по кругу по часовой стрелке с ускорением в первом и третьем диапазонах.
3). При вращении оси потенциометра от максимального значения налево до минимального
светодиоды должны бегать против часовой стрелки с замедлением в первом и третьем диапазонах.
4). В среднем отрезке должна просто зажигаться чёрточка (светодиод G). Другие светодиоды
гореть и бегать не должны на этом участке.
*/
// НЕИЗМЕНЯЕМЫЕ ПАРАМЕТРЫ (КОНСТАНТЫ):
// Назначаем аналоговый вход A0 для чтения данных с потенциометра:
const int POT = A0;
// Назначаем выходы контроллера для управления светодиодами семисегментного LED-индикатора:
const int LED_A = 2;
const int LED_B = 3;
const int LED_C = 4;
const int LED_D = 5;
const int LED_E = 6;
const int LED_F = 7;
const int LED_G = 8; // Чёрточка в семисигментном индикаторе
// Светодиоды в индикаторе запишем массивом:
int ledPins = { LED_A, LED_B, LED_C, LED_D, LED_E, LED_F, LED_G };
// ИЗМЕНЯЕМЫЕ ПАРАМЕТРЫ:
int index, valPOT, next_valPOT = 0; // i, значение напряжения valPOT, следующее считанное значение напряжения
int up_Board = 600; // Верхняя граница среднего участка
int down_Board = 500; // Нижняя граница среднего участка
void setup() {
// Все пины по очереди устанавливаем на выход. Счёт начинается с нуля, поэтому i <= 6, а не 7
for (index = 0; index <= 6; index++) {
pinMode(ledPins[index], OUTPUT);
Serial.begin(9600); // Инициализируем COM-порт для отладки
}
}
void loop() {
valPOT = analogRead(POT); // Читаем текущее значение потенциометра
delay(50); // Задержка программы, чтобы стабилизировать считывание значения valPOT после поворота оси потенциометра
next_valPOT = analogRead(POT); // Читаем другое значение valPOT, чтобы сравнить растёт или нет?
// Если значение valPOT находится в одном ИЛИ другом диапазоне И увеличивается, то движение светодиодов направо
if (((valPOT > 0 && valPOT < down_Board) || (valPOT > up_Board && valPOT <= 1023)) && (next_valPOT >= valPOT)) {
to_the_right();
}
// А может значение valPOT находится в тех же диапазонах И уменьшается? Тогда движение светодиодов налево
if (((valPOT > 0 && valPOT < down_Board) || (valPOT > up_Board && valPOT <= 1023)) && (next_valPOT < valPOT)) {
to_the_left();
}
// А если находится в среднем диапазоне от down_Board до up_Board, то зажечь горизонтальную чёрточку
if (valPOT >= down_Board && valPOT <= up_Board) {
digitalWrite(LED_G, HIGH);
} else {
digitalWrite(LED_G, LOW); // В противном случае горизонтальная черта гореть не должна
}
Serial.println(valPOT); // Выводим в монитор, чтобы посмотреть, как ведёт себя valPOT
}
void to_the_right() { // Функция вращения направо
int valpot = analogRead(POT);
valpot = map(valpot, 0, 1023, 800, 1000); // Ограничиваем значение valpot, получаемое от потенциометра, чтобы быстрее нарастало значение при вращении
for (index = 0; index <= 5; index++) { // Перебор по одному от светодиода к светодиоду направо
int delayTime = 1023 - valpot; // уменьшаем время простоя программы и ускоряем вращение с ростом напряжения
digitalWrite(ledPins[index], HIGH);
delay(delayTime);
digitalWrite(ledPins[index], LOW);
}
}
void to_the_left() {
int valpot = analogRead(POT); // Функция вращения влево
valpot = map(valpot, 0, 1023, 800, 1000); // Ограничиваем значение valpot, получаемое от потенциометра, чтобы быстрее нарастало значение при вращении
for (index = 5; index >= 0; index–) { // Перебор от светодиода к светодиоду налево без чёрточки, поэтому index=5, а не 6
int delayTime = 1023 - valpot; // уменьшаем время и ускоряем вращение с ростом напряжения
digitalWrite(ledPins[index], HIGH);
delay(delayTime);
digitalWrite(ledPins[index], LOW);
}
}
‘’’