Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
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 строку в программе, | ||
+ | </ | ||