I2C na pinach RX, TX w Wemos D1 mini

Dziś będzie krótko. Na łamach forum Koduj dla Polski pracujemy obecnie nad oprogramowaniem do wyświetlacza dotykowego zbudowanego w oparciu o kolorowy ekran LCD 2.4″ i płytkę Wemos D1 mini. Moduły ze sobą połączyliśmy za pomocą specjalnie przygotowanej płytki PCB. Założeniem projektu jest wyświetlanie danych o zanieczyszczeniu powietrza w możliwie najatrakcyjniejszy sposób. Niejako skutkiem ubocznym było powstanie wyświetlacza, który można użyć w dowolnym projekcie IoT.

Pinów wiecznie za mało :)

Jako, że obsługa ekranu LCD, dotyku, czytnika kart SD, wybudzanie z głębokiego uśpienia i sterowanie podświetleniem zajęły nam praktycznie wszystkie “normalne” piny, wolne pozostały jedynie RX (3) i TX (1). Wyprowadzenia te podpięte są do konwertera serial-USB CH340 i to właśnie na nich działa domyślna komunikacja z komputerem przez USB. Więc teoretycznie są już zajęte… ale czy na pewno?

Z wykorzystaniem RX i TX do innych celów wiąże się kilka ograniczeń. Oba piny podczas uruchamiania płytki przyjmują na chwilę stan wysoki. Więc użycie ich jako standardowych GPIO nie zawsze ma sens (na przykład przy sterowaniu przekaźnikami). Co więcej jeżeli pin TX zostanie podciągnięty do masy podczas uruchamiania, to płytka nie wystartuje. Na szczęście magistrale I2C i One wire podciągamy do VCC. Jeżeli godzimy się na utratę komunikacji szeregowej to nic nie stoi na przeszkodzie, aby w sekcji Setup zmienić tryb pracy na “standardowe GPIO”. Taka operacja pozwoli na wykorzystanie pinów RX i TX jako programowego I2C lub OneWire.

pinMode(TX, FUNCTION_3);
pinMode(RX, FUNCTION_3);
Wire.begin(TX, RX); 

Najlepsze jest to, że Wemos D1 mini z wpiętym czujnikiem I2C, którego linie SDA i SCL są podciągnięte do VCC nadal daje się bezproblemowo zaprogramować przez USB.