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