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.

5 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ć.

  2. Witam wszystko ładnie śmiga, tylko raz na jakiś czas muszę restartować ESP bo wyskakuje błąd
    “WebREPL is not configured, run ‘import webrepl_setup’
    could not open file ‘main.py’ for reading”

    Jak temu podołać?
    Dzięki

    1. Spróbuj faktycznie zawołać to import webrepl_setup w terminalu przez port szeregowy. Nie spotkałem się z tym wcześniej, wygląda na dodane po którejś aktualizacji, a już jakiś czas nie używam MicroPythona.
      Jeśli chodzi o plik main.py, to interpreter po włączeniu płytki najpierw uruchamia plik boot.py, a później main.py. Wygląda, jakbyś go po prostu nie miał, ale w niczym to nie powinno przeszkadzać. Jeśli natomiast jesteś pewien, że go masz, to i tak spróbuj go nadpisać. Zauważyłem, że czasem wgrywanie plików nie działa za dobrze, nawet przy użyciu WebREPL-a.

  3. Cześć wpadłem na dość szalony pomysł
    Mam płytkę wemos d1 r1
    ( jest to ESP 8266 i programator wyjścia pinów są rozstawione jak w uno )
    wpadłem na taki pomysł żeby wgrać najpierw w płytkę OTA z Arduino ( charakterystyczna linka dla tego softu )
    Serial.printf(“HTTPUpdateServer ready! Open http://%s.local%s in your browser and login with username ‘%s’ and password ‘%s’\n”, host, update_path, update_username, update_password);
    Potem przeszedłem na stronę w której jest W/W ESP i tam pokazałem plik esp8266-20190125-v1.10.bin i się wgrał ( i 512k też próbowałem)
    ( strona OTA przestała działać )Dioda (D9-pin ) miga jak szalona
    Jak połączę się z portem wemos (comX) to mam wysyp śmieci.
    Wciśnięcie reset na płytce powoduje przerwanie migania / i niema wysypu
    Dioda (D9-pin ) się wyłącza i mam wrażenie że wszystko chce działać co dalej w otoczeniu wi fi nie ma nowego sid-a

    Tak sobie kombinuję że wszystko dobrze poszło ale nie wiem jak dobrze ustawić parametry COMX żeby szło skonfigurować
    Co radzicie ?

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Rozwiąż równanie: *

This site uses Akismet to reduce spam. Learn how your comment data is processed.