В технике часто применяются индикаторы уровней на светодиодной шкале. Например в звукозаписывающем оборудовании, как индикаторы уровня громкости динамиков или микрофона. Давайте тоже соберем такой индикатор.
В левой части платы конструктора имеется 6 светодиодов подходящих по цвету для использования в качестве шкалы. Когда уровень сигнала в пределах нормы, он отображается зеленым, когда он достаточно высокий — желтым, а при перегрузке загорается красный.
Подключим все 6 светодиодов к микроконтроллеру.
from machine import Pin _init() ledPins = [5,12,13,14,15,16] leds = [] for pinNum in ledPins: leds.append(Pin(pinNum, Pin.OUT)) adc = machine.ADC(0) def ledOff(): for led in leds: led.off() def ledOn(count): for i in range(count): led = leds[i] led.on() while True: value = adc.read() ledOff() if value in range(0,170): ledOn(1) elif value in range(171,340): ledOn(2) elif value in range(341,510): ledOn(3) elif value in range(511,680): ledOn(4) elif value in range(681,850): ledOn(5) elif value in range(851,1023): ledOn(6)
В коде программы много нового. Давайте разбираться.
ledPins = [5,12,13,14,15,16]
Ранее мы уже много раз сталкивались с переменными. Это был некий контейнер для хранения какого либо значения или объекта. Например, мы записывали номер пина в переменную. Теперь настала пора познакомиться с массивами. Массив, это тоже контейнер, как и переменная, но он может хранить не одно значение, а много. Если переменную можно было представить как коробку, в которую можно что-то положить, то переменная, это полка шкафа, на которую можно поставить несколько коробок со значениями.
В строке 4 мы объявили массив ledPins
с помощью прямоугольных скобок и сразу записали в него 6 значений. Эти значения номера выводов, к которым подключены светодиоды. Важным свойством массива является то, что каждый элемент имеет свой номер. Номера элементов массива начинаются с 0. Так если в массиве 3 элемента, то у них будут номера 0, 1 и 2. Эти номера нам будут нужны потом для обращения к конкретным элементам массива для чтения или записи значений в них.
Аналогично объявляем массив для будущих объектов Pin
, но этот массив пока будет пустым
leds = []
Настало время создать объекты Pin
и записать их в массив leds
for pinNum in ledPins: leds.append(Pin(pinNum, Pin.OUT))
Мы уже знакомы с циклом for
, он нужен для перебора всех значений списка. В данном случае он перебирает все значения массива ledPins
, в котором записаны номера выводов. Эти номера поочередно присваиваются переменной pinNum
и исполняется тело цикла.
leds.append(Pin(pinNum, Pin.OUT))
Pin(pinNum, Pin.OUT)
мы уже использовали много раз - это выражение создает объект Pin
для заданного номера вывода и настраивает его как выход. Полученный таким образом объект Pin
добавляется в массив leds
с помощью оператора append
.
После исполнения этого цикла в массиве leds
окажутся 6 объектов Pin
для выводов в соответствующем порядке.
Создаем объект АЦП
adc = machine.ADC(0)
Объявляем подпрограмму ledOff()
def ledOff(): for led in leds: led.off()
Эта функция гасит все светодиоды. Она поочередно перебирает все светодиоды и выключает их.
Объявляем функцию ledOn()
for i in range(count): led = leds[i] led.on()
Она нужна для включения нужного количества светодиодов подряд. В качестве параметра она принимает количество светодиодов для включения. Оператор range
создает нужную последовательность чисел. Если нужно включить 3 светодиода, он генерирует последовательность чисел 0, 1, 2. Цикл for
перебирает эту последовательность и каждое число из последовательности записывает в переменную i
.
Отлично, теперь у нас есть понимание, что нужно зажечь, например, первый, второй и третий светодиод. Но как а ним обратиться? Объекты светодиодов записаны в массив leds
и лежат в нем под своими номерами, начиная с 0. Номер элемента массива называется индексом. Обратимся к элементам массива по индексам. Именно это и происходит в строке 18. Мы берем i-ый элемент массива, то есть i-ый светодиод, записываем его в переменную led
led = leds[i]
И, когда нужный объект светодиода в переменной, включаем его привычным способом
led.on()
Теперь у нас есть 2 функции ledOff
, которая гасит все светодиоды и ledOn
, которая включает нужное число светодиодов начиная с первого. Осталось воспользоваться этими функциями для создания светодиодной шкалы.
while True: value = adc.read() ledOff() if value in range(0,170): ledOn(1) elif value in range(171,340): ledOn(2) elif value in range(341,510): ledOn(3) elif value in range(511,680): ledOn(4) elif value in range(681,850): ledOn(5) elif value in range(851,1023): ledOn(6)
Здесь все просто. Мы считываем значение напряжения с помощью АЦП, выключаем все светодиоды и анализируем сколько светодиодов нужно зажечь. Мы помним, что при 0 вольт результатом преобразования АЦП является 0, а при напряжении питания — 1023. Разобьем этот диапазон на 6 одинаковых интервалов.
Если сигнал в интервале от 0 до 170, то мы должны включить 1 светодиод. Если сигнал в интервале от 171 до 340 — зажигаем 2 светодиода и т.д. С помощью оператора in
проверяется попадание переменной в указанный интервал. Если это так, то выражение истинно и оператор if
выполняет код для соответствующего условия.