Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Computer ControlsComputer Controls
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Termometr z wyświetlaczem LED i sondą temperatury

Sam Sung 18 Paź 2015 14:22 8988 13
  • 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
    • NIE :arrow: wypełnij pamięć ramki kropkami sygnalizującymi oczekiwanie na pierwszy pomiar, inicjuj czujnik DS18B20
    • 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:
      Kod: python
      Zaloguj się, aby zobaczyć kod

      przetwarza na plik asm gotowy do użycia w programie (kolejne bajty fontu, cyfry od 0 do 9):
      Kod: x86asm
      Zaloguj się, aby zobaczyć kod

      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.

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    Sam Sung
    Poziom 31  
    Offline 
    Specjalizuje się w: oprogramowanie systemowe
    Sam Sung napisał 1412 postów o ocenie 165, pomógł 184 razy. Jest z nami od 2005 roku.
  • Computer ControlsComputer Controls
  • #2
    Steryd3
    Poziom 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.
  • Computer ControlsComputer Controls
  • #3
    krzychz
    Poziom 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
    Poziom 31  
    krzychz napisał:
    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
    Poziom 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
    Poziom 40  
    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
    Poziom 31  
    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 napisał:
    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
    Poziom 2  
    W jaki sposób zostało przeprowadzone wgrywanie programu do urządzenia ? Jakiś programator ?
  • #10
    HD-VIDEO
    Poziom 40  
    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
    Poziom 2  
    Sam Sung napisał:
    TheLinkin napisał:
    W jaki sposób zostało przeprowadzone wgrywanie programu do urządzenia ? Jakiś programator ?
    Tak, konkretnie ten: https://www.elektroda.pl/rtvforum/viewtopic.php?t=2408247



    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
    Poziom 40  
    Np Willem ale tam jeszcze trzeba przystawkę.

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

    Na 99% będzie działać
  • #13
    Sam Sung
    Poziom 31  
    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 :)
  • #14
    Sam Sung
    Poziom 31  
    Po roku nieprzerwanego działania nic się nie zepsuło :) Wyświetlacz wciąż świeci.
    Termometr z wyświetlaczem LED i sondą temperatury