Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
products:laboratory_iot_с:exp9 [2024/11/12 14:28] – [Программный код эксперимента] labuser30 | products:laboratory_iot_с:exp9 [Дата неизвестна] (текущий) – удалено - внешнее изменение (Дата неизвестна) 127.0.0.1 |
---|
===== Эксперимент 9. Пульсирующий маячок ===== | |
| |
Мы научились пользоваться аппаратным генератором ШИМ. Попробуем с помощью него | |
сделать что-то более интересное, чем просто светящийся не в полную мощность светодиод. Например, попробуем изменять яркость светодиода во времени по определенному закону. | |
| |
==== Схема эксперимента ==== | |
| |
{{ :products:esp-iot:hwpwmschematic.png?nolink |}} | |
//Рисунок 1. Электрическая принципиальная схема эксперимента// | |
| |
{{ :products:esp-iot:hwpwm.png?direct&600 |}} | |
//Рисунок 2. Монтажная схема эксперимента// | |
| |
Изменений в схеме, по сравнению с предыдущим экспериментом, нет | |
| |
==== Программный код эксперимента ==== | |
| |
<file arduino Exp9.ino[enable_line_numbers="2", start_line_numbers_at="1"]> | |
#define LED_PIN 15 | |
| |
void setup() { | |
pinMode(LED_PIN, OUTPUT); | |
analogWriteFreq(200); | |
analogWriteRange(1024); | |
} | |
| |
void pulse(int led_pin, int time_ms) { | |
for (int i = 0; i <= 20; i++){ | |
analogWrite(led_pin, int(sin(i / 10.0 * PI) * 500 + 500)); | |
delay(time_ms); | |
} | |
} | |
| |
void loop() { | |
pulse(LED_PIN, 20); | |
} | |
</file> | |
| |
В этом эксперименте мы впервые, столкнулись с //подпрограммой//. Подпрограммы нужны для того, чтобы можно было использовать один и тот же кусок кода несколько раз в программе не копируя постоянно одно и то же. Гораздо удобнее вынести такой код в отдельную подпрограмму и вызывать ее всякий раз, когда она нужна. | |
| |
Кроме того подпрограмма может принимать параметры и возвращать данные. Чтобы лучше понять что это значит, напишем простейшую подпрограмму для сложения двух чисел. | |
| |
<code arduino> | |
int summator(int a, int b) { | |
c = a + b; | |
return c; | |
} | |
result = summator(2, 3); | |
</code> | |
| |
Здесь мы объявили подпрограмму с именем ''summator'' и указали, что она возвращает тип ''int'' принимает на вход два параметра. Первый параметр будет записан в переменную ''a'', второй в переменную ''b''. Обе переменные типа ''int''. Далее идет тело подпрограммы, оно находится внутри фигурных скобок. В коде подпрограммы мы складываем переменные ''a'' и ''b'' и записываем результат сложения в переменную ''c''. И возвращаем полученный результат с помощью оператора ''return''. | |
| |
А основная программа состоит только из одной строки, в которой мы вызываем подпрограмму ''summator'', передавая ей в качестве параметров два числа - 2 и 3. Подпрограмма складывает их и полученный результат оказывается в переменной ''result'' | |
| |
Подпрограммы, которые принимают параметры и возвращают результат принято называть //функциями//. В нашем эксперименте мы объявили функцию ''pulse'' она принимает в качестве параметров объект ШИМ и число— время задержки. ''pulse'' не возвращает результата. | |
| |
Функция ''pulse'' предназначена для изменения яркости светодиода. | |
<code python [enable_line_numbers="2", start_line_numbers_at="12"]> | |
for i in range(20): | |
l.duty(int(math.sin(i / 10 * math.pi) * 500 + 500)) | |
time.sleep_ms(t) | |
</code> | |
| |
В строке 12 нам встречается два новых оператора. | |
| |
Оператор ''for'' — это оператор цикла, как и знакомый нам ''while'', но действует он иначе. Он предназначен для прохода по всем элементам. Но элементам чего? Сейчас разберемся. | |
| |
Сначала взглянем на оператор ''range()'', он предназначен для генерирования ряда чисел в определенном диапазоне. ''range(20)'' генерирует последовательность чисел 0, 1, 2, 3, 4 ... 19. Это будет 20 целых чисел от 0 до 19. | |
| |
Так вот оператор ''for'', в нашем случае, проходит по всем элементам этой последовательности, которую создал для него ''range(20)''. Каждый раз он берет следующий элемент последовательности, присваивает его переменной ''i'', и выполняет тело цикла. И так до тех пор, пока не сделает это со всеми элементами последовательности. | |
| |
Получается, что в нашем случае, тело цикла будет запущено 20 раз и переменная i последовательно получит значения от 0 до 19. Шаги цикла принято называть //итерациями//. В нашем случае будет 20 итераций цикла. На каждой итерации мы будем устанавливать новую яркость светодиода. А вычислять яркость на каждой итерации мы будем по формуле в строке 13. Переменная ''i'' используется в ней для вычисления яркости. | |
| |
Мы не будем вдаваться в детали математики в формуле из строки 13, но обязательно дадим ссылку, где можно почитать о функциях библиотеки ''math'' подробнее, если это интересно. | |
| |
<WRAP center round info 60%> | |
* [[https://python-scripts.com/range|Подробнее об операторе range()]] | |
* [[https://pythonworld.ru/osnovy/cikly-for-i-while-operatory-break-i-continue-volshebnoe-slovo-else.html|Подробнее о циклах в Python]] | |
* [[https://python-scripts.com/math|Подробнее о библиотеке math]] | |
</WRAP> | |
| |