ESP8266 асинхронно програмиране с MicroPython: Основи с uasyncio

ESP8266 асинхронно програмиране с MicroPython Основи с uasyncio

Въведение

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 Pin

uasyncio е асинхронната библиотека на 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 проекти с множество едновременни задачи. Асинхронното програмиране прави кода по-гъвкав и ефективен, тъй като позволява на микроконтролера да изпълнява различни операции без блокиране. Офицялен сайт за информация тук.

Translate »