Въведение
ESP8266 е мощен микроконтролер с Wi-Fi възможности, а при програмирането му с MicroPython се използва и библиотеката uasyncio за асинхронно изпълнение на задачи. В тази статия ще разгледаме основите на асинхронното програмиране, като демонстрираме с пример как да контролираме два LED диода с различни интервали на мигане.
Асинхронното програмиране в MicroPython е много сходно с подхода, използван в статията ни за Arduino: Arduino мигане без закъснение “Blink Without Delay” и примера “Blink Without Delay.” И при двете среди целта е да се избегне блокиращото действие на команди като delay(), което би спирало изпълнението на други задачи. В Arduino се разчита на millis() за проследяване на времето, което позволява задачите да се изпълняват независимо. По подобен начин, с библиотеката uasyncio в MicroPython можем да управляваме паралелни задачи, като осигуряваме плавно и ненатрапчиво изпълнение на кода.
Какво е асинхронно програмиране и за какво е този пример
Асинхронното програмиране позволява множество задачи да бъдат изпълнявани паралелно, без изчакване между тях. Това е полезно в IoT проекти, като тези с ESP8266, където трябва да управляваме множество периферии едновременно. Библиотеката uasyncio осигурява асинхронни функции и таймери в MicroPython, за да реализираме паралелни задачи. В примера ще използваме асинхронни функции за управление на два светодиода с различни интервали на мигане.
Използвани компоненти за този пример:
- ESP8266 – микроконтролер за управление и Wi-Fi връзка
- Два резистора от 220 ома – за ограничаване на тока към светодиодите
- Два LED диода – визуална индикация
- Свързващи кабели – за съединяване на компонентите
Свързване:
Започваме, като свържем всеки резистор от 220 ома последователно с анода (дългия край) на LED диодите. Катодите на диодите се свързват към GND пиновете на ESP8266. Свързваме резисторите към два GPIO пина на ESP8266, за да контролираме всяко LED с отделни сигнали.
За да свържете коректно схемата ще ви трябва диаграмата на пиновете на вашата ESP8266 платформа. Разгледайте нашите ревюта на някои от тези процесорни платки за повече информация:
Код (ESP8266 асинхронно програмиране с MicroPython)
import uasyncio as asyncio
from machine import Pin
# Настройка на светодиодите
led1 = Pin(5, Pin.OUT)
led2 = Pin(0, Pin.OUT)
async def blink1():
while True:
led1.on()
await asyncio.sleep_ms(200)
led1.off()
await asyncio.sleep_ms(200)
async def blink2():
while True:
led2.on()
await asyncio.sleep_ms(1000)
led2.off()
await asyncio.sleep_ms(1000)
async def main():
# Създаване на асинхронни задачи за мигане на светодиодите
task1 = asyncio.create_task(blink1()) # Интервал от 1 секунда
task2 = asyncio.create_task(blink2()) # Интервал от 2 секунди
# Изчакване на приключването на задачите
await asyncio.gather(task1, task2)
# Стартиране на асинхронния цикъл
asyncio.run(main())Пълно обяснение на кода за асинхронно програмиране с MicroPython и ESP8266
Импортиране на модули:
import uasyncio as asyncio
from machine import Pinuasyncio е асинхронната библиотека на MicroPython, а Pin от machine се използва за контрол на GPIO пиновете.
Настройка на светодиодите:
# Настройка на светодиодите
led1 = Pin(5, Pin.OUT)
led2 = Pin(0, Pin.OUT)Двата LED светодиода са дефинирани като изходи, като led1 използва GPIO 5, а led2 – GPIO 0.
Асинхронни функции blink1 и blink2:
async def blink1():
while True:
led1.on()
await asyncio.sleep_ms(200)
led1.off()
await asyncio.sleep_ms(200)
async def blink2():
while True:
led2.on()
await asyncio.sleep_ms(1000)
led2.off()
await asyncio.sleep_ms(1000)blink1() и blink2() са асинхронни функции, които управляват мигането на led1 и led2. blink1() включва led1 за 200 ms и го изключва за 200 ms, а blink2() го прави с интервал от 1 секунда. await asyncio.sleep_ms() позволява други задачи да се изпълняват, докато функцията е в пауза.
Функция main():
async def main():
# Създаване на асинхронни задачи за мигане на светодиодите
task1 = asyncio.create_task(blink1()) # Интервал от 1 секунда
task2 = asyncio.create_task(blink2()) # Интервал от 2 секунди
# Изчакване на приключването на задачите
await asyncio.gather(task1, task2)В main() създаваме асинхронни задачи за blink1() и blink2() с asyncio.create_task. След това await asyncio.gather() изчаква задачите да се изпълняват едновременно.
Стартиране на асинхронния цикъл:
# Стартиране на асинхронния цикъл
asyncio.run(main())asyncio.run(main()) стартира основния асинхронен цикъл и започва изпълнението на задачите, което позволява на ESP8266 да контролира светодиодите едновременно.
Заключение
Този пример демонстрира основните принципи на асинхронното програмиране с ESP8266, MicroPython и uasyncio. Използването на асинхронни функции е от ключово значение за IoT проекти с множество едновременни задачи. Асинхронното програмиране прави кода по-гъвкав и ефективен, тъй като позволява на микроконтролера да изпълнява различни операции без блокиране. Офицялен сайт за информация тук.
