Kurs ESP8266 & MicroPython #2: Migająca dioda LED

W tej lekcji dowiesz się, jak sterować portami ESP8266. Posłużymy się tutaj popularnym przykładem, jakim jest migająca dioda. Przybliżę Ci także nieco samego Pythona.

Układ portów
Na poniższym obrazku możesz zobaczyć, jak wyglądają wyprowadzenia modułu NodeMCU. Do dyspozycji jest ich całkiem pokaźna ilość, w tym jeden analogowy służący do pomiaru napięcia z rozdzielczością 10-bitów (1024 wartości).

nodemcu-pins

Tak się składa, że do wykonania tego przykładu nie musisz wykorzystać żadnego wyprowadzenia. Obok konwertera CP2102 znajduje się dioda LED połączona z pinem GPIO16, którą będziemy sterować. Nie oznacza to, że powyższy obrazek jest niepotrzebny – będziesz do niego często wracał, ponieważ nazwy pinów na płytce nie odpowiadają rzeczywistym numerom portów modułu ESP.

Program
Do sterowania pinami wymagane jest zaimportowanie modułu machine. No właśnie, czym jest moduł? Jest to odpowiednik bibliotek np. z języka C, zawierający między innymi funkcje oraz ich definicje (jako, że Python jest językiem obiektowym, mogą się tam znajdować także klasy i metody). Ogromna ilość modułów odpowiada za stale rosnącą popularność Pythona i jest jego największą siłą. Wracając do tematu – w module machine znajdują się funkcje oraz klasy odpowiadające za obsługę części hardware-owej ESP8266, w tym właśnie sterowanie portami. Program, który zaświeci nam diodę, będzie wyglądał następująco:

1
2
3
import machine
led = machine.Pin(16, machine.Pin.OUT)
led.low()

Jak można było się domyślić, nie jest zbyt skomplikowany. W drugiej linijce stworzyliśmy obiekt led klasy Pin z modułu machine, odpowiadający za pin GPIO16. Ustawiliśmy także tryb pracy jako wyjście. Chcemy zaświecić diodą, a jednak ustawiamy stan pinu na niski? Robimy tak, ponieważ dioda połączona jest na stałe anodą do napięcia 3.3V, zaś katodą do pinu GPIO16 i aby ją włączyć stan tego pinu musi być niski.
Tak powstały plik zapisz pod nazwą main.py i wyślij do ESP używając WebREPL, o którym pisałem w poprzedniej lekcji. Po zresetowaniu płytki powinieneś zobaczyć świecącą diodę obok konwertera.

Aby dioda migała, należy ją teraz zgasić. Nie wystarczy samo napisanie led.high(), dioda wówczas zaświeciłaby się i od razu zgasła. Konieczne jest zaimportowanie modułu time i dodanie opóźnienia po każdej zmianie stanu pinu. Na sam koniec całą część odpowiadającą za miganie należy umieścić w nieskończonej pętli, inaczej dioda zaświeciłaby się, po chwili zgasła i na tym by się skończyło.

1
2
3
4
5
6
7
8
9
import machine
import time
led = machine.Pin(16, machine.Pin.OUT)
 
while True:
    led.low()
    time.sleep_ms(1000)
    led.high()
    time.sleep_ms(1000)

Po przesłaniu takiego pliku dioda będzie migać co sekundę. Odstęp czasu można zmienić poprzez zmianę wartości w nawiasie przy sleep_ms.

Ciągłe odwoływanie się do funkcji z modułu poprzez poprzedzanie jej nazwą modułu może być męczące, ale Python i na to ma rozwiązanie. Zamiast import time można napisać from time import sleep_ms. Teraz wystarczy napisać samo sleep_ms(1000) żeby uzyskać jednosekundowe opóźnienie. Minus jest taki, że w tym przypadku importujemy tylko jedną funkcję z modułu i tylko ona będzie dostępna. Nie ma to istotnego wpływu na rozmiar programu – ten zawsze zajmuje tyle miejsca, ile zajmuje plik .py. Można także użyć formułki from time import *, co zaimportuje cały moduł bez konieczności każdorazowego wpisywania jego nazwy. Nie powinieneś tego jednak robić, bo może to powodować konflikty nazw.

2 myśli na temat “Kurs ESP8266 & MicroPython #2: Migająca dioda LED

  1. Cześć! Mam problem z zainstalowaniem modułu „machine”.
    Używam Pythona w wersji 2.7.13, posiadam moduł ESP-01
    Wydaje mi się, że moduł „machine” zainstalowałem poprawnie, po ponownej instalacji mam komunikat, że już jest.
    Jednak gdy w skrypcie użyję „import machine” cały czas mam komunikat „ImportError: No module named machine”
    Natomiast po wgraniu firmware do ESP, po podłączeniu go do terminala, kiedy wysyłam do niego np.:
    from machine import Pin; p0 = Pin(0, Pin.OUT); p0.value(1)
    albo
    from machine import Pin; p0 = Pin(0, Pin.OUT); p0.value(0)
    wszystko jest ok: podłączona do GPIO0 dioda zapala się albo gaśnie.

    Rozumiem, że firmware (v1.9.1-8) zawiera ten moduł (machine), natomiast nie wiem co zrobić, abym mógł go używać
    pisząc skrypt o oknie Phyton Shell.

    1. Cześć! Przede wszystkim sprawdź, czy masz wersję 1MB czy 512KB. Wersja 1MB jest czarna, a 512KB niebieska. Na niebieską można wrzucić maksymalnie MicroPythona 1.8.0, to może być przyczyna problemów.
      Jeśli jednak masz czarną, to wgraj MicroPythona jeszcze raz. Moduł „machine” jest domyślnie i nie trzeba go doinstalowywać.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Rozwiąż równanie: *