Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Termometr z wyświetlaczem LED i sondą temperatury

Sam Sung 18 Oct 2015 14:22 9504 13
Altium Designer Computer Controls
  • Termometr z wyświetlaczem LED i sondą temperatury

    Witam

    Przedstawiam prosty w budowie układ elektronicznego termometru z wyświetlaczem LED i sondą temperatury.

    Jakiś czas temu popełniłem podobną konstrukcję (jest w dziale Niedokończone: Link)
    Kol. :arrow: jankomuzykant podpowiedział tam, że możnaby ją znacząco uprościć, za co dziękuję :) Zmotywowało mnie to zrobienia nowego, mniejszego układu.
    Poza tym wciąż zdarza mi się otrzymać PW z prośbą o schemat tamtego termometru.
    Pomyślałem więc, że jest miejsce na prostą, ale skończoną i udokumentowaną konstrukcję, którą łatwo będzie można skopiować.
    W nowym układzie są tylko łatwo dostępne i tanie części.

    Koncepcja

    Układ jest zbudowany wokół mikrokontrolera AT89C2051, do którego są podłączone:
    • układ resetu
    • układ zegara kwarcowego
    • magistrala 1-wire :arrow: czujnik DS18B20
    • 4-cyfrowy 7-segmentowy wyświetlacz LED ze wspólną anodą - FJ5461BH
    Całość jest zasilana poprzez układ stabilizatora 7805 z dowolnego niestabilizowanego zasilacza 8...15 V. Stabilizator można jednak pominąć i zamiast tego zastosować zasilacz stabilizowany 5 V.

    Układ resetu to rezystor 10 kΩ i kondensator 1 µF.

    Układ zegara składa się z rezonatora kwarcowego 11059200 Hz i kondensatorów odsprzęgających 22 pF.

    Magistrala 1-wire to wyprowadzony port mikrokontrolera z rezystorem 4,7 kΩ podciągającym do jedynki oraz masa i zasilanie +5V na stałe (czujnik DS18B20 jest podłączony trzema przewodami).

    Wyświetlacz jest podłączony w następujący sposób:
    • katody poszczególnych segmentów (jest ich 8 - 7 segmentów i kropka) prosto do wyprowadzeń portu P1
    • anody poszczególnych cyfr (jest ich 4) do kolektorów tranzystorów BC327 (PNP), a ich bazy do wyprowadzeń portu P3 przez rezystory 4,7 kΩ
    Obwód świecącego segmentu zamyka się przez złącze CE tranzystora PNP (wprowadzanego w stan przewodzenia zerem z portu P3.X) do +5V z jednej strony (wspólnej anody), a przez port P1.X do masy z drugiej strony (katody).

    Program

    Struktura danych:
    • Pamięć ramki (wyświetlacza) - 4 bajty. Każdy bajt pamięta układ zapalonych segmentów na danej pozycji wyświetlacza.
    • Flaga obecności czujnika - 1 bit. Zapalana po udanym zainicjowaniu pomiaru na czujniku. Zapalona oznacza, że mamy spodziewać się wyniku pomiaru. Gaszona po błędzie komunikacji z czujnikiem (pozwala to ponownie go zainicjować, gdy zostanie znów podłączony).

    Algorytm (opis pomija obsługę błędów przy komunikacji z czujnikiem):
    • Inicjalizacja - zapalenie wszystkich segmentów
    • Pętla główna
    • Wyświetlaj to, co jest w pamięci ramki (klasyczne sterowanie multipleksowane)
    • Czy czujnik jest już zainicjowany?
    • TAK :arrow: czy czujnik sygnalizuje koniec pomiaru?
    • TAK :arrow: pobierz wynik pomiaru, przelicz na wartość dziesiętną (z uwzględnieniem wartości ujemnych) i wpisz wartość do pamięci ramki wg fontu
    • NIE :arrow: nic do roboty - powrót na początek pętli głównej
    [*:863b730849]NIE :arrow: wypełnij pamięć ramki kropkami sygnalizującymi oczekiwanie na pierwszy pomiar, inicjuj czujnik DS18B20
    [*:863b730849]Zleć nowy pomiar temperatury na DS18B20
    Program zakłada, że na magistrali jest tylko jeden czujnik, co umożliwia pominięcie procedury wyszukiwania układów 1-wire i umożliwia użycie prostych rozkazów 1-wire pomijających numer seryjny czujnika.

    Program obsługuje odłączanie i podłączanie czujnika podczas pracy.

    Font

    Program potrzebuje tablicy z fontem, tj. dla każdej możliwej cyfry dziesiętnej musi wiedzieć, jaką wartość należy wystawić na port P1, żeby zapaliły się właściwe segmenty.

    Żeby ułatwić sobie zadanie i wyeliminować możliwość pomyłki, napisałem prosty programik w Pythonie, który następujący tekst:
    Code:
    'XXX|  X|XXX|XXX|X X|XXX|XXX|XXX|XXX|XXX|' 
    
    'X X|  X|  X|  X|X X|X  |X  |  X|X X|X X|'
    'X X|  X|XXX|XXX|XXX|XXX|XXX|  X|XXX|XXX|'
    'X X|  X|X  |  X|  X|  X|X X|  X|X X|  X|'
    'XXX|  X|XXX|XXX|  X|XXX|XXX|  X|XXX|XXX|'

    przy pomocy zadanej tablicy przypisań segmentów do kolejnych wyprowadzeń portu:
    Code: python
    Log in, to see the code

    przetwarza na plik asm gotowy do użycia w programie (kolejne bajty fontu, cyfry od 0 do 9):
    Code: x86asm
    Log in, to see the code

    Tablica przypisań wynika z noty katalogowej wyświetlacza 7-segmentowego opisującego przypisanie katod segmentów do nóżek i ze sposobu podłączenia tych nóżek do wyprowadzeń portu mikrokontrolera (wg schematu układu).

    Wykaz elementów



















    NazwaLiczba
    Czujnik DS18B20 na kablu w gilzie1
    Wyświetlacz FJ5461BH1
    Mikrokontroler AT89C20511
    Stabilizator 78051
    Tranzystor BC3274
    Rezonator kwarcowy 11059200 Hz1
    Kondensator 22 pF2
    Kondensator 100 nF1
    Kondensator 1 µF1
    Kondensator 10 µF1
    Kondensator 100 µF1
    Rezystor 10 kΩ1
    Rezystor 4,7 kΩ5
    Podstawka DIP20 pod mikrokontroler1
    Płytka uniwersalna 50x70mm PI011
    Obudowa Z23B 80x60x371


    Montaż

    Układ jest zmontowany na płytce uniwersalnej. Przy płaskim ułożeniu elementów, po niewielkim docięciu krótszego boku płytki z obu stron całość mieści się w połówce obudowy Z23B (z której usunięto tulejkę na śrubę).
    Poza połączeniami na płytce przy pomocy nóżek elementów mam 13 połączeń drutami.

    Schemat

    Termometr z wyświetlaczem LED i sondą temperatury

    Zdjęcia

    Termometr z wyświetlaczem LED i sondą temperatury Termometr z wyświetlaczem LED i sondą temperatury Termometr z wyświetlaczem LED i sondą temperatury Termometr z wyświetlaczem LED i sondą temperatury Termometr z wyświetlaczem LED i sondą temperatury

    Załączniki

    Załączony plik zip zawiera:
    • Kod źródłowy programu w asemblerze (~330 linii)
    • Programik w pythonie generujący font
    • Makefile
    • Pliki wynikowe (hex, bin) dla osób, którym bardzo nie chce się instalować asemblera i/lub pythona
    Plik PDF zawiera ten sam schemat, co PNG powyżej.

    Cool? Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    Sam Sung
    Level 32  
    Offline 
    Has specialization in: oprogramowanie systemowe
    Sam Sung wrote 1634 posts with rating 229, helped 205 times. Been with us since 2005 year.
  • Altium Designer Computer Controls
  • #2
    Steryd3
    Level 33  
    Ogólnie czytając opis projektu... mam mieszane uczucia.
    Z jednej strony jest to projekt o temacie tak oklepanym, że aż boli - ile razy można się zachwycać termometrem na DS18B20 z wyświetlaczem.
    Z drugiej jednak nie jest to AVR a coś z rodziny klasyków ...8051, jest to napisane w asemblerze- czyli ma wartość edukacyjną. No i sam opis- zrobiony perfekcyjnie.
    Szkoda, że do projektu nie było robionej płytki drukowanej a całość oparta jest o płytę uniwersalną.
    Trochę mam wrażenie, że to jakiś projekt na studenckie zaliczenie - bo właśnie takie się u nas robiło.
  • Altium Designer Computer Controls
  • #3
    krzychz
    Level 17  
    Witam. Jeżeli chodzi o wykonanie urządzenia, to nie będę komentował, bo rozumiem, że jest to raczej wersja rozwojowa niż wyrób finalny. Bardziej interesuje mnie funkcjonalność i sposób działania urządzenia. Dlatego mam pytanie. W jaki sposób kolega zrealizował ograniczenie prądu płynącego przez poszczególne segmenty wyświetlacza? Na zamieszczonym schemacie a także z opisu wynika, że w układzie nie ma rezystorów ograniczających. Chyba, że jest to uwzględnione w części oprogramowania. Pozdrawiam.
  • #4
    Sam Sung
    Level 32  
    krzychz wrote:
    W jaki sposób kolega zrealizował ograniczenie prądu płynącego przez poszczególne segmenty wyświetlacza? Na zamieszczonym schemacie a także z opisu wynika, że w układzie nie ma rezystorów ograniczających. Chyba, że jest to uwzględnione w części oprogramowania.

    Wyświetlacz jest multipleksowany z częstotliwością ok. 440 Hz, a czas świecenia każdej z 4 cyfr wynosi prawie 1/4 cyklu, czyli ok. 575 µs.
    Podejrzewam, że z jednej strony nieduży prąd bazy tranzystora (niecały 1 mA) może skutkować napięciem emiter-kolektor ~1 V, a z drugiej mikrokontroler AT89C2051 przy próbie przekroczenia dopuszczalnego prądu (20 mA na port i 80 mA na wszystkie porty) podnosi napięcie wyjściowe stanu niskiego (V_OL) powyżej obiecanego 0,5 V. Zaś świecenie segmentami w cyklu pracy 1/4 pozwala wyświetlaczowi przeżyć większy prąd niż przy świeceniu ciągłym..
    Ale to jest tylko moja spekulacja na podstawie not katalogowych. Nie mam oscyloskopu, żeby to pomierzyć podczas działania, a nie jestem elektronikiem, więc mogę się mylić. Układ powstał w wyniku próby, bez teoretycznego dowodu poprawności. W praktyce potrafi działać godzinami i nie widać, żeby coś mu się działo. Jeśli ktoś ma lepsze wytłumaczenie, gdzie podziewa się nadwyżka napięcia, to sam chętnie je poznam :)
  • #5
    Steryd3
    Level 33  
    Strasznie to zawiłe.
    Rzeczywiście brakuje Ci na schemacie (i na płytce z tego co widać też) ośmiu rezystorów między wyświetlaczem LED(katodami) a portem P1 mikrokontrolera.
    Nie wiem o co chodzi w wypowiedzi o niedużym prądzie bazy tranzystora -prąd ten powinien być tak dobrany by tranzystor pracował albo w stanie nasycenia (gdy dana cyfra z wyświetlacza ma świecić) lub zatkania (gdy cyfra w danym momencie ma nie świecić)- praca tranzystora w stanie aktywnym nie jest tu pożądana.

    Zdarza się, że rezystory których Ci brakuje w b. tanich chińskich układach nie są stosowane i są zastępowane jednym po stronie wspólnej anody (w twoim przypadku) -ale u Ciebie nawet tego jednego nie ma.

    I teraz pytanie po co w ogóle stosuje się te rezystory - stosuje się je po to, by prąd każdego segmentu (a więc i jasność każdej diody LED) miał stałą wartość niezależnie od tego ile segmentów aktualnie się świeci. Oczywistym bowiem jest to, że cyfra "8" wymaga zapalenie siedmiu segmentów wyświetlacza, a cyfra "1" tylko dwóch. Bez tych rezystorów może się okazać, że gdy wyświetlamy cyfrę "1" to świeci ona mocniej niż wtedy gry wyświetlamy cyfrę "8" bo ten sam prąd zamiast na siedem diod rozpływa się na dwie.
  • #6
    HD-VIDEO
    Level 42  
    100 punków należy się za:

    Że jest to asm, z komentarzem co robi program
    Za opis co dany element projektu robi
    Za użycie starego już zapomnianego mikrokontrolera
    Za opis algorytmu; żeby ładniej wyglądało można narysować go w formie rysunku blokowego algorytmu
    Za udostępniona pełnej dokumentacji z źródłami, bez obawy, że ktoś zaraz zacznie projekt sprzedawać

    Rezystory:
    Trzeba by zobaczyć jak by wzrósł prąd na segmentach gdyby zawiesił się mikrokotroler z jakieś przyczyny.
    Te chińskie wyświetlacze bardzo jasno świeca, także wstawienie rezystorów nie wpłynęło by na ogólną jasność a ew. dobrane wartości uchroniły by wyświetlacz przed uszkodzeniem.

    Można by do projektu dodać:
    Przekroczenie górnego/dolnego zakresu pomiarowego DS1820 - taki Hi/ Lo Max
    Wykrywanie czujnika typu "S", które są równo popularne z "B"
    Powinno się dać umieścić pomiar Max/Min zarejestrowanej temperatury, resetowanej potem przyciskiem - jest wolny pin
  • #7
    Sam Sung
    Level 32  
    Osobiście nie widzę różnicy jasności między różnymi cyframi, no, może jedynka jest odrobinę jaśniejsza od innych.
    W poprzednim układzie zastosowałem ULN2803 i rezystory na wszystkich segmentach, a różnice były dużo wyraźniejsze.
    Gdyby napięcie nasycenia wynosiło 0,5 V i kontroler też wystawiał 0,5 V w stanie niskim, to zostałoby aż 4 V do odłożenia na diodzie świecącej segmentu. Podejrzewam, że czerwony wyświetlacz by tego nie przeżył. A ma się dobrze. Czyli gdzieś (na BC327 i/lub AT89C2051) musi odkładać się więcej, bo jak inaczej wytłumaczyć, że wyświetlacz jeszcze mi się nie spalił?

    HD-VIDEO wrote:
    Wykrywanie czujnika typu "S", które są równo popularne z "B"
    Faktycznie mógłbym to tu dodać, mam opracowane wykrywanie typu i odczyt temp. w dużej rozdzielczości również z czujników "S" (do innego projektu).
  • #8
    TheLinkin
    Level 2  
    W jaki sposób zostało przeprowadzone wgrywanie programu do urządzenia ? Jakiś programator ?
  • #10
    HD-VIDEO
    Level 42  
    Przeprowadziłem taki test sprzętowo/programowy.

    Płytka testowa/zasilanie 5V/wyświetlacz model AF05643FS-B (czerwony)/BC557A +4k7 w bazach/330Ω w segmentach.

    Schemat jest poprawny. Rozdzielczość 0,1°C. Test wyświetlacza/oczekiwanie na gotowość DSa/wygaszenie nieznaczących cyfr - działa; średni pobór prądu całego układu - 36mA

    Zmierzone temperatury -20..127,9°C; dolną tylko taką miałem, górna piekarnik; termometr zatrzymuje wskazania po przekroczeniu temp. 127,9°C.
    Znak "-" prawidłowo wyświetlany przy ujemnej temperaturze.

    Zauważone błędny:
    1. Po usunięciu DSa (długość przewodu 2m) wyświetlacz bardzo często pokazuje - 0.1 - gdzie spacja to wygaszony 2-gi wyświetlacz; po podłączeniu DSa z powrotem automatycznie go znajduje.

    2. Wyraźne migotanie cyfr wyświetlacza, co ok. 500ms następuje przygaszenie wszystkich cyfr.


    Zastosowany wyświetlacz jest bardzo jasny.
    W segmentach rezystory o wartości 330Ω, średni prąd 5mA na segment a z zwartym rezystorem segmentowym prąd wzrasta do ponad 20mA.

    Eksperyment zawieszeniem mikrokontrolera (us. rezonator/ z rezystorami segmentowymi) zwiększa prąd do 8mA .

    Programowe ograniczenie prądu jak widać nie działa prawidłowo - ogólnie rezystory w segmentach zawsze powinno się dodawać.


    Przy AT89C2051, koniecznie kondensatory na zasilaniu - łatwo się zawiesza
  • #11
    TheLinkin
    Level 2  
    Sam Sung wrote:
    TheLinkin wrote:
    W jaki sposób zostało przeprowadzone wgrywanie programu do urządzenia ? Jakiś programator ?
    Tak, konkretnie ten: https://www.elektroda.pl/rtvforum/topic2408247.html



    Widzę że to jest Twoja własna konstrukcja. A są na rynku dostępne programatory dzięki którym można ten mikroprocesor zaprogramować?
  • #12
    HD-VIDEO
    Level 42  
    Np Willem ale tam jeszcze trzeba przystawkę.

    Zamienić AT89C2051 na AT89S2051, wtedy programator za 15zł

    Na 99% będzie działać
  • #13
    Sam Sung
    Level 32  
    Dzięki HD-VIDEO za przetestowanie :)
    Wg noty katalogowej FYQ-5641BS-11 "absolute maximum" prąd na segment to 30 mA ciągle i 150 mA w piku 1/10 ms przy 1 kHz.
    Czyli zmierzony przez Ciebie prąd ponad 20 mA to nie jest dla niego problem. Mógłby to być problem dla AT89C2051, ale najwyraźniej nie w przypadku mojego egzemplarza.
    Układ przeleżał trochę w szufladzie, a teraz przeżywa drugie życie jako zegarek. Zwiększyłem częstotliwość multipleksowania do 1 kHz. Będzie cały czas włączony i zobaczymy, jak długo pożyje bez tych rezystorów :)