Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
products:laboratory_iot:exp17 [2020/05/14 16:25] – labuser29 | products:laboratory_iot:exp17 [2024/11/14 11:59] (текущий) – [Эксперимент 17. Индикатор уровня] labuser30 |
---|
В технике часто применяются индикаторы уровней на светодиодной шкале. Например в звукозаписывающем оборудовании, как индикаторы уровня громкости динамиков или микрофона. Давайте тоже соберем такой индикатор. | В технике часто применяются индикаторы уровней на светодиодной шкале. Например в звукозаписывающем оборудовании, как индикаторы уровня громкости динамиков или микрофона. Давайте тоже соберем такой индикатор. |
| |
В левой части платы конструктора имеется 6 светодиодов подходящих по цвету для использования в качестве шкалы. Когда уровень сигнала в пределах нормы, он отображается зеленым, когда он достаточно высокий— желтым, а при перегрузке загорается красный. | В левой части платы конструктора имеется 6 светодиодов подходящих по цвету для использования в качестве шкалы. Когда уровень сигнала в пределах нормы, он отображается зеленым, когда он достаточно высокий — желтым, а при перегрузке загорается красный. |
| |
Подключим все 6 светодиодов к микроконтроллеру. | Подключим все 6 светодиодов к микроконтроллеру. |
</code> | </code> |
| |
| ==== Массивы ==== |
Ранее мы уже много раз сталкивались с //переменными//. Это был некий контейнер для хранения какого либо значения или объекта. Например, мы записывали номер пина в переменную. Теперь настала пора познакомиться с //массивами//. Массив, это тоже контейнер, как и переменная, но он может хранить не одно значение, а много. Если переменную можно было представить как коробку, в которую можно что-то положить, то переменная, это полка шкафа, на которую можно поставить несколько коробок со значениями. | Ранее мы уже много раз сталкивались с //переменными//. Это был некий контейнер для хранения какого либо значения или объекта. Например, мы записывали номер пина в переменную. Теперь настала пора познакомиться с //массивами//. Массив, это тоже контейнер, как и переменная, но он может хранить не одно значение, а много. Если переменную можно было представить как коробку, в которую можно что-то положить, то переменная, это полка шкафа, на которую можно поставить несколько коробок со значениями. |
| |
{{ :products:esp-iot:array.png?nolink |}} | {{ :products:esp-iot:array.png?nolink |}} |
| |
В строке 4 мы объявили массив ''ledPins'' с помощью прямоугольных скобок и сразу записали в него 6 значений. Эти значения номера выводов, к которым подключены светодиоды. Важным свойством массива является то, что каждый элемент имеет свой номер. Номера элементов массива начинаются с 0. Так если в массиве 3 элемента, то у них будут номера 0, 1 и 2. | В строке 4 мы объявили массив ''ledPins'' с помощью прямоугольных скобок и сразу записали в него 6 значений. Эти значения номера выводов, к которым подключены светодиоды. Важным свойством массива является то, что каждый элемент имеет свой номер. Номера элементов массива начинаются с 0. Так если в массиве 3 элемента, то у них будут номера 0, 1 и 2. Эти номера нам будут нужны потом для обращения к конкретным элементам массива для чтения или записи значений в них. |
| |
| Аналогично объявляем массив для будущих объектов ''Pin'', но этот массив пока будет пустым |
| <code python [enable_line_numbers="2", start_line_numbers_at="5"]> |
| leds = [] |
| </code> |
| |
| Настало время создать объекты ''Pin'' и записать их в массив ''leds'' |
| <code python [enable_line_numbers="2", start_line_numbers_at="7"]> |
| for pinNum in ledPins: |
| leds.append(Pin(pinNum, Pin.OUT)) |
| </code> |
| Мы уже знакомы с циклом ''for'', он нужен для перебора всех значений списка. В данном случае он перебирает все значения массива ''ledPins'', в котором записаны номера выводов. Эти номера поочередно присваиваются переменной ''pinNum'' и исполняется тело цикла. |
| |
| <code python [enable_line_numbers="2", start_line_numbers_at="8"]> |
| leds.append(Pin(pinNum, Pin.OUT)) |
| </code> |
| |
| ''Pin(pinNum, Pin.OUT)'' мы уже использовали много раз - это выражение создает объект ''Pin'' для заданного номера вывода и настраивает его как выход. Полученный таким образом объект ''Pin'' добавляется в массив ''leds'' с помощью оператора ''append''. |
| |
| После исполнения этого цикла в массиве ''leds'' окажутся 6 объектов ''Pin'' для выводов в соответствующем порядке. |
| |
| Создаем объект АЦП |
| <code python [enable_line_numbers="2", start_line_numbers_at="10"]> |
| adc = machine.ADC(0) |
| </code> |
| |
| Объявляем подпрограмму ''ledOff()'' |
| |
| <code python [enable_line_numbers="2", start_line_numbers_at="12"]> |
| def ledOff(): |
| for led in leds: |
| led.off() |
| </code> |
| |
| Эта функция гасит все светодиоды. Она поочередно перебирает все светодиоды и выключает их. |
| |
| Объявляем функцию ''ledOn()'' |
| <code python [enable_line_numbers="2", start_line_numbers_at="16"]> |
| for i in range(count): |
| led = leds[i] |
| led.on() |
| </code> |
| Она нужна для включения нужного количества светодиодов подряд. В качестве параметра она принимает количество светодиодов для включения. Оператор ''range'' создает нужную последовательность чисел. Если нужно включить 3 светодиода, он генерирует последовательность чисел 0, 1, 2. Цикл ''for'' перебирает эту последовательность и каждое число из последовательности записывает в переменную ''i''. |
| |
| Отлично, теперь у нас есть понимание, что нужно зажечь, например, первый, второй и третий светодиод. Но как а ним обратиться? Объекты светодиодов записаны в массив ''leds'' и лежат в нем под своими номерами, начиная с 0. Номер элемента массива называется //индексом//. Обратимся к элементам массива по индексам. Именно это и происходит в строке 18. Мы берем i-ый элемент массива, то есть i-ый светодиод, записываем его в переменную led |
| <code python [enable_line_numbers="2", start_line_numbers_at="18"]> |
| led = leds[i] |
| </code> |
| |
| И, когда нужный объект светодиода в переменной, включаем его привычным способом |
| <code python [enable_line_numbers="2", start_line_numbers_at="19"]> |
| led.on() |
| </code> |
| |
| Теперь у нас есть 2 функции ''ledOff'', которая гасит все светодиоды и ''ledOn'', которая включает нужное число светодиодов начиная с первого. Осталось воспользоваться этими функциями для создания светодиодной шкалы. |
| |
| <code python [enable_line_numbers="2", start_line_numbers_at="19"]> |
| 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) |
| </code> |
| |
| Здесь все просто. Мы считываем значение напряжения с помощью АЦП, выключаем все светодиоды и анализируем сколько светодиодов нужно зажечь. Мы помним, что при 0 вольт результатом преобразования АЦП является 0, а при напряжении питания — 1023. Разобьем этот диапазон на 6 одинаковых интервалов. |
| |
| Если сигнал в интервале от 0 до 170, то мы должны включить 1 светодиод. Если сигнал в интервале от 171 до 340 — зажигаем 2 светодиода и т.д. С помощью оператора ''in'' проверяется попадание переменной в указанный интервал. Если это так, то выражение истинно и оператор ''if'' выполняет код для соответствующего условия. |
| |
| ==== Дополнительное задание ==== |
| <WRAP center round tip 60%> |
| * Попробуй изменить интервалы, чтобы добиться более резкого или плавного роста показаний шкалы |
| * Измени 1 строку в программе, чтобы светодиодная шкала начинала светиться не снизу-вверх, а наоборот |
| </WRAP> |