ESP8266-01 Jak zwiększyć liczbę pinów I/O

ESP8266-01 Jak zwiększyć liczbę pinów I/O

INFORMACJA: Poniższy post nie wydostał się z Poczekalni :(

Zakupiłem ostatnio kilka bardzo tanich i znanych modułów wifi ESP8266, ale w wersji 01 w której mamy dostępne 4 piny GPIO, ale jak chcemy sobie zostawić możliwość komunikacji UART to zostają nam tylko dwa piny. Trochę mało… Ale jest na to proste rozwiązanie. Można użyć znany pewnie wszystkim Expander I/O PCF8574 i2c i zwiększyć liczbę pinów do 8. W tym artykule przedstawię wam prosty sposób wykorzystania expandera w sterowaniu 8 diodami led. Warto wspomnieć że w artykule będzie stosowany system NodeMCU w ESP8266

Potrzebne części

ESP8266-01 – Na innych wersjach układu też zadziała ten przykład
Układ PCF8574 i2c- znany expander I/O z różnych projektów arduino, który pracuje na magistrali i2c
8x Diody led dowolnego koloru
8x rezystory 220Ohm (dobrane do diod led)
Kabelki
Płytka stykowa
Konwerter UART na USB 3,3v do zaprogramowania naszego układu wifi

Przyjmijmy, że już mamy wgrany system NodeMCU na  nasz ESP8266, jeśli nie jest dużo tutoriali w internecie jak to zrobić.

PCF8574 może być zasilany napięciem od 2,5v do 5,1v, więc spokojnie możemy go zasilać napięciem 3,3v, którym jest zasilany też moduł wifi

Podłączenie expandera do modułu wifi jest bardzo proste, wystarczy pin SDA PCF8574 podłączyć do GPIO2 ESP8266, a pin SCL podłączyć do GPIO0.
Później podłączamy 8 diod do expandera. Katody diody led(-) podłączamy przez opornik 220Ohm do masy, a anody, przewodami do wyprowadzeń expandera.
Tutaj podglądowy schemat podłączenia. Warto wspomnieć, że w module wifi pin CH_PD musi być podłączony do VCC. W swoim układzie użyłem kondensatora 100uF do filtracji zasilania, ponieważ zdarzało się, że moduł wifi resetował się.Zrzut ekranu z 2016-07-27 10:38:01

Przykładowy kod zaświecania diodami led.

busid = 0  -- I2C Bus ID. Zawsze zero
sda= 4     -- numer pinu SDA (GPIO2)
scl= 3     -- numer pinu SCL (GPIO0)
addr=0x27  -- adres i2c naszego pcf
led = 0;
-- Init i2c
i2c.setup(busid,sda,scl,i2c.SLOW)
-- Odczytywanie z expandera
function read_pcf8574(dev_addr)
     i2c.start(busid)
i2c.address(busid, dev_addr , i2c.RECEIVER)
     bdata = i2c.read(busid,1)  -- Reads one byte
i2c.stop(busid)
     return bdata
end

-- Wysyłanie do expandera
function write_pcf8574(dev_addr, value)
i2c.start(busid)
     i2c.address(busid, dev_addr, i2c.TRANSMITTER)
i2c.write(busid,value)
     i2c.stop(busid)
end


write_pcf8574( addr,  0) -- ustawiamy wszytkie piny expandera na low
-- Main program.
tmr.alarm(2,1000, 1, function() --zaswiecamy kazda diode osobno po kolei 
write_pcf8574(addr,0x00)
   tmr.delay(1000000)   
write_pcf8574(addr,0x01)
   tmr.delay(1000000)   
write_pcf8574(addr,0x02)
   tmr.delay(1000000)   
write_pcf8574(addr,0x04)
   tmr.delay(1000000)   
write_pcf8574(addr,0x08)
   tmr.delay(1000000)   
write_pcf8574(addr,0x10)
   tmr.delay(1000000)   
write_pcf8574(addr,0x20)
   tmr.delay(1000000)   
write_pcf8574(addr,0x40)
   tmr.delay(1000000)   
write_pcf8574(addr,0x80)
   tmr.delay(1000000)
end)

W kodzie są wykorzystywane 2 funkcje do komunikacji z expanderem. read_pcf8574 i write_pcf8574

Funkcja read_pcf8574:

Aby móc odczytywać z expandera, np stany przycisków, to musimy nasz pin odpowiedzialny za to, wprowadzić w stan wysoki. Odczytywanie odbywa się za pomocą tej funkcji, zwraca ona jeden bajt, czyli 8 bitów, gdzie każdy z nich to stan jednego wyprowadzenia expandera. Osobiście mam pewne problemy z odczytywaniem stanu przycisku, ale już 1 obsłużyłem. Sposób obsłużenia tego przycisku jest wykonany w zły sposób, więc nie ma się czym chwalić. Jak wymyślę ładniejszy to się z wami podzielę. :)

Funkcja write_pcf8574:

Wysyła ona jeden bajt do expandera, to wystarczająco aby sterować 8 pinami, ponieważ każdy bajt składa się z ośmiu bitów.
Czyli jak w programie wyżej wysyłamy bajt w postaci heksadecymalnej. Czyli 0x01, 0x02, 0x04 i tak dalej.
Dla lepszego zrozumienia gdy wysyłamy 0x01 to w postaci binarnej to wygląda tak 0000 0001, a na diodach mniej więcej tak, więc stan wysoki będzie na pinach 0

diody1

 

Więc jak wyślemy do naszego expandera np 0x57 to otrzymamy 0101 0111, więc zaświecą się diody na pinach 0, 1, 2, 3, 5, 7

led2

Polecam zapoznać się z konwersją postaci heksadecymalnej na binarną i odwrotnie. To było by na tyle w tym artykule.
Artykuł napisany na podstawie https://primalcortex.wordpress.com/2015/08/21/nodemcu-and-i2c-how-to-start-and-using-the-pcf8574a-i2c-port-expander-on-esp-01-board/

INFORMACJA: Poniższy post nie wydostał się z Poczekalni :(

Ocena: 4/5 (głosów: 5)

Podobne posty

5 komentarzy do “ESP8266-01 Jak zwiększyć liczbę pinów I/O

  • No nie…
    Jeśli toto trafi na główną to znaczy że majsterkowo schodzi już nie na psy, ale na faunę denną.

    A może kolega odpowie jak skonfigurować ekspander jako wejścia? Bo jeśli nie, to ten cały “artykuł” można o kant warsztatu obić – jako że na razie nawet tytuł z treścią się nie zgadza (bo mówi o zwiększaniu ilości pinów O, a nie I/O).

    Nie będę już oceniał własnego wkładu pracy bo tu niespecjalnie jest o czym mówić.

    Odpowiedz
  • To nie są nawet podstawy, podstaw.
    Zero wkładu własnego, implementacja opisu zawartego w dokumentacji ekspandera.
    Nie jestem nawet pewien, czy własna, ale to moja subiektywna opinia, więc nie warto brać jej pod uwagę.

    Odpowiedz

Odpowiedz

anuluj

Masz uwagi?