Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
products:laboratory_iot_с:exp17 [2024/11/14 12:04] – [Массивы] labuser30 | products:laboratory_iot_с:exp17 [Дата неизвестна] (текущий) – удалено - внешнее изменение (Дата неизвестна) 127.0.0.1 | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ===== Эксперимент 17. Индикатор уровня ===== | ||
- | |||
- | В технике часто применяются индикаторы уровней на светодиодной шкале. Например в звукозаписывающем оборудовании, | ||
- | |||
- | В левой части платы конструктора имеется 6 светодиодов подходящих по цвету для использования в качестве шкалы. Когда уровень сигнала в пределах нормы, он отображается зеленым, | ||
- | |||
- | Подключим все 6 светодиодов к микроконтроллеру. | ||
- | ==== Схема эксперимента ==== | ||
- | |||
- | {{ : | ||
- | // | ||
- | |||
- | {{ : | ||
- | // | ||
- | |||
- | ==== Программный код эксперимента ==== | ||
- | |||
- | <file arduino Exp17.ino[enable_line_numbers=" | ||
- | #define ACD_PIN A0 | ||
- | |||
- | int value = 0; | ||
- | int myPins[] = {5, 12, 13, 14, 15, 16}; | ||
- | | ||
- | void ledOff(){ | ||
- | for (int i = 0; i < 6; i++) { | ||
- | digitalWrite(myPins[i], | ||
- | } | ||
- | } | ||
- | |||
- | void ledOn(int count){ | ||
- | for (int i = 0; i < count; i++) { | ||
- | digitalWrite(myPins[i], | ||
- | } | ||
- | } | ||
- | |||
- | void setup() | ||
- | { | ||
- | for (int i = 0; i < 6; i++) { | ||
- | pinMode(myPins[i], | ||
- | } | ||
- | } | ||
- | |||
- | void loop() | ||
- | { | ||
- | value = analogRead(ACD_PIN); | ||
- | ledOff(); | ||
- | | ||
- | if (value > 850) ledOn(6); | ||
- | else if (value > 680) ledOn(5); | ||
- | else if (value > 510) ledOn(4); | ||
- | else if (value > 340) ledOn(3); | ||
- | else if (value > 170) ledOn(2); | ||
- | else ledOn(1); | ||
- | } | ||
- | </ | ||
- | |||
- | В коде программы много нового. Давайте разбираться. | ||
- | |||
- | <code arduino [enable_line_numbers=" | ||
- | int myPins[] = {5, 12, 13, 14, 15, 16}; | ||
- | </ | ||
- | |||
- | ==== Массивы ==== | ||
- | Ранее мы уже много раз сталкивались с // | ||
- | |||
- | {{ : | ||
- | |||
- | В строке 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 строку в программе, | ||
- | </ | ||