Контроллеры ESP и обучение ч.4 — Урок первый
kolganov_su — 24.12.2021Заметки серии:
- Опыт знакомства с микроконтроллерами ESP ч.1
- Опыт знакомства с микроконтроллерами ESP ч.2
- Контроллеры ESP и обучение ч.3
- Контроллеры ESP и обучение ч.4 — Урок №1
Мигание встроенным в NodeMCU светодиодом (Pin 2) в качестве альтернативы «Hello World!». Подать можно в 3 или 4 итерации. На практике, видимо, сделаю 3 итерации. Иначе это будет скучно детям, а на будущие уроки останется меньше новенького в части языка.
Вариант первый, без циклов.
from machine import Pin
from time import sleep
LED = Pin(2, Pin.OUT)
LED.off()
sleep(1)
LED.on()
sleep(0.5)
LED.off()
sleep(1)
LED.on()
sleep(0.5)
LED.off()
sleep(1)
LED.on()
sleep(0.5)
Строки 1-2: Импорт модулей в формате from модуль import переменная или функция/метод, или пакет. Нужен пакет Pin, идущий в составе модуля machine и функция sleep из модуля time.
Строка 4: Инициализация переменной в качестве объекта пакета Pin. Устанавливается pin (контакт ввода-вывода) №2 и режим работы на вывод. Именно на pin 2 висит встроенный светодиод.
Строки 6-9 (и далее повтор): Подача на pin 2 высокого уровня напряжения, ожидание 1 сек, подача на pin 2 низкого уровня напряжения, ожидание 0.5 сек.
Что здесь интересного? Во-первых, подача высокого уровня напряжения на NodeMCU выключает светодиод. Во-вторых, функция sleep позволяет использовать значения с плавающей запятой. В этом смысле для коротких исходников не нужно импортировать функции sleep_ms, sleep_us.
Вариант второй, цикл While.
from machine import Pin
from time import sleep
LED = Pin(2, Pin.OUT)
while True:
LED.value(not LED.value())
sleep(1)
Строка 5: Вход в бесконечный цикл While условие истинно. Поскольку в качестве условия передано выражение True, цикл будет выполнять бесконечно или до принудительного прерывания.
Строка 6: Вместо методов on/off использован метод value, который возвращает текущее значение. Возвращается «1» для высокого уровня напряжения и «0» для низкого. Условием для внешнего вызова метода value передается инверсия значения. В данном случае «1» воспринимается интерпретатором аналогично «True», «0» аналогично «False».
Вариант третий, внутренний цикл for .. in .. range.
from machine import Pin
from time import sleep
LED = Pin(2, Pin.OUT)
while True:
LED.on()
sleep(2)
for n in range(1, 35):
LED.value(not LED.value())
sleep(0.05 + 0.01 * (35 - n))
Строка 9: Внутренний цикл for. Для каждой итерации (такта) цикла переменной «n» присваивается значение из диапазона (функция range) от 0 до 35.
Строка 11: Между переключениями задается ожидание, зависящее от значения «n» на текущем такте. Для n = 0 ожидание составит 0.05 + 0.35 = 0.4 сек, для n = 35 — 0.05 сек. Таким образом, мы получаем цикличное ускорение миганий светодиода.
Ребятам можно предложить небольшую оптимизацию наглядности кода с помощью введения дополнительной переменной.
Вариант четвертый (видимо, его использовать в рамках первого урока не буду), объявление функции.
from machine import Pin
from time import sleep
def blinkTact(controlled_LED, range_max):
for n in range(0, range_max):
controlled_LED.value(not controlled_LED.value())
sleep(0.05 + 0.01 * (range_max - n))
LED = Pin(2, Pin.OUT)
while True:
LED.on()
sleep(2)
blinkTact(LED, 35)
Здесь внутренний цикл выносится в функцию blinkTact и добавлена наглядная оптимизация из третьего варианта.
В терминологии Python могу быть неточным, в этом случае прошу поправлять.