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

Termometr na wyśw. LED z kalibracją i nie na DS18

szeryf.rm 15 Paź 2008 23:12 8921 15
  • Termometr na wyśw. LED z kalibracją i nie na DS18
    Słowo wstępu.
    Projekt powstał dla wujka, który zapragnął mieć termometr na tradycyjnych wyświetlaczach LED. Wykonanie od momentu zamówienia elementów do momentu pisania tego tematu to około 1.5 tygodnia (po pracy i bez wekendu)

    Założenia wg. których powstawał projekt:
    1. Całość ma być w miarę tania (jak na jednostkowy wyrób) i cena nie powinna przekraczać 42zł razem ze wszystkimi ew. przesyłkami (tyle uzgodniłem), ew. mogłem być stratny (i pewnie jestem minimalnie na płytce, ale niewiele). W związku z tym, że cena jest jaka jest, projekt NIE obejmował zasilacza ani obudowy. To wujek powiedział, że sam zrobi, więc proszę tego nie oceniać, bo to już nie moja sprawa.

    2. Termometr ma wyświetlać temperaturę na wyświetlaczach siedmiosegmentowych LED i na żadnych innych, a już na pewno nie LCD. Wyświetlacze mają być 2 po 4 cyfry.

    3. Miały być 2 czujniki temperatury do pomiaru temp. na zewnątrz i wewnątrz.

    4. Czujniki temperatury miały być cyfrowe, ponieważ taki warunek ja postawiłem, bo ten projekt wcisnąłem pomiędzy inny, więc nie miałem zbyt wiele czasu na zabawę. Na początku myślałem o czujnikach DS, ale tak się jakoś złożyło, że tam gdzie kupowałem elementy były tylko czujniki 9 bitowe. W związku z tym szybko poszukałem i znalazłem czujniki TC77 (patrz załącznik). Przyznam szczerze, że dokumentacja tych czujników bardzo mi się podobała ze względu testy i wykresy, ale także podobały mi się parametry 13 bitowy wynik, rozdzielczość 0.0625 itp. Wadą czujników jest więcej przewodów do sterowania, ale mi to nie przeszkadzało.

    5. Dokładność termometru miała być najlepiej lepsza niż +/- 0.5'C, a z tym to już problem. Wujek taki wynik chciał, a ja nie byłem w stanie czegoś takiego idealnie zrobić w całym zakresie bez kalibracji czujnika. W związku z tym wujek zaproponował żeby zrobić opcję kalibracji a on sobie sam to skalibruje. Nie wiem jak to zrobi, ale ja już w to nie wnikam i opcję kalibracji zrobiłem.

    6. Rozdzielczość pomiaru 0.1'C

    7. Zakres pomiarów temperatur ustawiony został ostatecznie na od -30 do +100'C (tak chciał wujek)

    8. Termometr niezależny, całkowicie konfigurowalny bez użycia komputera itp.

    9. Rejestr temperatur (patrz możliwości termometru)

    Możliwości termometru opisane zostały w instrukcji obsługi, ale przedstawię je w skrócie:
    1. Kalibracja oparta o 28 punktów pomiarowych dla każdego czujnika. Ilość punktów może wynosić maksymalnie 28, a minimalnie 0 (wtedy czujnik pracuje bez żadnej kalibracji). Od użytkownika zależy ile punktów wpisze. Punkty te potem służą do wyznaczenia interpolacji liniowej




    2. Wpisy punktów kalibracji mogą być:
    a) ręczne (na podstawie spisu wartości) co jest przydatne jeśli coś się stanie z EEPROMem, a my będziemy mieli spisane na kartce wszystkie wartości
    b) półautomatyczne - ustawiasz czujnik w określonej temperaturze i na wyświetlaczu ustawiasz tę temperaturę
    3. Możliwość przeglądania i usuwania punktów kalibracji
    4. Przywracania domyślnych ustawień (bez kalibracji i wyzerowanie rejestrów temperatur)
    5. Przywracanie domyślnych wartości EEPROM (wypełnienie jej wartościami 0xFF)
    6. Dodatkowo oprogramowanie zostało wyposażone w funkcję zabezpieczającą EEPROM gdyby część danych niespodziewanie uleciała mimo ustawionych bitów BOD. Zabezpieczenie dzieli się na dwie części
    a) sprawdza poprawność danych w pamięci EEPROM (bit parzystości dla każdego bajtu oraz suma kontrolna)
    b) naprawia dane w pamięci EEPROM korzystając z kopii danych
    7. Zabezpieczenie, gdyby jakimś cudem dane w pamięci RAM uleciały. Wówczas na podstawie sumy kontrolnej i bitów parzystości układ stwierdza że dane są błędne i odczytuje je ponownie z pamięci EEPROM
    8. Możliwość przeglądania temperatur minimalnych i maksymalnych dla każdego z czujników z osobna (rejestry temperatury).
    9. Możliwość kasowania rejetrów temperatur (każdego z osobna)
    10. Trzy rejestry temperatur dla każdego z czujników. Każdy z nich można wykasować z osobna. Każdy z nich zawiera informację o temperaturze minimalnej i maksymalnej. Rejestry te mogą być wykorzystane np. wg poniższego schematu dla czujnika zewnętrznego
    * pierwszy rejestr będzie mierzył temperaturę w ciągu 24 godzin
    * drugi rejestr będzie mierzył temperaturę w ciągu 7 dni
    * trzeci rejestr będzie mierzył temperaturę w ciągu miesiąca
    Oczywiście działanie rejestrów wg powyższego schematu obowiązuje tylko wtedy, kiedy użytkownik sam zadba o kasowanie rejestrów pierwszego po 24 godzinach, drugiego po 7 dniach i trzeciego po miesiącu.

    Kod źródłowy to efekt 4 dni pracy wieczorami. Strasznie ciężko było wszystko upchać mimo optymalizacji -Os, dlatego mniejsza część kodu jest napisana w ASM, a reszta w C, przy czym kod w C również był miejscami optymalizowany poprzez tworzenie dodatkowych funkcji optymalizujących. W związku z tym, że się spieszyłem, to kod źródłowy zawarłem w dwóch plikach, nie bawiąc się szczególnie z jego ładnym podzieleniem. Jest jedna konwencja, której mogłem nie stosować i przez to zoptymalizować kod i pewnie trochę bym zaoszczędził, ale do końca nie wiedziałem, czy przypadkiem to co zrobiłem z zastosowaniem tej konwencji się nie przyda. Po prostu miejscami przekazuje wskaźniki do globalnych zmiennych a to oznacza, że funkcje w sumie nie korzystają z nich bezpośrednio. A tak poza tym to pisząc przyjąłem zasadę, że ma się zmieścić wszystko to co chcę i nie będzie żadnych ulg ani uproszczeń. To tyle jeśli chodzi o kod źródłowy. Resztę można poznać przeglądając go, bo zadbałem o trochę komentarzy.

    Pełna dokumentacjia projektu dostępna jest w załącznikach. Punktację za załączniki przyjąłem następującą:
    * Wszystkie pliki tylko do pooglądania na temat projektu przed planem jego wykonania dostępne są za 0 punktów prowizji dla mnie
    * Wzory płytek do pooglądania dostępne są na zdjęciach (raczej tylko można je oglądać :) )
    * Wszystkie pliki, które być może posłużą komuś do wykonania takiego samego projektu zostały obłożone niewielką opłatą, ponieważ trochę musiałem się natrudzić żeby to wszystko ładnie opisać, narysować, przygotować na forum i dlatego, że rzadko kto udostępnia wszystko razem ze źródłami (a nie tylko HEX)

    Dodatkowe informacje, dla osób pytających i oceniających:
    1. Brak obudowy i zasilacza został uzasadniony wyżej
    2. Stabilizator 7805 został położony żeby nie wystawał ponad wyświetlacze
    3. Dwa stabilizatory zostały użyte, ponieważ czujnik temperatury lubi stabilne zasilanie jak wynika z jego karty katalogowej, więc uznałem, że lepiej odseparować go od reszty
    4. Prąd segmentów: od 7.5mA do 8.5mA w zależności od ilości świecących segmentów (8.5mA na segment przy świecących 8 segmentach oraz 7.5mA na segment przy świecących wszystkich 64 segmentach i kropkach) oraz dobranych oporników ILED* (patrz schemat, w moim przyp. oporniki mają tylko 47ohm). Test przeprowadzony na małym zasilaczu 500mA. Przy 48 segmentach prąd na segment to nadal około 8.5mA, więc to mogła być wina zasilacza i przy 64 segmentach się nie wyrabiał.
    5. Segmenty zielone świecą minimalnie słabiej, bo dla obu wyświetlaczy zastosowałem takie same oporniki ILED*, ale to jest szczegół, który każdy może poprawić w swoim zakresie jak skorzysta z dokumentacji i złoży kopię. Ja tego nie poprawiałem, bo różnica jest nieznaczna a nie miałem na to czasu (i tak siedziałem za długo :P).
    6. Żaden tranzystor SMD ani przewlekany się nie grzeje. Jednym elementem, który się nagrzewa, jest stabilizator. Obniżenie temperatury stablizatora można osiągnąć przez zastosowanie stabilizatora LDO (trochę droższy, a ja miałem limit więc u mnie jest normalny). Wtedy można obniżyć napięcie zasilania a co za tym idzie straty na stabilizatorze w termometrze.

    Podsumowanie:
    - Termometr na dwóch czujnikach i dwóch wyświetlaczach LED
    - Wykonanie ok 42zł bez zasilacza i obudowy
    - Płytka drukowana o wymiarach 84x97mm
    - Możliwość kalibracji i uzyskania dobrej dokładności w pełnym zakresie mierzonych temperatur
    - Rejestry temperatur minimalnych i maksymalnych po 3 na każdy czujnik
    - Sterowanie przy pomocy dwóch klawiszy
    - Zasilanie stabilizowane 8V najlepiej 1A
    - Zakres temperatur -30'C do 100'C z możliwością zmiany poprzez zwężenie lub rozszerzenie zakresu poprzez kod źródłowy

    I to w zasadzie tyle jeśli chodzi o opis, uzasadnienia itp. Na sam koniec mała galeria, czy to co lubimy najbardziej :). Mam nadzieję tylko, że nikt mnie nie zapyta dlaczego na LED :P

    PS. mam nadzieję, że niczego nie zapomniałem zamieścić z dokumentacji :).

    00 - Wydruk na papierze kredowym.jpg
    01 - Odbicie na płytce.jpg
    02 - Trawienie.jpg
    Termometr na wyśw. LED z kalibracją i nie na DS18 Termometr na wyśw. LED z kalibracją i nie na DS18 Termometr na wyśw. LED z kalibracją i nie na DS18

    03 - Płytka wytrawiona.jpg
    04 - Maska, zdrapana.jpg
    05 - Płytka po docięciu.jpg
    Termometr na wyśw. LED z kalibracją i nie na DS18 Termometr na wyśw. LED z kalibracją i nie na DS18 Termometr na wyśw. LED z kalibracją i nie na DS18

    06 - Płytka od strony ścieżek.jpg
    07 - Płytka od strony elementów.jpg
    08 - Czujniki temperatury.jpg

    Termometr na wyśw. LED z kalibracją i nie na DS18 Termometr na wyśw. LED z kalibracją i nie na DS18 Termometr na wyśw. LED z kalibracją i nie na DS18

    09 - Jak świeci.jpg
    Termometr na wyśw. LED z kalibracją i nie na DS18


    Uaktualniłem kod, bo zawierał błąd (18.10.2008).


    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
  • #3 16 Paź 2008 00:06
    szeryf.rm
    Poziom 22  

    nie ACT to nie konieczność, może być HC, HCT, AC, ACT, byle tylko nie prądożerne LS itp. Owszem, ułatwia sterowanie, bo wtedy multiplekserować trzeba nie 8 znaków a jedynie po 4 znaki. Zaleta jest taka, że przy 8 prąd w impulsie na segment musiałby być ponad 2 razy większy (zależność nie jest w pełni proporcjonalna) niż przy 4. A poza tym nie lubię jak przy multiplekserowym sterowaniu sterowanych jest więcej niż 5, 6 diod.

    No i pozostaje jeszcze kwestia kosmetyki logicznej układu oraz kodu i optymalizacji czasu procesora. Przy 4 przerzuceniach przerywanie wywołuje się 4 razy na jedno pełne odświeżenie wyświetlacza. Wyświetlacz odświeżam z częstotliwością ponad 100Hz, a to oznacza że przerywanie pracuje z częstotliwością ponad 400Hz. Gdyby nie rejestr to częstotliwości musiałyby być dwa razy większe.

    Czyli wszystkiego po trochę :). A tak poza tym zapomniałem dodać na początku, że całość powstała za pierwszym razem, a więc projekt wszystkiego musiał być pewniakiem. Rejestr dawał poczucie pewności, że są większe szanse że nie ma błedu.

  • #4 16 Paź 2008 08:46
    kaleb
    Poziom 2  

    Czy mógłbyś napisać czym robisz tzw. soldermaskę?

  • #5 16 Paź 2008 08:47
    szeryf.rm
    Poziom 22  

    Farba ensolder, do zakupu np. na allegro.

  • #7 16 Paź 2008 14:22
    _milcek_
    Poziom 19  

    mlassota napisał:
    Witam
    Mam pytanie dotyczące kalibracji - jak jest obliczana
    Rozumie, że program porównuje punkty zmierzone do wprowadzonych ale jak wyliczana jest poprawka?
    Pozdrawiam
    M

    Kalibracja w tym przypadku jest to przyłożenie czujnika do źródła ciepła o znanej nam temperaturze i ustawienie tej temperatury w programie by taka sama była na wyświetlaczu. Jeżeli zadajesz pytanie to najpierw zapoznaj się z tym co napisał autor w tym przypadku w instrukcji.

    Moderowany przez androot:

    Jeśli udzielasz odpowiedzi, to na temat. Czytając najpierw o co chodzi autorowi pytania.

  • #8 16 Paź 2008 14:46
    mlassota
    Poziom 18  

    _milcek napisał:
    Kalibracja w tym przypadku jest to przyłożenie czujnika do źródła ciepła o znanej nam temperaturze i ustawienie tej temperatury w programie by taka sama była na wyświetlaczu. Jeżeli zadajesz pytanie to najpierw zapoznaj się z tym co napisał autor w tym przypadku w instrukcji.


    Witam
    Instrukcje czytałem :) - nie tylko tą i w życiu nie jedna kalibrację przeprowadziłem - z tym że:
    Standardowo bierze sie 20-50 punktów i wykreśla krzywą (prostą) kalibracyjną - w zależności od kalibrowanego czujnika.
    Można też wyliczyć wzór w prostej w postaci y=ax+b i z tego wzoru odczytywać poprawkę przy danym zakresie
    Moje pytanie nie dotyczyło jak kalibrować ten termometr tylko na jakiej zasadzie realizowana jest programowo kalibracja czyli jak program (w jaki sposób) wylicza poprawkę
    Pozdrawiam
    M

  • #9 16 Paź 2008 16:49
    Mariusz25183
    Poziom 12  

    Farba do maski jest dostępna na allegro u kolegi markosik20.
    http://www.allegro.pl/show_user_auctions.php?uid=76426
    Na tym forum można niekiedy również spotkać tematy jak i posty kolegi Marka.
    https://www.elektroda.pl/rtvforum/viewtopic.ph...ghlight=&sid=ed9d03d5544b60524bb4f2d5fe301643
    Projekt bardzo ciekawy. Udostępniony kod źródłowy jak dla mnie opracowany bardzo szczegółowo. Oby tak dalej.

  • #10 16 Paź 2008 17:30
    badworm
    Poziom 18  

    szeryf.rm napisał:

    5. Dokładność termometru miała być najlepiej lepsza niż +/- 0.5'C, a z tym to już problem. Wujek taki wynik chciał, a ja nie byłem w stanie czegoś takiego idealnie zrobić w całym zakresie bez kalibracji czujnika. W związku z tym wujek zaproponował żeby zrobić opcję kalibracji a on sobie sam to skalibruje. Nie wiem jak to zrobi, ale ja już w to nie wnikam i opcję kalibracji zrobiłem.


    Ktoś chyba nie wie, czego oczekuje. Dokładność poniżej 0,5*C to już naprawdę dobry wynik i ciężko coś takiego osiągnąć w warunkach domowych. Kto nie wierzy nie poszuka na pl.misc.elektronika - niedawno toczyła się tam dyskusja na temat czujnika o dokładności 0,1*C.

  • #11 16 Paź 2008 18:05
    szeryf.rm
    Poziom 22  

    badworm masz rację, ja o tym wiem. Ale prawda jest taka, że prawdopodobnie wujek przyjmie najprostszą zasadę wg której weźmie jakiś większy termometr rtęciowy (żeby skala była większa) i z nim skalibruje korzystając poprostu z warunków w jakich jeden i drugi będzie wisiał. Dlatego dokładność może być te 0,5'C ale względem wzorca, co nie znaczy że wzorzec będzie dobry. Jak już napisałem, nie moja to rzecz :), ja jedynie zrobiłem jak mnie prosił, a przy okazji twój post i może inne go trochę zmotywują lub zniechęcą, bo mi nie chciał wierzyć :).

    mlassota, kalibracja czujnika oparta jest na liniowej interpolacji. Oznacza to, że w przedziałach wyznaczonych przez punkty kalibracji oraz punkty standardowe minimalnej i maksymalnej temperatury tworzona jest funkcja liniowa. Załóżmy, że mamy 3 punkty ze zmierzoną temperaturą. Oznaczamy je kolejno A, B, C w porządku rosnącym względem pomiarów. Oznacza to, że dzielą one cały zakres na 4 części:
    1. od -30'C do A
    2. od A do B
    3. od B do C
    4. od C do 100'C
    Wartości dla -30 i 100'C są standardowe dla tego czujnika i nie podlegają zmianie. Teraz można połączyć liniami prostymi wszystkie 4 przedziały. W ten sposób dla każdego z przedziałów może być inna funkcja liniowa y=ax+b i jak pojawia się pomiar to wyszukujemy odpowiedni zakres, podstawiamy i mamy wynik.
    Oczywiście w rzeczywistości przedziały nie dotyczą temperatur a wskazań czujnika ale tutaj było proście przedstawić to w taki sposób.
    W przypadku kiedy czujnik jest w ogóle nie skalibrowany opieram się na zależności podanej przez producenta w całym przedziale, czyli y=0.0625x, w przypadku jednego punktu pomiarowego funkcja opiera się na zależności y=0.0625x+b. W przypadku większej liczby punktów algorytm przedstawiłem powyżej.
    UWAGA! Kod źródłowy (dla osób, które próbowałyby się w niego zagłębiać) oraz sam termometr operuje na wartościach tylko dodatnich, a czujnik również na ujemnych. Dlatego ja używam w kodzie wartości z czujnika + stała KOREKTAABS. Podobnie sprawa wygląda z temperaturą, która również w rejestrach i obliczeniach jest tylko dodatnia a potem jest sumowana z wartością stałej TEMP_MIN. Wynik na termometrze jest prawidłowych, choć obliczenia przeprowadzane są na wartościach podniesionych o stałe. To tak dla informacji.

    PS. wujek tylko nie kłóć się ze mną na forum :P, bo moderatorzy nas rozdzielą! A ja przecież nic złego nie powiedziałem! heheh

  • #12 16 Paź 2008 19:29
    Sydnej
    Poziom 13  

    Witam! Czy płytkę robiłeś w Eaglu ? Jeżeli tak, to mam pytanko. Jak robisz żeby miejsca między ścieżkami były wypełnione i połączone z masą ?? Ogólnie widać że znasz się na rzeczy. Pozdrawiam i życzę więcej takich konstrukcji

  • #13 16 Paź 2008 19:38
    szeryf.rm
    Poziom 22  

    Nie, projekt robiony w kicad'zie, czyli trzeba się było trochę nagrzebać. A w tym konkretnym przypadku te wypełnione miejsca nie są połączone z masą ani z niczym. To po prostu wypełniacze, bo masa musiałaby być specjalnie doprowadzona, a to już nie było aż tak niezbędne.

  • #14 16 Paź 2008 21:00
    nojmi
    Poziom 20  

    Sydnej napisał:
    Witam! Czy płytkę robiłeś w Eaglu ? Jeżeli tak, to mam pytanko. Jak robisz żeby miejsca między ścieżkami były wypełnione i połączone z masą ??


    Zainteresuj się poleceniem polygon.

  • #15 17 Paź 2008 16:27
    Diesel.Benz
    Poziom 12  

    witam jakiej maks wielkosci można dać wyświetlacze?

  • #16 17 Paź 2008 17:41
    szeryf.rm
    Poziom 22  

    djbarteez napisał:
    witam jakiej maks wielkosci można dać wyświetlacze?

    Nie rozumiem do końca. Jak na podstawie schematu zaprojektujesz płytkę i podniesiesz zasilanie to możesz dać nawet wielkie 10cm a nawet jeszcze jakieś swoje na LEDach itp. Natomiast u mnie zostały zastosowane wyśw., które można kupić w PL i wielkość świecącej cyfry to ~14.2mm, a wyświetlacza całego ~19mm.