logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1

p.kaczmarek2 20 Cze 2025 15:03 1071 1

TL;DR

  • Zbudowano prosty termometr/higrometr na PIC18F2550 z potrójnym wyświetlaczem 7-segmentowym i czujnikiem AHT20.
  • Wyświetlacz o wspólnej anodzie sterują port B przez rezystory, a cyfry włączają trzy tranzystory PNP A1015 na płytce uniwersalnej.
  • I2C działa programowo na dwóch pinach portu A; skaner wykazał adres 0x38, a moduł AHT20 pracuje z zasilaniem 5V.
  • Po komendzie 0xAC i odczycie pięciu bajtów mikrokontroler wyświetla temperaturę oraz wilgotność, oznaczając wilgotność literą H.
  • Projekt nie jest jeszcze skończony: autor planuje obudowę, polaryzer, złącze USB i regulację jasności wyświetlacza.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
📢 Słuchaj (AI):
  • Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Zapraszam na szczegółowe sprawozdanie z budowy prostego termometru/higrometru na bazie części znalezionych w szufladzie. Najpierw dobiorę i uruchomię tutaj wyświetlacz, potem złożę i wykonam niezbędny układ na płytce uniwersalnej, a na koniec do niego dodam czujnik AHT20, tak by móc odczytywać pomiary. Całość na popularnym 8-bitowym mikrokontrolerze PIC.

    Ten miniprojekt jest nieco powiązany z moim tutorialem SDCC dla PIC18F2550 i będę tu częściowo bazować na opisanych tam krokach:
    Część 1 - Konfiguracja środowiska pracy
    https://www.elektroda.pl/rtvforum/topic3635522.html#18304424
    Część 2 - Blink LED, piny IO, cyfrowe wejścia i wyjścia
    https://www.elektroda.pl/rtvforum/topic3647884.html#18389188
    Część 3 - Ustawienia oscylatora. Oscylator wewnętrzny, zewnętrzny, rezonator kwarcowy, PLL
    https://www.elektroda.pl/rtvforum/topic3657704.html
    Część 4 - Timery, przerwania
    https://www.elektroda.pl/rtvforum/topic3676645.html#18580858
    Część 5 - Obsługa wyświetlacza siedmiosegmentowego
    https://www.elektroda.pl/rtvforum/topic3676650.html#18580877
    Część 6 - Sterownik wyświetlacza LED MM5450
    https://www.elektroda.pl/rtvforum/topic3845301.html
    Spis treści będzie uzupełniany wraz z pisaniem przeze mnie kolejnych części.

    Powiązane tematy o PIC12F683:
    PIC12F683 i SDCC - tutorial - tworzymy prosty ściemniacz (czytamy noty katalogowe)
    PIC12F683 i SDCC - cały zegar i termometr na dwóch pinach (bez zewnętrznych bibliotek)

    Całość napiszę w SDCC pod PIC18F2550 bez zewnętrznych bibliotek.

    Ze względów praktycznych nie będę tu powtarzać szczegółowo wiedzy z poprzednich części.

    Cel projektu
    Tym razem za cel postanowiłem sobie zbudowanie prostego termometru w oparciu o części, które już miałem na stanie. Planowałem dobrać jakiś większy wyświetlacz 7-segmentowy i uruchomić go z jakimś mikrokontrolerem PIC. Po drodze też wpadłem na pomysł, by dodatkowo dodać czujnik wilgotności. Wszystko oczywiście na płytce prototypowej z tego, co jest pod ręką.

    Użyty mikrokontroler?
    Zasadniczo użyłem tego, co miałem pod ręką. Początkowo planowałem użyć PIC16LF1902 (2048 słów Flash, 128 bajtów RAM). Układ ten został mi po projekcie obsługi LCD - gdyż on ma sprzętową obsługę LCD.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Niestety pracuje on tylko na napięciu 3.3V, a 5V jest dla niego zbyt wysokie, więc ostatecznie zdecydowałem się użyć klasyka - PIC18F2550. Ich wyprowadzenia są w dużym stopniu zgodne:
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Tu mogę skorzystać z okazji i przestrzec przed nieintuicyjnym dla mnie nazewnictwem PICów. Zobaczmy:
    - PIC18F2550 - pracuje na 4.2V – 5.5V, wiadomo
    - PIC18LF2550 - pracuje na 2.0V – 5.5V
    - PIC16LF1902 - pracuje na... 1.8 do 3.6V! Niespodzianka.
    Trochę o tym zapomniałem, ale na szczęście wyprowadzenia są zgodne, więc przejście na PIC18F nie było problemem.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1

    Dobór wyświetlacza
    Tu też użyłem tego, co miałem pod ręką. Trochę tych wyświetlaczy się przez lata zebrało. W tym projekcie chciałem jakiś większy wyświetlacz, najlepiej na 2 lub 3 cyfry. W przypadku trzycyfrowego też potrzebna będzie kropka.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Zdecydowałem się na nieco większy niż zazwyczaj, potrójny, 7-segmentowy wyświetlacz z kropkami (kropka to ósmy segment):
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1 Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Do kontrolowania tutaj jest 8 * 3 = 24 osobnych segmentów, ale pinów jest mniej, bo diody LED z danego znaku mają wspólne anody (bądź katody - zależy od typu wyświetlacza). Z tego powodu zacząłem od sprawdzenia czy wyświetlacz w ogóle działa oraz jakie ma wyprowadzenia. Do tego starczy 5V z odpowiednio dobranym rezystorem ograniczającym prąd diody. Wziąłem jakieś 470 omów.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1 Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    W ten sposób określiłem, że mam do czynienia z wyświetlaczem o wspólnej anodzie. Wszystkie anody danej cyfry są połączone razem i podłącza się je do dodatniego napięcia (tu planuję 5V przez tranzystor - potrzebny będzie PNP). Aby świecił dany segment, jego katodę (one są osobno) należy podłączyć do masy.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1


    Pierwsze testy
    Zacząłem od sprawdzenia czy programator (PICKIT2) w ogóle widzi te PICe - zawsze krok po kroku wszystko odpalam.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1 Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Potem uruchomiłem blink, czyli miganie diodą LED. W tym celu dodałem brakujący rezystor 10k na pin MCLR, by móc odpalić wgrany program.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1 Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1 Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Nic nie cieszy tak jak samodzielnie skompilowany i wgrany blink, zwłaszcza gdy MCU też uruchamiamy luzem:





    Budowa projektu na uniwersalnej płytce
    W dzisiejszych czasach można dość tanio zakupić gotową dwustronną płytkę, tym bardziej jeśli jest ona mniejsza niż 10x10cm, ale to i tak nie ma sensu gdy ma się tylko jedną sztukę pasującego wyświetlacza. Z tego powodu zdecydowałem się użyć płytki wierconej, przeznaczonej na szybkie prototypy.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Postanowiłem, że wyświetlacz będzie wkładany w dwa gniazda szpilkowe, a pod nim będzie schowany MCU. Port B PICa będzie sterować segmentami (przez rezystory). Nie mam aż takiej wyobraźni, by spontanicznie to wszystko polutować, więc przygotowałem sobie szkic połączeń:
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Analogicznie do wyświetlacza, PIC też dostał swoją podstawkę. Chcę móc w razie czego go wymienić lub wyjąć:
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Niezbyt lubię lutować do takich płytek wierconych. Trzeba uważać z temperaturą oraz dobrze osadzać elementy, bo jak element osadzi się krzywo, a potem się go naciśnie, to pad lutowniczy odpada z PCB.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1 Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1 Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Tak dobrałem umiejscowienie elementów, by móc łatwo wlutować malutkie, montowane powierzchniowo rezystory między pinami MCU a segmentami wyświetlacza.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Potrzebne też były tranzystory do załączania cyfr. Odzyskałem je z elektrośmieci, z panelu frontowego jakiegoś odtwarzacza DVD czy tam tunera satelitarnego. Tam miały identyczną rolę co u mnie.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1 Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Nie bawiłem się nawet odsysaczem czy tam plecionką, po prostu łapię tranzystor kombinerkami i grzeję luty. To płytka ze złomu, może się uszkodzić, tranzystor zresztą też nie jest dużo wart.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1 Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Ten tranzystor to A1015 (KSA1015), PNP:
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Tak się akurat fajnie składa, że idealnie pasuje do mojego PCB - bazy od strony MCU, kolektory razem (5V), emitery od strony wyświetlacza.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1 Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Nie są to najlepsze luty, ale niech już będzie.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1 Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    W ten sposób zlutowałem minimalny układ dla PICa (rezystor 10k od MCLR, kondensatory na zasilaniu) oraz dla wyświetlacza (trzy tranzystory z rezystorami na bazach, rezystory od segmentów). Na koniec dolutowałem złącze od PICKITa (ICSP). Tak się fajnie składa, że PGD i PGC są po tej samej stronie co MCLR, więc wszystko ładnie przypasowało:
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1


    Programowanie wyświetlacza
    Całość zweryfikowałem prostym programem blink:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Zamiganie diodą nie jest raczej trudne, ale już tu jest jedna pułapka w postaci rejestru ADCON1 - trzeba go odpowiednio ustawić by włączyć tryb cyfrowy na pinach mających też funkcję ADC.
    Zacząłem od uruchomienia osobnych cyfr. Załączyłem wszystkie segmenty (port B) a potem kolejno w pętli włączałem wybrany tranzystor:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Rezultat:



    W oparciu o ten kod szybko określiłem na którym pinie portu B jest który segment.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Po prostu próbowałem 8 razy - za każdym razem zapalając inny segment i zapisując który bit mu odpowiada.
    Potem mogłem już przygotować znaki - cyfry i litery do F, by móc w razie czego wyświetlać szesnastkowo.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1 Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1 Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1 Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Ostatnim krokiem było wprowadzenie przerwania oraz funkcji rozbijającej podaną liczbę (typ float) na poszczególne cyfry:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Testowy program:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1

    Czujnik AHT20
    Zastanawiałem się troszkę skąd wziąć pomiary. Rozważałem DHT11 (lub podobny) oraz DS18B20, ale ostatecznie uznałem, że oba te czujniki wymagają mniej lub bardziej precyzyjnych czasowo operacji, a to może nieco skomplikować ich implementację. Postanowiłem wybrać coś opierające się o protokół I2C, gdzie to główny MCU (master) sam decyduje o zegarze i nie musi martwić się tym, że jednocześnie obsługuje przerwania od timera.
    Padło więc na precyzyjny czujnik wilgotności temperatury AHT20. Taki czujnik umieszczony jest na wygodnym module i może być zasilany z 5V. Dokładność pomiaru temperatury wynosi ±0,3°C a wilgotności do ±2%.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1 Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Prezentowany moduł ma już rezystory podciągające do zasilania (4.7kΩ) bezpośrednio na PCB, więc nie trzeba ich osobno dodawać.

    Uruchomienie I2C
    I2C obsłużyłem w pełni programowo, po prostu poprzez operacje na cyfrowym IO. To samo wykonywałem już w temacie z PIC12F683. Wybrałem do tego dwa piny z portu A.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Implementacja:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Mamy tu funkcje:
    - I2C_delay – generuje małe opóźnienie, w zasadzie zbędne przy użytym zegarze PICa
    - I2C_start – generuje warunek START na magistrali I2C (przejście SDA z wysokiego na niski przy wysokim SCL)
    - I2C_stop – generuje warunek STOP na magistrali I2C (przejście SDA z niskiego na wysoki przy wysokim SCL)
    - I2C_restart – generuje warunek RESTART (powtórzony START)
    - I2C_write – wysyła bajt danych na magistralę I2C, zwraca 1, jeśli otrzymano ACK
    - I2C_read – odczytuje bajt z magistrali I2C, parametr ack określa, czy master wyśle ACK (1) czy NACK (0) po odbiorze bajtu
    - WriteRegister – wysyła bajt do urządzenia o danym adresie
    - ReadRegister – odczytuje bajt z urządzenia I2C o danym adresie
    Potem uruchomiłem prosty skaner. Skan magistrali I2C to prosty sposób na podstawową weryfikację podłączeń oraz części implementacji protokołu.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Uzyskany adres wyświetliłem na wyświetlaczu:
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    56 (dziesiętne) czyli 0x38 (szesnastkowo), zgadza się.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1

    Odczyt z AHT20
    Komunikację z AHT20 okroiłem do minimum. W tej wersji chciałem rezultatów. Najważniejsza jest komenda 0xAC (trigger measurement) wraz z argumentami:
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Potem zaimplementowałem oczekiwanie - sprawdzanie read status w pętli z oczekiwaniem na ukończenie pomiaru:
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Sprawdzam bit siódmy (licząc od zera - 0x80), poniżej rozpiska:
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Na koniec zaimplementowałem odczyt pięciu wynikowych bajtów oraz zamianę ich na wilgotność/temperaturę z gotowego do użycia wzoru.
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Analogicznie dopisałem obsługę wilgotności:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    W głównej pętli teraz wykonuję jeden odczyt a potem najpierw pokazuję jeden wynik, a potem drugi. Wilgotność pokazuję z literką H.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Wygląda na to, że wszystko działa. Test wartości z "H" oraz temperatura:
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1 Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1

    Dalsze plany
    Projekt jeszcze nie jest gotowy, więc dopiero rozważam kolejne kroki. Potrzebna na pewno będzie obudowa. Tu mam dwie możliwości:
    - druk 3D - wydrukować sobie dowolny kształt z wybranego koloru plastiku
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    - sposób "klasyczny", mam jakieś odpadki płyt, ścinki, choć może ktoś z czytających lepiej je określi. Można by rozważyć wykonanie z niej prostego "pudełka":
    Termometr/higrometr na PIC18F i AHT20 krok po kroku - DIY od zera - część 1
    Przyda się też może jakiś polaryzer na wyświetlacz, mam coś ze starych tunerów satelitarnych...
    Oczywiście też trzeba będzie całość upakować i dodać może jakieś złącze USB, tak by to zasilać ze starego zasilacza do telefonu, dużo takich nam zostało po komórkach z zeszłej epoki. Takie zasilacze z reguły mają małą wydajność prądową, ale dla pokazanego tu zegara i 500mA bez problemu wystarczy.
    Innym pomysłem jaki mam do zrealizowania to uruchomienie ADC i dodanie prostej regulacji jasności wyświetlacza. W nocy nie musi aż tak mocno świecić, by go było widać.

    Podsumowanie
    To był kolejny krótki weekendowy projekt który zasadniczo wykonałem od 0. Z gotowych modułów użyłem jedynie AHT20, ale raczej inaczej się nie dało tego zrealizować sensownie, a sam moduł i tak dużo nie zmienił.
    Z lutowaniem było troszkę zabawy i nie udało się osiągnąć wyżyn estetyki, ale to i tak będzie w obudowie. Nie było jednak większych problemów, a użycie rezystorów w obudowach 0603 bardzo ułatwiło zmieszczenie się w rozmiarówce samego wyświetlacza. Wyświetlacz teraz dobrze siedzi w gnieździe szpilkowym a w razie czego mogę go też z niego wyjąć, tak samo zresztą jak PIC - on też ma swoją podstawkę DIP28.
    Projekt zamierzam dociągnąć do końca, więc jeśli macie jakieś pomysły co można jeszcze dodać (czujnik oświetlenia? Coś innego?), czy jak zrealizować obudowę, itd, to będę wdzięczny za wszystkie sugestie.
    Na dzisiaj to tyle, w załączniku umieszczam projekt SDCC pod PIC18F2550.
    Załączniki:
    • p18f2550_AHT20_20250620.zip (62.51 KB) Musisz być zalogowany, aby pobrać ten załącznik.

    Fajne? Ranking DIY
    Pomogłem? Kup mi kawę.
    O autorze
    p.kaczmarek2
    Moderator Smart Home
    Offline 
    Inżynier programista z wieloletnim doświadczeniem embedded i full stack developer.
    Specjalizuje się w: embedded, Full-Stack Developer
    p.kaczmarek2 napisał 14676 postów o ocenie 12700, pomógł 656 razy. Jest z nami od 2014 roku.
  • #2 21611863
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14676
    Pomógł: 656
    Ocena: 12700
    Mała errata - chyba kopiowałem kod do tematu przed poprawkami, bo w odczycie wilgotności powinno być:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Tj. pierwszy bajt d0 nie dotyczy wilgotności, ona jest od drugiego bajtu. Reszta jest ok, poprawiłem temat.
    Pomogłem? Kup mi kawę.
📢 Słuchaj (AI):
REKLAMA