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

[Miniprojekt] Energooszczędny 2-punktowy termometr LCD

lechoo 13 Maj 2009 16:37 13773 37
  • [Miniprojekt] Energooszczędny 2-punktowy termometr LCD

    Ten prosty, dedykowany początkującym, projekcik powstał gdy potrzebowałem jednoczesnego pomiaru temperatury w 2 punktach innego układu elektronicznego. Jak to się mówi "potrzeba jest matką wynalazków" - i tak też było w tym przypadku.
    Zmontowanie układu, napisanie programu i uruchomienie zajęło ok. 2h. Z tego względu program powstał w Bascomie, chociaż osobiście za nim nie przepadam... Nie obyło się bez drobnego problemu - początkowo chciałem użyć w układzie kwarcu 4,19MHz, ale Bascom wypiął się na mnie i stwierdził, że to za mało aby pogadać sobie z czujnikami przez 1WIRE. Ten sam program w C byłby objętościowo ze 3 razy mniejszy i działałby na niższym taktowaniu (mniejszy pobór prądu przy niższym zegarze), ale tu miałem gotowe procedury obsługi 1WIRE.
    Ogólnie układ to nic odkrywczego, użyłem tego co miałem pod ręką: mikrokontrolera AT89C2051, stabilizatora napięcia 78L05, 2 czujników DS18B20 i wyświetlacza LCD 16x1. Całość zmontowałem na małym kawałku płytki uniwersalnej, przylutowanej później bezpośrednio do wyświetlacza.
    Magistrala 1WIRE została zabezpieczona przed przepięciami przy użyciu diod Schottky'ego, a całość zasilana jest z baterii 9V. Dzięki wykorzystaniu instrukcji IDLE procesora pobór prądu wynosi około 5mA, dla porównania bez oszczędzania energii układ pobierał 10mA. Pomiar temperatury odbywa się co 1 sekundę.
    W załączeniu zamieszczam schemat, program z komentarzami i kilka fotografii układu.

    Edycja 2009-07-02:
    Zamieściłem wersję 2.1 programu z poprawnym wyświetlaniem ujemnych temperatur.

    Fajne? Ranking DIY
    O autorze
    lechoo
    Poziom 39  
    Offline 
    lechoo napisał 5156 postów o ocenie 531, pomógł 377 razy. Mieszka w mieście łódzkie. Jest z nami od 2002 roku.
  • #2 6537204
    lucyferus23
    Poziom 14  
    Takie pytanie. Czy diodę 1N5817 można zamienić na diodę 1N5819, też ma 1A tylko napięcie do 40V.
  • #3 6537400
    lechoo
    Poziom 39  
    Tak oczywiście - można użyć dowolnych diod Schottky'ego 1A, mogą to być również małosygnałowe diody Schottky'ego np. BAT85.
  • #4 6537447
    Piotr59mb
    Poziom 19  
    Mogę podłączyć wyświetlacz 2x16?
  • #5 6537996
    lechoo
    Poziom 39  
    Możesz, tylko zmień w programie typ wyświetlacza i skompiluj go ponownie.
    Pozdrawiam :)
  • #6 6538155
    Piotr59mb
    Poziom 19  
    Z tym będzie problem, bo nie potrafie pisać w basomie...
  • #7 6538752
    lechoo
    Poziom 39  
    Trzeba tylko zmienić linijkę:
    Config Lcd = 16 * 1a
    na:
    Config Lcd = 16 * 2
  • #8 6538950
    Piotr59mb
    Poziom 19  
    Tylko nie można go skompilować na AT89C2051
  • #9 6538991
    lechoo
    Poziom 39  
    Jak to nie można? Czy na pewno używasz Bascoma 8051?
  • #10 6540419
    Piotr59mb
    Poziom 19  
    Fakt, już wszystko gra, dzięki.
    Mam jeszcze jedno pytanie.
    Czy mogę użyć kwarcu 6MHz? Wnioskuję, że jeśli się da to trzeba będzie znowu zmienić coś w programie.

    Edit.
    Z racji, iż nie przepadam za płytkami uniwersalnymi, zaprojektowałem PCB. Mógłby ktoś sprawdzić czy nie przeoczyłem czegoś. Jeśli schemat będzie poprawny, dam czysty PCB. Płytka ma wymiary ok 56x33mm

    (w moim wyświetlaczu, +5V jest na 1 pinie a GND na 2, odwrotnie niż w przypadku niektórych wyświetlaczy. Jeśli ktoś będzie chciał mogę przerobić schemat na 14 pinów w jednym rzędzie)
  • #11 6546328
    lechoo
    Poziom 39  
    Z kwarcem 6MHz nie sprawdzałem gdyż nie miałem takiego pod ręką i już nie sprawdzę - odlutowanie płytki od wyświetlacza byłoby zbyt kłopotliwe. Jeśli zadziała to jedyną różnicą będą nieco rzadziej następujące pomiary temperatury.
    Układ powstał na płytce uniwersalnej gdyż nie było czasu na projektowanie druku, wytrawianie itd...
  • #12 6707265
    Piotr59mb
    Poziom 19  
    lechoo, na mikrokontrolerze znajdzie się jeszcze miejsce, żeby napisać program, aby na wyświetlaczu była wyświetlana godzina?
  • #13 6711412
    lechoo
    Poziom 39  
    Nie - dostało zaledwie 300 bajtów wolnej pamięci programu, a to za mało na takie dodatki.
  • #14 6714069
    Piotr59mb
    Poziom 19  
    Dołączam mój termometr z projektu lechoo
    Płytka po wytrawieniu:
    [Miniprojekt] Energooszczędny 2-punktowy termometr LCD
    Płytka z elementami i wyświetlaczem:
    [Miniprojekt] Energooszczędny 2-punktowy termometr LCD
    Uruchomienie:
    [Miniprojekt] Energooszczędny 2-punktowy termometr LCD

    PS. lechoo, dlaczego poniżej 0*C wyświetla mi 255*C i dopiero ta temperatura spada powoli w dół?
    PS2. A jeżeliby napisać program w ASM to 'zmieściłby' się ten zegar?
  • #15 6732071
    lechoo
    Poziom 39  
    Brawo Piotr59mb za spostrzegawczość, nie miałem potrzeby mierzenia ujemnych temperatur i dlatego nie zwróciłem uwagi na ten błąd... Poprawiony program zamieściłem w pierwszym poście.
    Do wprowadzenia opisywanych przez Ciebie zmian wystarczyłoby przepisanie programu w języku C, ale ja nie mam czasu się z tym bawić, dlatego właśnie ten prosty projekcik powstał w Bascomie, a nie w C czy asemblerze...
  • #16 6732673
    Piotr59mb
    Poziom 19  
    Witam.
     1wreset                                                      'reset magistrali 1WIRE
     Writeid1                                                     'wybór czujnika 1
     Read18b20                                                    'odczytaj dane z 1WIRE
     Locate 1 , 2                                                 'ustawienie kursora
     If T < 0 Then Lcd "-"                                        'znak - jeśli ujemna
     T = Abs(t)                                                   'obliczenie wart. bezwzględnej
     T1 = T / 10                                                  'część całkowita
     T2 = T Mod 10                                                'część ułamkowa
     Upperline
     Lcd "Temp: " ; T1 ; "." ; T2 ; Chr(0) ; "C "                 'wyśw. temperatury na LCD
     Lowerline
     Lcd "  Milego Dnia!  "
    

    Dobrze dopisałem te "Temp" i "milego dnia" ?
    Nie mam jak sprawdzić bo w programatorze jakims cudem spaliłem ostatniego AT89C2051
  • #17 6739029
    lechoo
    Poziom 39  
    Te dodatkowe napisy powinny być wyświetlone jednorazowo tuż przed główną pętlą Do - Loop, zaś pozycję wyświetlania temperatury należy przesunąć w prawo o długość napisu "Temp:" - instrukcja Locate.
    Jakiego programatora używasz, że pali Ci scalaki?
  • #18 6740286
    KokiX
    Poziom 20  
    Witam, co dopiero początkuję, więc interesuje się małymi schematami. Jaki jest koszt takiego termometru i jak długo trzyma bateria?
  • #19 6801518
    Piotr59mb
    Poziom 19  
    Używam Progat z praktycznego elektronika 4/99.
    Nie wiem co się stało, ale po podłączeniu komputer się zawiesił a atmel już nie ruszył :|
    Wcześniej programował bez zająknięcia

    KokiX napisał:
    Witam, co dopiero początkuję, więc interesuje się małymi schematami. Jaki jest koszt takiego termometru i jak długo trzyma bateria?

    Koszty zakupu (orietacyjnie)
    DS18B20 - 7.50zł
    AT89C2051 - ok. 4zł
    LCD - 10zł (allegro)
    pozostałe elementy to rezystory i kondensatory - max 2-3zł

    Ja tymczasowo używam baterii Vinnic 12V "L1028" o pojemności 60mAh, jak zrobię obudowe to wsadzę mały transformator ew. podłącze jakiś mały zasilacz

    i krótka piłka... Jak przerobić program pod Attiny2313 ?
  • #20 6819761
    lechoo
    Poziom 39  
    Piotr59mb napisał:
    Jak przerobić program pod Attiny2313 ?

    Trzeba zmienić w programie wszystkie elementy charakterystyczne dla mikrokontrolerów AVR, np. oznaczenia poszczególnych pinów, deklarację układu, itp.
  • #21 6840023
    wzk
    Poziom 19  
    BASCOM generuje prawidłowy kod do obsługi 1wire tylko dla częstotliwości zegarowej 12 MHz.
    Dla przeanalizowania tego przypadku przytaczam poniżej procedurę odczytu bajtu z linii 1wire przetransponowaną żywcem z BASCOMa do assemblera.

    ;*****************************************************************************
    ; Odczyt 8 bitow z urzadzenia 1wire, poczatkowo dla odczytu ACC = 0FFh
    ReadByte1wire:
    	push	B		     ; B na stos
    	mov	B,#8		  ; liczba bitow do odczytu
    Loop:	rrc	A		   ; obrot ACC przez CY
    	acall	ReadBit1wire	; odczyt wartosci bitu
    	djnz	B,Loop		  ; czy ostatni bit bajtu?
    	rrc	A		      ; ostatni cykl obrotu ACC przez CY
    	pop	B		     ; odtworzenie B
    	ret
    ;*****************************************************************************
    ReadBit1wire:
    	clr	Pin1wir		    ; zainicjowanie odczytu bitu, linia 1wire w stanie "0"
    	nop			      ; odczekanie kilku cykli maszynowych
    	nop
    	nop
    	nop
    	nop
    	mov	Pin1wir,C	; uruchomienie podciagania do "1" linii 1 wire
    	nop			     ; ponowne odczekanie kilku cykli maszynowych
    	nop
    	nop
    	nop
    	nop
    	nop
    	nop
    	nop
    	mov	C,Pin1wir	; mija 15 us od inicjacji, czas najwyzszy na probkowanie linii
    	push	B		    ; B na stos
    	mov	B,#12h		; czas zwloki = 36 us
    	djnz	B,$		    ; petla zwloki
    	pop	B		    ; odtworzenie B
    	setb	Pin1wir		  ; ostateczne wymuszenie "1" na linii 1wire
    	ret
    ;*****************************************************************************
    

    Zastosowanie innej częstotliwości niż 12 MHz powoduje przesunięcie okienka próbkującego poza ramy wyznaczone przez protokół komunikacyjny 1wire i możliwość błędów. Dla innej częstotliwości zegarowej pozostaje więc tylko assembler. :)
    Jak jest w C - nie analizowałem.
  • #22 6860319
    Piotr59mb
    Poziom 19  
    Tzn. Przy kwarcu 8Mhz wynik pomiarów będzie błędny, dobrze zrozumiałem?
  • #23 6861197
    wzk
    Poziom 19  
    Najprawdopodobniej zostanie błędnie odczytana sygnatura czujnika i program uzna, że brak czujnika.
    Gdyby wykrył czujnik, to w innej temperaturze zależności czasowe w czujniku mogą spowodować nienormatywną generację stanu "0" i tym samym błędy odczytu temperatury.
  • #24 6862521
    Piotr59mb
    Poziom 19  
    Jeszcze takie jedno pytanko...
    Jak ustawić fusebit'y?

    edit:
    Dodałem napisy "Witaj!", "Miłego Dnia!" i "Temp:"
    Problem w tym, że przy ujemnej temperaturze, minus pojawia się przed "Temp:" Jak zrobić, aby był przed wynikiem pomiaru (po napisie "Temp:')?
    Upperline
    Lcd "     Witaj!     "
    Lowerline
    Lcd "  Milego Dnia!  "
    
    Do
     1wreset                                                      'reset magistrali 1WIRE
     1wwrite &HCC                                                 'rozkaz SKIP_ROM
     1wwrite &H44                                                 'rozkaz CONVERT_T dla wszystkich
    
     Wait1s                                                       'czekaj 1 sek.
    
     1wreset                                                      'reset magistrali 1WIRE
     Writeid1                                                     'wybór czujnika 1
     Read18b20                                                    'odczytaj dane z 1WIRE
     Locate 1 , 2                                                 'ustawienie kursora
     If T < 0 Then Lcd "-"                                        'znak - jeśli ujemna
     T = Abs(t)                                                   'obliczenie wart. bezwzględnej
     T1 = T / 10                                                  'część całkowita
     T2 = T Mod 10                                                'część ułamkowa
     Lcd " Temp: " ; T1 ; "." ; T2 ; Chr(0) ; "C  "               'wyśw. temperatury na LCD
  • #25 6890794
    gorajt
    Poziom 2  
    Locate 1 , 8                                                 'ustawienie kursora
     If T < 0 Then Lcd "-"                                        'znak - jeśli ujemna
     T = Abs(t)                                                   'obliczenie wart. bezwzględnej
     T1 = T / 10                                                  'część całkowita
     T2 = T Mod 10
    locate 1 , 1                                                'część ułamkowa
     Lcd " Temp: " ; T1 ; "." ; T2 ; Chr(0) ; "C  "               'wyśw. temperatury na LCD
    
    


    to powinno pomóc na znak minus.

    A odnośnie fussbit'ów to polecam stronę:
    http://www.voytek.tkdami.net/programy/programy.html

    mi pomaga.
  • #26 6896660
    lechoo
    Poziom 39  
    Ramy czasowe obsługi 1-Wire są dosyć elastyczne, niemniej zbyt duża odchyłka od zalecanej wartości (12MHz) będzie oczywiście powodować generowanie błędów.
    W układach 89C2051 nie ma żadnych fusebitów, są tylko bity zabezpieczające układ przed odczytaniem programu, ale te zwykle nas nie interesują i nie trzeba ich programować.
  • #27 7382803
    Asteroid
    Poziom 20  
    Witam Ja mam takie pytanko ponieważ chciałbym podłączyc wyświetlacz 2 x 16. Chciałbym aby mozna wyświetlic w 1 linijce np. Temperatura 1 a w drugiej Temperatura 2. Tylko mam pytanie czy trzeba dodatkowe piny Lcd podłączyc aby wyswietlic napisy w 2 linijce. Jesli trzeba to poprosze o opis jak podłączyc dodatkowe piny. Pozdrawiam
  • #28 7383127
    lechoo
    Poziom 39  
    @Asteroid
    Układ połączeń będzie bez zmian, trzeba tylko wprowadzić drobne poprawki w programie.
  • #30 7420005
    PM090383
    Poziom 12  
    Mam pytanie poniewaz mam problem z zakupem diod 1N5817 sprawa jest o tyle pilna że musze zmontowac to na jutro. Czy moge zastosowac diody 1N5822 a może jeszcze jakieś inne dopasowac albo zmodyfikowac schemat. Koledzy napiszcie co najlepiej zrobic
REKLAMA