Próbuję podłączyć kilka wyświetlaczy LED opartych na TM1637 i niestety pojawił sie problem. Łącze zgodnie ze wskazówkami z TM1637 7-Segment Display — ESPHome - conect multiple display - i otrzymuje komunikat o błędzie związanym z podwójnym wykorzystaniem wyjść esp32 - dokładnie taki “Pin xx is used in multiple places” (dotyczy każdego pinu, który wykorzystuje). Na razie obszedłem tą niedogodność wykorzystując do każdego TM1637 osobne dwa piny (wszystko działa) , ale w wersji docelowej mojego systemu zaczyna mi brakować wyjść na ESP32. Ma ktoś pomysł, co można zrobić aby można było wykorzystać sposób połączeń z esphome.io ?
Dziąki za porady
Kiedyś takie ograniczenia odnośnie wykorzystania pinów nie istniały (dzięki czemu ludzie nieświadomie wywoływali sobie w swoich konstrukcjach konflikty sprzętowe i była z tego lawina issues).
Sposób kaskadowego łączenia wielu wyświetlaczy TM1637 jest wybitnie nietypowy (linia zegarowa jednego wyświetlacza to jednocześnie linia danych jakiegoś innego, ale w sumie daje to 50% wykorzystania pinów! - dla N wyświetlaczy zamiast używać 2N pinów używamy tylko N pinów dla N>1).
Do sedna - od czasów wprowadzenia ograniczeń = kontroli zajętości pinów przez inne komponenty tego samego projektu umożliwiono też obejście kontroli zajętości zgodnie z dokumentacją
some_config_option:
pin:
number: GPIOXX
allow_other_uses: true
jak na razie nigdy nie musiałem z tego korzystać…
Zakładam, że to zadziała, ale gdyby się nie udało to proponuję zgłosić issue.
OFF TOPIC
Kiedyś rozważałem konstrukcję z wieloma wyświetlaczami TM1637, ale po wykorzystaniu jednego trafiłem na jego ograniczenia sprzętowe (podobno nie każde wykonanie ma te ograniczenia, ale nie znalazłem wtedy w sprzedaży innych wykonań niż z dwukropkiem) - brak zmiennopozycyjnego przecinka - jest jedynie dwukropek na środku i odpuściłem temat (wykorzystując ostatecznie ten jeden wyświetlacz do wyświetlania kilku różnych wartości naprzemiennie, co jednak nie jest idealne. Tak swoją drogą driver TMS1637/TM1637 był projektowany do sterowania wyświetlaczem w tanich mikrofalówkach i do tego idealnie się nadaje, a jego sterownik w ESPHome potrafi nawet wyświetlać znaki, których producent raczej nie przewidywał - z tego co wiem był dedykowany pod cyfry z dwukropkiem, a teraz można wyświetlać wszystkie znaki jakie są w dokumentacji MAX7219, bo obsługa nietypowych została dodatkowo dopisana, a właściwie obecnie jest żywcem wykorzystywany sterownik dla MAX7219 któremu są dostarczane dane po odpowiedniej translacji - jeśli mnie pamięć nie myli zamieniona jest kolejność cyfr lub segmentów).
Taka konstrukcja dla testu - u mnie się kompiluje, ale nie mam wyświetlaczy by się przekonać czy to istotnie działa (uwaga inne testy na wykorzystanie pinów nadal są aktywne, więc np. wykorzystanie GPIO 14, 15 czy dowolnego z 6-11 spowoduje, że kompilacja nie przejdzie - sprzęt by i tak nie działał prawidłowo lub wcale, nie obiecuję, że można użyć GPIO 12, w ogóle trzeba omijać każdy zastrzeżony pin więc GPIO 34-39 oraz wszystkie z dolnego zakresu <6 oprócz bodajże GPIO 4)
esphome:
name: tms1637-test
friendly_name: tms1637-test
esp32:
board: esp32dev
framework:
type: arduino
logger:
api:
encryption:
key: "vbNPgtlmq5GoITC5JssNDndQFCGke4lnALSaHaM6cGw="
ota:
- platform: esphome
password: "849f6e2b0da8b4a03c340f9971168c0f"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap:
ssid: "Tms1637-Test Fallback Hotspot"
password: "47PK4zMlbL6T"
captive_portal:
time:
- platform: sntp
timezone: Europe/Warsaw
servers:
- 0.pl.pool.ntp.org
- 1.pl.pool.ntp.org
- 2.pl.pool.ntp.org
id: sntp_time
display:
- platform: tm1637
id: display_1
clk_pin:
number: GPIO13
allow_other_uses: true
dio_pin:
number: GPIO21
allow_other_uses: true
intensity: 4
lambda: |-
it.strftime(" .%S", id(sntp_time).now());
- platform: tm1637
id: display_2
clk_pin:
number: GPIO21
allow_other_uses: true
dio_pin:
number: GPIO22
allow_other_uses: true
intensity: 4
lambda: |-
it.print("0123");
- platform: tm1637
id: display_3
clk_pin:
number: GPIO22
allow_other_uses: true
dio_pin:
number: GPIO13
allow_other_uses: true
intensity: 4
lambda: |-
it.print("4321");
Bingo - działa. Co do dwukropka to masz rację, ale pojawiły się teraz wyświetlacze z kropkami i działają ładnie
Dzięki za pomoc pozdrawiam
Sprawdziłeś dla więcej niż 2 wyświetlaczy?
Na razie 2 wyświetlacze, ale będą próby z większą ilością. (już próbowałem 4 szt, ale w konfiguracji 2 szt na 2 pinach, a pozostałe 2 szt na 4 pinach - ale docelowo chciałbym (potrzebuję) 7 wyświetlaczy na 4 pinach. Nie wiem tylko kiedy będzie próba.
Nie wiem czy warto się meczyć? Zmień to na ledy MAX7219.
W moim zastosowaniu MAX7219 odpada (brak gotowych rozwiązań sprzętowych) a projektować i zamawiać PCB po prostu mi się nie chce TM1637 mam gotowe i idealnie wpasują się w mój pomysł.
Właśnie uruchomiłem 6 wyświetlaczy na TM1637 - działają pięknie
Na TM1637 to jest awykonalne - 7 wyświetlaczy zajmie 7 pinów (łącząc w jakiś optymalny układ), podczas, gdy na MAX7219 dałbyś radę…
I jak rozwiązałeś kwestię ograniczenia ilości użytych GPIO?