Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| products:laboratory_iot_с:exp17 [2024/11/14 12:02] – [Массивы] 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 строку в программе, | ||
| - | </ | ||