Контроллеры ESP и обучение ч.4 - Урок первый

Dec 24, 2021 21:50


Заметки серии:


Мигание встроенным в 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 могу быть неточным, в этом случае прошу поправлять.

электроника, it, esp32, программирование, обучение, esp8266

Previous post Next post
Up