W tej lekcji kursu MicroPythona dla ESP8266 pokażę obsługę wejść układu – zarówno cyfrowych, jak i analogowych. W przykładach wykorzystam przycisk oraz fotorezystor, ale możesz użyć jakiegokolwiek czujnika z wyjściem analogowym albo chociażby potencjometru.
Konwerter analogowo-cyfrowy
Konwerter analogowo-cyfrowy, czyli ADC, konwertuje napięcie analogowe na liczbę. W przypadku ESP8266 ADC ma szczególnie ważną cechę – akceptuje napięcia wyłącznie do wartości 1.0V. Wyższe napięcie spowoduje uszkodzenie przetwornika, dlatego zwróć na to szczególną uwagę. Czujniki zasilane napięciem 3.3V zwykle mają wyjście z zakresu 0-3.3V, dlatego musisz użyć dzielnika napięcia. Ale mam też dobrą wiadomość – większość NodeMCU ma dzielnik na płytce, możesz go rozpoznać po rezystorach znajdujących się przy pinie A0 lub mierząc napięcie na własnym dzielniku napięcia. Jeśli przy mierzeniu napięcia o wartości około 1V (ale nie więcej!) otrzymasz wynik w okolicach 320-330 lub mniej, to znaczy, że bezpiecznie możesz mierzyć napięcia do 3.3V bez dodatkowego dzielnika. Przejdźmy teraz do konkretów.
Jeśli masz NodeMCU z wbudowanym dzielnikiem napięcia, zbuduj układ jak na obrazku poniżej. Na ADC mierzony jest spadek napięcia na rezystorze. Jeśli jego rezystancja będzie zbyt mała, to możesz nie widzieć różnicy pomiędzy kompletną ciemnością, a lekkim oświetleniem fotorezystora. Dobierz ją eksperymentalnie – w moim przypadku dobre wyniki daje rezystor 10k, ale wszystko zależy od fotorezystora i jego parametrów. Spokojnie możesz przeprowadzać próby dla rezystancji od kilkuset omów.
Jeśli natomiast nie masz wbudowanego dzielnika napięcia, to pomiędzy 3.3V, a fotorezystor, dodaj rezystor o wartości pierwszego rezystora pomnożonej przez 2,3 lub więcej. Dzięki temu na pierwszym rezystorze nigdy nie odłoży się więcej niż 1V.
Wejście cyfrowe
Jeśli chodzi o GPIO, to nie ma tu żadnej filozofii. Wejścia przyjmują napięcia od 0 do 3.3V, więc tylko na to musisz zwrócić uwagę. Podłączenie przycisku pokazałem na poprzednim rysunku.
Program
Pora na najważniejszą część, czyli skrypt w Pythonie. Jeśli chodzi o GPIO, to konfiguracja wygląda następująco:
btn = machine.Pin(5, machine.Pin.IN, machine.Pin.PULL_UP) |
PULL_UP
oznacza, że podciągamy wejście do napięcia zasilania za pomocą wewnętrznego rezystora. Bez tego w naszym układzie wejście byłoby pływające, a po wciśnięciu przycisku i jego puszczeniu stan nadal wynosiłby 0. Gdyby w zbudowanym układzie z przyciskiem zastosować rezystor podciągający, wtedy zamiast machine.Pin.PULL_UP
można by napisać None
lub zupełnie pominąć trzeci argument. Analogiczne machine.Pin.PULL_DOWN
nie zadziała, natomiast dla pinu 16 (D0) nie zadziała nawet PULL_UP. Stan wejścia możesz odczytać poprzez btn.value()
. Ze względu na podciągnięcie do góry powinieneś otrzymać wartość 1.
Obsługa ADC jest równie prosta, co GPIO. Wystarczy tylko jedna linijka:
pr = machine.ADC(0) |
i już można odczytywać mierzone napięcie poprzez pr.read()
. ADC jest 10-bitowy, dlatego metoda będzie zwracać wartości od 0 dla napięcia 0V do 1024 dla napięcia 1.0V.
Sklejmy to wszystko razem i stwórzmy program, który zmierzy napięcie na porcie analogowym po wciśnięciu przycisku. Będzie on wyglądał jak niżej:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import time import machine pr = machine.ADC(0) btn = machine.Pin(5, machine.Pin.IN, machine.Pin.PULL_UP) prevState = False while True: if btn.value() == 0 and prevState == False: prevState = True print("PRESSED") print("ADC value: " + str(pr.read())) elif btn.value() == 1 and prevState == True: prevState = False print("RELEASED\n") time.sleep_ms(50) |
Możesz go wgrać za pomocą programu MicroPython File Uploader dostępnego w dziale Download zamiast używać do tego WebREPL.
Poprzez zapisywanie poprzedniego stanu przycisku program reaguje tylko wtedy, gdy coś się zmienia. Dzięki temu po wciśnięciu przycisku wartość wyświetli się tylko raz, nawet jeśli przycisk będzie przytrzymany. Odczekanie kilkudziesięciu milisekund to bardzo prosty, ale działający sposób na poradzenie sobie z drganiami styków podczas wciskania przycisków (debouncing). Bez tego jedno przyciśnięcie mogłoby poskutkować wielokrotnym wyświetleniem wyniku. Do wyjaśnienia pozostała jeszcze linijka print("ADC value: " + str(pr.read()))
. Metoda read()
zwraca liczbę całkowitą. Konkatenacja (łączenie łańcuchów tekstu) w Pythonie działa wyłącznie dla typu string, dlatego liczba całkowita musi być wcześniej rzutowana i służy do tego str()
.
W kolejnej lekcji zobaczysz, jak wykorzystać przerwania w podobnym przykładzie.