Minitermometr Uniwersalny


9.6
Ocena: None Średnia: 9.6 (10 głosujących)

Opisywany tutaj układ jest uniwersalnym termometrem dwukanałowym. Pracuje on w zakresie temperatur od -50.0 do +99.9 stopni. Układ został zaprojektowany do mierzenia temperatury w domu i na dworze ale z powodzeniem można dla niego znaleźć wiele innych zastosowań. Po zmianie oprogramowania urządzenie może pełnić funkcję prostego termostatu, lub bardziej złożonego regulatora temperatury. Układ został zbudowany w oparciu o popularny, często stosowany czujnik/czujniki DS18B20 i mikrokontroler ATTiny2313 co znacznie uprościło jego konstrukcję i zmniejszyło wymiary. Termometr udało się tak skompresować, że prawie wszystkie elementy mieszczą się pod typowym wyświetlaczem 3-cyfry o wysokości rzędu 15mm. Projekt jest rozwinięciem układu dostępnego tutaj z tym że prawie wszystkie elementy zostały zmienione na komponenty SMD. Oczywiście można by było upakować bardziej elementy przewlekane jednak w dobie miniaturyzacji lepiej zrobić jeden krok dalej, budując układ o możliwie najmniejszych wymiarach. Daje to możliwość zamontowania gotowego modułu termometru lub prostego termostatu w już istniejące urządzenie lub zastosowanie obudowy niewiele większej od wyświetlacza. W wersji podstawowej termometr potrafi mierzyć dwie temperatury, wykorzystując dwa czujniki podłączone na niezależnych magistralach. Zmiany wyświetlanej aktualnie temperatury dokonuje się za pomocą dwóch przycisków.

Projekt został opublikowany w Elektronice dla Wszystkich 08/2011 i jest dostępny w postaci kitu AVT2985

Działanie:


Schemat ideowy układu znajduje się na rysunku poniżej:

Sercem urządzenia jest mikrokontroler U1 (ATTINY2313), który pracuje na wewnętrznym oscylatorze, bez dzielnika częstotliwości. Daje to w efekcie taktowanie 8MHz. Brak rezonatora kwarcowego pozwolił zmniejszyć płytkę a dodatkowo umożliwił wykorzystanie wolnego pinu XTAL jako portu wejściowego PA0, do którego obecnie dołączony jest przycisk S2. Zadaniem mikrokontrolera jest odczyt pomiaru temperatury z dwóch czujników, przeliczanie wskazań do postaci dogodnej dla wyświetlania i obsługa przycisków S1 i S2. Kondensator C1 (100nF), umieszczony blisko mikrokontrolera filtruje jego napięcie zasilania podobnie jak kondensatory C2 (10uF) i C3 (10uF), które są konieczne do prawidłowej pracy stabilizatora U3 (78L05).

Prostota układu wynika z zastosowanego czujnika temperatury, którym tym przypadku jest Ds18B20. Stanowi on w typowym ustawieniu 12-bitowy termometr cyfrowy mogący pracować w zakresie -55 do +125 stopni. Czas przetwarzania (konwersji) temperatury do wartości binarnej (liczby) trwa nie dłużej niż 750ms. Odczyt temperatury jest w pełni cyfrowy, a łączność z mikrokontrolerem zapewnia popularna magistrala 1-Wire.

Do prezentacji temperatury wykorzystywany jest trój-cyfrowy wyświetlacz LED (AT5636BMR-B) z wewnętrznie połączonymi segmentami, przystosowanymi do multipleksowania. Znakomicie ułatwia to proces projektowania płytki. W tym przypadku zastosowanie trzech pojedynczych wyświetlaczy uniemożliwiło by wykonanie taniej jednostronnej płytki drukowanej. Rezystory R4-R11 ograniczają prąd wyświetlacza LED do wartości maksymalnej rzędu 10-12mA (na segment). Średni prąd będzie jednak mniejszy ze względu na multipleksowanie. Do sterowania anodami wyświetlacza wykorzystywane są trzy popularne tranzystory T1-T3 (BC857). Ich prądy baz ograniczane są przez rezystory R1-R3 (3,3k). Zaświecanie cyfr na kolejnych wyświetlaczach odbywa się poprzez cykliczne podawanie stanu niskiego na bazę jednego z tranzystorów T1-T3. W tej same chwili na porcie B mikrokontrolera powinna pojawić się zakodowana wartość odzwierciedlająca wyświetlany znak.

Ważnym komponentem jest tutaj złącze GP1, które stanowi jednocześnie miejsce podłączenia czujników oraz wyjście sterowania (w przypadku budowy termostatu). Nie trzeba tutaj montować złącza goldpin, jak w projekcie modelowym, wystarczy wlutować przewody bezpośrednio w płytkę. W programie termometru stan niski na wyjściu sterowania pojawia się gdy temperatura jest ujemna. Wystarczy dołączyć diodę LED z szeregowym rezystorem 470R między to wyjście a +5V aby mieć sygnalizację znaku "-".

Budowa:


Układ z powodzeniem można zbudować w oparciu o płytkę drukowaną dostępną tutaj. Rysunek w odbiciu lustrzanym dostępny jest tutaj. Pomocą w konstrukcji będzie schemat montażowy termometru znajdujący się tutaj, natomiast elementy SMD można z łatwością zamontować posługując się rysunkiem dostępnym tutaj. Płytka została zaprojektowana jako jednostronna, a prawie wszystkie elementy są typu SMD. Wyjątek stanowią tu wyświetlacz, przyciski i złącza. Montaż nie jest skomplikowany ale wymaga niewielkiej wprawy w lutowaniu SMD. Na samym początku dobrze jest przylutować właśnie te elementy, ponieważ brak wystających części z drugiej strony ułatwi montaż. Należy zwrócić uwagę że obwód masy przechodzi w jednym miejscu przez zworkę jaką tworzy przycisk (przycisk ma 4 wyprowadzenia parami zwarte). Gdyby zaszła konieczność rezygnacji z przycisków to zamiast S1 należy wlutować zworkę po stronie masy (kolor czerwony). Wadą małej płytki jest brak wyprowadzonego złącza programującego procesora, więc gdyby zaszła konieczność zmiany programu będzie trzeba przylutować kabelek programujący do pinów mikrokontrolera. W roli złącza zasilania podobnie jak w przypadku GP1 dobrze sprawdzają się kabelki przylutowane bezpośrednio do płytki.

Opis pinów złącza GP1 przedstawiony jest na rysunku poniżej:

Wyprowadzenia 1 i 2 tego złącza to odpowiednio: zasilanie i masa. Wyjście sterowania (OUT) jest tutaj dostępne na pinie 3. Czujniki należy podłączyć trój-przewodowo wykorzystując wyprowadzone zasilanie, masę i linie sygnałowe 5 i 6. Linia danych czujnika pierwszego ma zostać podłączona do pinu 5, a z czujnika drugiego do pinu 6 złącza GP1. Układ termometru zasilany jest napięciem z przedziału 7-12V dzięki obecności stabilizatora 78L05. Nic nie stoi na przeszkodzie aby pominąć stabilizator a napięcie zasilania 5V podać bezpośrednio na termometr.

Wykaz Elementów:

2x uSwitch

3x 3,3k SMD/0805
2x 4,7k SMD/0805
8x 330R SMD/0805

2x 10uF SMD/3216A Tantalowy
1x 100nF SMD/0805

3x BC857
1x 78L05 SMD/SOT89
1x ATTINY2313 SMD/SO20
1x LED-AT5636BMR (Wyświetlacz potrójny)

Programowanie:


Program sterujący pracą termometru został napisany w dobrze znanym programie BASCOM AVR . Zajmuje on około 70% dostępnej pamięci mikrokontrolera i może być z powodzeniem kompilowany w wersji demo BASCOM'a. Działanie programu nie jest skomplikowane i w skrócie wygląda to następująco: cały czas procesor kręci się w nieskończonej pętli Do Loop, czekając na ustawienie jednej z flag taktujących w przerwaniu. Za odpowiednie taktowanie odpowiada Timer0. Co około 4ms wywoływana jest procedura multipleksowania wyświetlacza, z której w odpowiednim momencie następuje skok do odczytu temperatury.

Procedura obsługi przerwania Timera0 widoczna jest poniżej:

Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
       Set F1s
     End If
   End If
Return

Na początku do licznika timera ładowana jest wartość 131, daje to przerwanie po odliczeniu 125 impulsów (256-131). Timer pracuje z dzielnikiem sprzętowym przez 256 co przy częstotliwości taktowania 8MHz daje przerwanie co 4ms. Bezpośrednio po wystąpieniu przerwania ustawiana jest flaga F4ms. Zmienne Dziel(1) i Dziel(2) stanowią dzielnik częstotliwości. Pierwsza odpowiada za podział przez 25 i po przepełnieniu licznika ustawiana jest flaga F100ms (następuje to co 100ms). Druga zmienna jest licznikiem do 10 i zapewnia ustawianie flagi F1s co 1s.

Pętla główna widoczna jest poniżej:

Do
 
If F4ms = 1 Then
  Reset F4ms                                                'co 4ms
  Wysw = T
  Gosub Wyswietl_zmierz
End If
 
If F100ms = 1 Then
  Reset F100ms                                              'co 100ms
  If Pind.2 = 0 Then Kanal = 1
  If Pina.0 = 0 Then Kanal = 0
End If
 
Loop
End

Działanie jest bardzo proste i zależne tylko od flag: F4ms i F100ms. Przez większość czasu procesor kręci się w nieskończonej pętli Do Loop czekając na ustawienie jednej z flag. Co 4ms wywoływana jest procedura obsługująca wyświetlacz i pomiar temperatury, natomiast co 100ms odczytywane są stany klawiszy. W podstawowej wersji programu wystarczy prosta obsługa klawiatury poprzez bezpośredni odczyt stanu pinów wejściowych. Naciśnięcie S1 powoduje przejście do odczytu drugiego czujnika, natomiast naciśnięcie S2 przechodzi do czytania czujnika pierwszego.

Procedura obsługi wyświetlacza i pomiaru temperatury widoczna jest poniżej:

Wyswietl_zmierz:
  Incr Mux
  If Mux = 5 Then Mux = 0
 
  Portd.3 = Not Minus
 
  For I = 1 To 3
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
  If W(3) = 40 Then W(3) = 255           'wygaszenie zera wiodącego
 
  Select Case Mux
    Case 0:
      Portb = W(3)
      Reset Portd.6
    Case 1:
     Set Portd.6
     Portb = W(2) And &B11011111
     Reset Portd.5
    Case 2:
     Set Portd.5
     Portb = W(1)
     Reset Portd.4
    Case 3:
     Set Portd.4
     Portb = 255
     Gosub Temp
    'Case 4:  
  End Select
Return
 
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160

Działanie składa się z 5 kroków zależnych od stanu zmiennej pomocniczej Mux. Przyjmuje ona wartości od 0 do 4 i zmienia się cyklicznie z kolejnym wywołaniem procedury. Na wyjście sterowania (Portd.3) przepisywana jest zanegowana wartość zmiennej Minus. Odpowiada ona za wyświetlanie ujemnych temperatur i tym samym na porcie d.3 mikrokontrolera pojawia się stan niski gdy mierzona temperatura jest ujemna. W dalszej kolejności dzięki pętli for, zmienna Wysw, zawierająca wartość do wyświetlenia, dzielona jest na trzy pojedyncze cyfry. Następnie są one zamieniane na kody wyświetlacza LED za pomocą polecenia Lookup (z wykorzystaniem tabeli przeliczeniowej). Po wyjściu z pętli for uzyskuje się tablicę W(n) z zakodowanymi wartościami, gdzie n=1...3 indeksuje kolejne znaki wyświetlacza.

Dalsza część procedury zależy od zmiennej Mux. Dla wartości 0 do 2 zaświecane są kolejne cyfry poprzez wyłączenie poprzedniej anody, wystawienie na Portb wartości kolejnego znaku i włączenie odpowiadającej mu anody. Wyjątkiem jest tutaj znak W(2) gdzie dodatkowa operacja (And &B11011111) zapewnia dodanie kropki dziesiętnej po drugim znaku. Dla wartości Mux=3 wywoływana jest procedura pomiaru temperatury, a stan Mux=4 jest fazą oczekiwania na spokojne zakończenie pomiaru temperatury.

Procedura pomiaru temperatury widoczna jest poniżej:

Temp:
 If F1s = 1 Then
   Reset F1s
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &HBE , 1 , Pind , Kanal
   T = 1wread(2 , Pind , Kanal):
   Minus = T.15
   T = Abs(t)
   T = T * 10
   T = T / 16
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &H44 , 1 , Pind , Kanal
  End If
Return  

Procedura ta wywoływana jest co okoł0 20ms, jednak wykonywanie pomiaru odbywa się co 1s dzięki sprawdzaniu stanu flagi F1s. Występuje tutaj typowa obsługa magistrali 1-Wire dla przypadku obecności tylko jednego układu na magistrali. Wszystkie rozkazy 1-Wire wywoływane są z parametrem Kanal, który odpowiada za to z której magistrali temperatura ma być odczytana (pind.0 czy pind.1). Po wykonaniu resetu następuje wysłanie rozkazu pominięcia sprawdzania ROM oraz wysłanie rozkazu odczytu rejestru DS18B20. Następnie odczytywane są dwa bajty temperatury do zmiennej T (integer), określany jest znak temperatury i wykonywane są proste przeliczenia. W efekcie zmienna T przyjmuje postać temperatury w stopniach pomnożonej przez 10 (np. 13 to 1.3 stopnia). Na samym końcu wysyłany jest rozkaz konwersji temperatury aby w kolejnym odczycie uzyskać aktualną jej wartość.

Fusebity mikrokontrolera powinny być ustawione na pracę z wewnętrznym oscylatorem RC o częstotliwości 8MHz, co w praktyce sprowadzi się do wyłączenia jedynie dzielnika sprzętowego (Bit CKDIV). Ustawienia fusebitów, zrzut z programu burn-o-mat znajduje się poniżej:

Układ da się przerobić na termostat niewielkim nakładem pracy. Rezygnujemy wtedy z dwukanałowego pomiaru temperatury oraz ujemnych temperatur na koszt sterowania wyjściem. Do wyjścia sterowania (Portd.3) można dołączyć optotriaka i triaka sterującego dowolnym odbiornikiem prądu przemiennego lub można dołączyć tranzystor MOSFET sterujący odbiornikiem prądu stałego. W pętli głównej trzeba będzie wprowadzić modyfikacje widoczne poniżej:

If F4ms = 1 Then
  Reset F4ms
  If Ust = 0 Then Wysw = T Else Wysw = Tu
  Gosub Wyswietl_zmierz
End If
 
If F100ms = 1 Then
  Reset F100ms
  If Pind.2 = 0 Then
    Incr Tu
    Autoret = 20
  End If
  If Pina.0 = 0 Then
    Decr Tu
    Autoret = 20
  End If
 
  If Autoret > 0 Then
    Ust = 1
    Decr Autoret
  Else
    Ust = 0
  End If
 
  H = Tu + 10
  L =  Tu - 10
 
  If T > H Then Set Portd.3
  If T < L Then Reset Portd.3
End If

Taki kod wymaga zadeklarowania zmiennych Tu, H oraz L jako Integer oraz Ust jako Bit i Autoret jako Byte, na początku programu. Dodatkowo zmienna Tu powinna mieć wartość początkową, gdyż stanowi wartość temperatury ustawianej. W procedurze wyświetlania i mierzenia należy usunąć linijkę odpowiedzialna za sygnalizację ujemnych temperatur, gdyż portd.3 służy teraz jako wyjście sterowania. Przedstawione rozwiązanie nie jest idealne, nie ma żadnego ograniczenia na ustawiane wartości ani nie potrafi zapisywać ustawień do pamięci EEPROM ale w wielu sytuacjach znakomicie się sprawdzi. Może działać z powodzeniem jako termostat do trawiarki po ustawieniu domyślnej wartości Tu na 40 stopni.

Zdjęcia Projektu:

ZałącznikWielkość
Schemat61.36 KB
Płytka10.73 KB
Płytka (odbicie lustrzane)10.7 KB
Płytka (24 na stronie)157.02 KB
Montowanie (warstwa elementów)8.66 KB
Montowanie (warstwa druku)13.73 KB
Opis (warstwa elementów)53.3 KB
Opis (warstwa druku)100.45 KB
Soldermaska96.35 KB
Kod Źródłowy (termometr)3.11 KB
Program po kompilacji (bin) (termometr)1.44 KB
Program po kompilacji (hex) (termometr)4.06 KB
Kod Źródłowy (termostat)3.37 KB
Program po kompilacji (bin) (termostat)1.63 KB
Program po kompilacji (hex) (termostat)4.6 KB



Portret użytkownika jajen

re:

Niestety ale dalej rośnie. Dużo wolniej niż przedtem. Ale z 21,5 st. na starcie (to prawidłowa temperatura) zrobiło się 25,5 st. po 10 min. Czyli dalej się grzeje.

Portret użytkownika morswin

U mnie nie występowały takie

U mnie nie występowały takie problemy i normalnie pokazywał temperaturę otoczenia. Sprawdź czy DS nie jest na pewno uszkodzony lub nie ma jakiegoś zwarcia.

Portret użytkownika jajen

Sprawdziłem na dwóch różnych

Sprawdziłem na dwóch różnych układach i z trzema różnymi dsami. Dokładnie ten sam efekt. Teraz obydwa termometry pokazuja mi 26 st. w domu! Do tego dla pewności podłączyłem te same dsy do sterownika domowego i pokazują prawidłową temperaturę, więc dsy są dobre na 100 procent.

Portret użytkownika mirley

Re: Ds

Spróbuj na końcu procedury odczytu Ds. Napisac jeszcze raz rozkaz resetu

...
   T = T / 16
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &H44 , 1 , Pind , Kanal
   1wreset Pind , Kanal          'dopisać
  End If

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika morswin

A częstotliwość taktowania

A częstotliwość taktowania dobrze ustawiona?

Portret użytkownika jajen

re

Dopisanie procedury resetu powoduje ciągłe wyświetlanie 85stC. Czestotliwość i inne fusy ustawione zgodnie z opisem. Podaje link do filmiku pokazującego jak temperatura rośnie sukcesywnie po włączeniu termometru http://jajen.dyndns.org/daniel/ds.avi

Zwracam też uwagę, że m.in. wpis #18 w projekcie termometru uniwersalnego opisuje identyczny problem. Raczej mało prawdopodobne żeby popełnić ten sam błąd albo użyć tak samo wadliwych komponentów. Ale skoro innym działa poprawnie to co może przyczyną? Zwłaszcza , że u mnie dwa termometry zachowują się identycznie.

Portret użytkownika jacxek1111

Zasilanie z baterii

Witam

Co sądzisz żeby ten termometr zasilać z baterii?? 3,7V lit-jon, 200mA do tego włącznik.Tylko czy Attiny2313 ruszy przy takim napięciu?.

Pozdrawiam
J.I.

Portret użytkownika mirley

Re: Tiny

Jest taktowane 8Mhz z wewnętrznego oscylatora więc powinno działać.... przy większych częstotliwościach są problemy

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika jacxek1111

Problem z wyświetlaniem

Witam
Mam problem z wyświetlaniem temperatury. Układ zbudowany w oparciu o Twój projekt. Problem polega na tym że nie zapala się górny segment na wyświetlaczu (chyba to jest "A") poza tym wszystko działa temperatura jest mierzona i wysyłana na wyświetlacz tylko ten segment się nie zapala ?? wyświetlacz sprawny, połączenia sprawdzone niestety problem nie zniknął!! Proszę o sugestię jak to można rozwiązać ??

I jeszcze jedno zapytanie. Dołączył bym się do prośby o dodanie do tego termostatu. Czytałem że za mało miejsca w mikrokontrolerze, ale nie dało by się jakoś zoptymalizować tego kodu ?? Jak dużo brakuje miejsca w procesorku ??

Projekt bardzo fajny.

Dzięki
Pozdrawiam J.I.

Portret użytkownika mirley

Re: Rezystor

Może rezystor masz niedolutowany od segmentu A albo po prostu nie przewodzi. Jak układ działa to musi cały wyświetlacz dobrze świecić.

Wersja z termostatem dostępna jest przecież w załącznikach

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika jajen

re korekta

Problem z rośnieciem temperatury rozwiazany ale nie rozumiem dlaczego tak się działo. Wzrost odczytu dotyczył zawsze przypadku bezposredniego wlutowania czujnika do plytki. Przy polaczeniu czujnika kablem problem nie wystepuje. Myslalem, ze moze , ktorys element sie grzeje na plytce i DS reagowal, ale zasilanie mialem odległe od płytki a attiny przeciez sie nie grzeje, inne elementy tez nie. Wiec nie wiem o co chodzilo, ale te same czujniki wlutowane na kablu 0,5m-3m chodzą dokładnie i stabilnie. Wiec sam program jest oczywiscie ok.

Portret użytkownika dam27

AVRStudio

Witam mam problem odnośnie ustawienia Fus bitów , korzystam z avr studio i nie mogę poradzić sobie z ustawieniami .Wgrywam soft i wyświetlacze migają kwarc wew.8Mhz. Zablokowałem 2 procki. Co tu przestawić by śmigało poprawnie. Pozdrawiam

Portret użytkownika mirley

Re: Termometr

A nie wystarczy ci opis wyżej.... pewnie nawet nie czytałeś. Wystarczy odznaczyć CKDIV (ustawić na 1)

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika boorys24

Automatyczne przełączanie wskazań wew i zew

Witam i chylę głowe.
Czy można tak zmodyfikować program żeby przełączał automatycznie wskazania z jednego czujnika na drugi powiedzmy co 5s?

Portret użytkownika mirley

Re: Termometr

Da się tak zrobić. W obsłudze flgi 1s tam gdzie pomiar temperatury wystarczy zrobić dodatkowy podzielnik i zmienic kanał. Np tak:

incr auto_sw
if auto_sw = 5 then
  auto_sw = 0
  toggle Kanal
end if

auto_sw jest zmienną typu byte, trzeba zadeklarować na początku

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika boorys24

Działa

Wielkie dzięki. Wszystko śmiga. Pozdrowienia i oby więcej tak udanych projektów.

Portret użytkownika gosc2345

prosba o przejrzystośc

Mozna prosić o wklejanie modyfikacji kodu razem z fragmentem kodu przed i po modyfikacji? Latwiej wtedy zorientowac sie gdzie nalezy dokonac zmian osobom , ktore nie mają do czynienia z programowaniem. Poza tym co oznacza ze auto_sw trzeba zadeklarować na początku? Dziekuję.

Portret użytkownika jajen

automatyczne przełączanie

Przyłączam się do prośby poprzednika o dokładniejsze podanie jak zmodyfikować kod żeby następowała automatyczna zmiana wskazań in/out. Tzn o podanie dokładnie w które miejsce wkleić zmianę oraz co i jak zadeklarowac na początku. Dziękuję bardzo.

Portret użytkownika mirley

Re: Program minitermometr

Napisałem gdzie trzeba wkleić tylko jakby komuś się chciało przeczytać opis to by wiedział jak ma to zrobić....

procedura obsługi pomiaru temperatury ma wyglądać tak

Temp:
 If F1s = 1 Then
   Reset F1s
   incr auto_sw
   if auto_sw = 5 then
     auto_sw = 0
     toggle Kanal
   end if
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &HBE , 1 , Pind , Kanal
   T = 1wread(2 , Pind , Kanal):
   Minus = T.15
   T = Abs(t)
   T = T * 10
   T = T / 16
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &H44 , 1 , Pind , Kanal
  End If
Return  

Zmienną deklarujemy na początku to jest tam gdzie pozostałe polecenia Dim, wpisując

Dim auto_sw as byte

w nowej linijce pod innymi deklaracjami

Całych kodów nie wklejam bo nie ma to żadnego sensu i wcale nie ułatwia wyszukiwania

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika jajen

Dzieki. Mnie nie działa do

Dzieki. Mnie nie działa do konca. Przelącza się ale jeden odczyt jest zawsze 00, tak jakby nie było czujnika. Co robie zle?

Portret użytkownika mirley

RE: Termometr

A jak nie ma przełaczania automatycznego tylko ręczne to dwa kanały mierzą temperaturę poprawnie?

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika jajen

re

Przy zmodyfikowanym kodzie, mimo ze automatycznie działa jeden czujnik, to przy recznej zmianie jest ok. Oczywiście na standardowym kodzie również wszystko działa ok.

Dodam, ze mam wlutowane diody identyfikujące czujniki. Przy zmodyfikowanym kodzie swiecą obdwie na raz. Niestety nie mam możliwośći ich wylutowania bo urządzenie jest w zaklejonej obudowie i wystaje tylko ISP. Ale nie sądze, zeby to diody mogły powodowac problem z automatycznym przełączaniem.

Portret użytkownika mirley

Re: termometr

Dobra już wiem co sie stało...... dopisz jeden szczegół i powinno zadziałać:

Zamiast

  toggle Kanal

daj:
  toggle Kanal.0

albo
if Kanal = 0 then kanal = 1 else kanal = 0

jakby nie zadziałała ta konstrukcja z toogle

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika jajen

Zadziałała pierwsza

Zadziałała pierwsza konstrukcja. Dzięki. A czy da się jeszcze tak, żeby diody identyfikujace czujnik działały przy wersji z automatycznym przelaczaniem?

Portret użytkownika mirley

Re: Termometr

Trochę nie pamiętam tego z diodami identyfikującymi czujnik... może napisz co zostało już ustalone w tej sprawie

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika jajen

re termometr

modyfikacja z diodami pogala na:

#Config Porta = &B00000010 : Porta = &B11111111

#If Kanal = 0 then porta.1 = 0 else porta.1 = 1

Na porcie PA1 dwie diody.

Ładnie działały przy ręcznym przełączaniu. Ale auto już nie chodzi (swiecą zawsze dwie)

Portret użytkownika Jarek

Obsługa DS18B20

Szanowny kolego.
Od 5 (pięciu) lat wałkuję obsługę wyświetlacza 7segm i DS18B20. Wydaje mi się że wykorzystałem już wszystkie kombinacje odcytu temperatury i nie mogę sobie poradzić z jednym aspektem:
Wszyscy wiemy, że obsługa DS18B20 (wysyłanie słów i odbieranie) wstrzymuje przerwania które wykorzystywane są do obsługi wyświetlacza, czego efektem jest niezwykle denerwujące zatrzymywanie wyświetlania na ułamek sekundy jednego z wyświetlaczy.
Widzę również że kolega obsługę DS'a włożył w tzw "dodatkowy wyświetlacz". Ja w swojej bezsilności próbowałem i tego rozwiązania a także rozbiłem obsługę na pojedyncze słowa co każdy cykl przemiatania jednak bezskutecznie.
Chciałbym tylko zapytać, czy przedstawiony układ jest całkowicie pozbawiony tej przypadłości?
Czy istnieje inny sposób na zapobiegnięcie tego typu objawom, jak wykorzystanie "dodatkowego wyświetlacza" co wydaje mi się nie jest do końca profesjonalnym rozwiązaniem ?

Bardzo proszę o odpowiedź

J.J.

Portret użytkownika mirley

Re: Wyświetlacz LED/termometr

Coś musiałeś jeszcze pozmieniać w programie bo jak zauwazyłeś dido świeci w zleżności od zmiennej kanał, która jest zmieniana w taki sam sposób zarówno w trybie auto jak i manual. może konfiguracja na początku programu została ci w starej wersji i Pa.1 nie jest wyjściem.

---------
Co do wyświetlania i DS'a to mój program nie posiada tej wady.... nie za bardzo da się przeskoczyć ten problem bo do ds'a potrzebny jest określony czas aby go obsłużyć. Więc trzeba dzielić na małe kawałki słowa wysyłane do ds'a albo kombinować różnie z wyświetlaniem. Sam spędziłem na tym z pół dnia zanim przestało migać.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika jajen

Masz rację, żle to opisałem.

Masz rację, żle to opisałem. Obecnie diody swiecą razem , bo w ogóle modyfikacja dla diod nie została wprowadzona. Natomiast w przypadku modyfikacji takiej, jak podałem wyżej, dioda świeci ale ta , którą włączymy ręcznie. Czyli włącze recznie DS1 - swieci zielona, przelaczy sie automat na DS2, swieci dalej zielona, Przelacze recznie na DS2 - swieci czerwona, przelaczy sie automat na DS1, swieci dalej czerwona. Czyli swieci zawsze dida dla recznie ustawionego DS,a

Portret użytkownika mirley

Re: termometr

To jest fizycznie niemozliwe.... popatrz:

Automat zmienia kanał:

  if Kanal = 0 then kanal = 1 else kanal = 0

ręcznie zmieniasz:

  If Pind.2 = 0 Then Kanal = 1
  If Pina.0 = 0 Then Kanal = 0

a dioda zależy od zmiennej Kanal:

If Kanal = 0 then porta.1 = 0 else porta.1 = 1

w którym miejscu masz umieszczoną powyższą linijke dla diod?

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika jajen

Kurcze, Mirley przepraszam za

Kurcze, Mirley przepraszam za kłopot ale wklepałem wszystko od nowa wg tego co mówiłeś, załadowałem i działa pięknie. Raz jeszcze dziękuję i przepraszam za zamieszanie.

Portret użytkownika adrian22222

termometr

Witam czy jest możliwość przerobienia tego układu na woltomierz??

Portret użytkownika mirley

Re: Termometr

Nie ma takiej opcji... tiny2313 nie ma przetworników

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Gość1

Zrobiłem ten układ i mam

Zrobiłem ten układ i mam takie pytanko. Chciałem, aby sygnalizował temperautry ujemne czyli, poniżej 0 stopni zapali się dioda. Do tego celu chciałem wykorzystać PortD.3

If T >= 0 Then
       Portd.3 = 0
     If T < 0 Then
      Portd.3 = 1
    End If : End If

Działa to ale tylko dla 0 stopni, poniżej zera dioda znowu gaśnie. Domyśliłem się że to winna zmiennej word, dlatego zmieniłem na zmienną (która przechowuje dane ze znakiem ujemnym) typu Single. Ale też nie zdaje egzaminu. Czy masz może pomysł jak to zrobić żeby poniżej zera zapalała się dioda?

Portret użytkownika Gość1

Dobra sorry za pytanie, już

Dobra sorry za pytanie, już ogarnąłem, że w wersji termometru task właśnie zrobiłeś. A co właściwie znaczy:
Minus = T.15
T = Abs(t)
[/code]
Rozumiem, że 16 bit zmiennej T, który jest zerem dla wartości dodatniej, a jeden dla wartości ujemnej pomiaru?

Portret użytkownika koleś

wyświetlacz

Jaki inny wyświetlacz mogę zastosować który jest w ofercie TME(sorry za reklamę)?

Portret użytkownika koleś

2 przewody

Piszesz tu o połączeniu na 3 przewody. Czy można połączyć go na 2? Pytam bo potrzebuję czujnik umieścić na przewodzie 40-50m

Portret użytkownika mirley

Re: Termometr

Z Ds odczytywana jest temperatura do zmiennej integer T. Naturalnie wartosci ujemne zapisywane są w kodzie U2, czyli najstarszy bit jest 0 jak jest + a 1 jak jest -. Wystarczy odczytać MSB i to właśnie robię Minus=T.15 (zmienna jest 16 bit). Polecenie T = ABS(T) robi wartość bezwzględną temperatury żebym wyświetlał cyfry potem

Można dac dowolny wyświetlacz ale musisz sobie odpowiednio podłaczenia zrobić żeby były zgodne z tym co procek wystawia. Jak masz tak długi kabel to szczególnie polecam 3 przewody, żeby pewniej działało

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika koleś

jaki kabel

a jaki ten kabel będzie lepszy bo jedni piszą że może być zwykły telefoniczny i a inni że skrętka komputerowa klasy 5e.
Chodzi o transmisje na ok. 50m

Portret użytkownika Gość1

Mirley, mam takie nie typowe

Mirley, mam takie nie typowe pytanko. Powiedz co studiujesz, jaki kierunek i specjalizacja?

Portret użytkownika mirley

Re: Termometr

Napewno dał bym lepszy kabel. Myślę że dowolna skrętka sieciowa będzie dobra. Sygnał i masę puść jedną parą a zasilanie i masę jeszcze raz możesz puścić drugą parą. Można tez poszukać czy nie ma kabla 3 żyłowego skrętki.

---------

Studiowałem Fizykę Jądrową na AGH, kształcąc się w kierunku Elektroniki Jądrowej (elektronika odczytu i transmisja danych z detektorów cząstek itp). Obecnie jestem na doktoracie i zajmuje się projektowaniem układów scalonych dla celów transmisji danych z detektorów

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Gość1

Bardzo ciekawe. Bo niedługo

Bardzo ciekawe. Bo niedługo będę wybierał kierunek studiów, a właśnie mnie bardzo interesują twoje projekty i chciałbym dalej poszerzać swoją wiedzę w stronę elektroniki. Zastanawiam się nad automatyką i robotyką bądź także nad elektroniką i telekomunikacją.
Interesuje mnie elektronika (mikro, programowanie, ukłądy scalone itd.) ale także ciekawe są sterowniki PLC, sterowania, programowanie itp.

Portret użytkownika tyktyk

Modyfikacja

Witam mam takie nietypowe pytanie: Czy mógłbyś mi pomóc zmodyfikować program tak aby działał z układem który zmontowałem. Znalazłem fajny bardzo stary wyświetlacz w fajnej obudowie. jest w nim znak + i - oraz dodatkowa jedynka. Chodziło by mi o to by dodać do multipleksowania ten dodatkowy wyświetlacz .
1. Gdy temperatura jest dodatnia chciałbym by świecił się + natomiast jak jest ujemna -
2. Gdy temperatura wzrośnie do 100 stopni i wyżej by zapalił się segment jedynki.
3 . Układ miałby mieć tylko 1 czujnik temperatury
4. Gdyby się jeszcze dało to na końcówce PA1 lub PA2 następowała by zmiana stanu po przekroczeniu 90 stopni.
W tej chwili układ działa na delikatnie zmienionym wsadzie twojego autorstwa .
Niestety dopiero rozpoczynam i jest to mój pierwszy układ z mikroprocesorem więc proszę o wyrozumiałość. jeśli chodzi o Tabele do wyświetlania na wyświetlaczu to sobie ją przeliczyłem podług mojego wyświetlacza.
Schemat rysowany na kolanie http://obrazki.elektroda.pl/6243742600_1328573727.jpg

Portret użytkownika mirley

Re: Termometr

jak jest zbudowany dokładnie ten dodatkowy wyświetlacz? Ma wspólną anodę i jakie katody? co zaświecają? Żeby multipleksowanie miało sens trzeba dołączyc te katody dodatkowego wyświetlacza do którychś pinów a-g istniejących wyswietlaczy

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika tyktyk

Cały wyświetlacz składa się z

Cały wyświetlacz składa się z 4 pojedynczych wyświetlaczy z czego trzy są to typowe wyświetlacze 7 segmentowe oraz DP z tym że kropka jest przed znakiem. Wyglądają dokładnie tak jak na schemacie którego część wyciąłem z oryginalnej jego dokumentacji. Natomiast czwarty ma zamiast całego znaku "8" segmenty "b" oraz "c" połączone z "bc" pozostałych segmentów oraz znak pionowa kreska oraz pozioma kreska wyprowadzone oddzielnie.
Znaki te czyli " 1 +-" mają wspólną anodę. całość jest zmontowana na dwustronnej płytce drukowanej. Jeśli ułatwiło by to program to mogę odłączyć te segmenty BC tego dodatkowego wyświetlacza i połączyć tak jak na tym schemacie dolnym: http://obrazki.elektroda.pl/6788920900_1328717262.jpg czerwone linie.
cały kod wygląda tak:

          '****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111111 : Portd = &B11111111
Config Porta = &B00000000 : Porta = &B11111111
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Dziel(2) As Byte
Dim Wysw As Word , Ww As Byte , W(3) As Byte
Dim Wysw_pomoc As Word
Dim T As Integer
Dim Mux As Byte , I As Byte
 
Dim F1s As Bit , F4ms As Bit , F100ms As Bit
Dim Minus As Bit
Dim Kanal As Byte
'****************************
      'Wartosci Poczatkowe
'****************************
Kanal = 0
'****************************
      'Petla glowna
'****************************
Do
 
If F4ms = 1 Then
  Reset F4ms                                                'co 4ms
  Wysw = T
  Gosub Wyswietl_zmierz
End If
 
If F100ms = 1 Then
  Reset F100ms                                              'co 100ms
  If Pind.3 = 0 Then Kanal = 0
 
End If
 
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 131
   Set F4ms
   Incr Dziel(1)
   If Dziel(1) = 25 Then
     Dziel(1) = 0
     Set F100ms
     Incr Dziel(2)
     If Dziel(2) = 10 Then
       Dziel(2) = 0
       Set F1s
     End If
   End If
Return
'****************************
      'pomiar temp
'****************************
Temp:
 If F1s = 1 Then
   Reset F1s
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &HBE , 1 , Pind , Kanal
   T = 1wread(2 , Pind , Kanal):
   Minus = T.15
   T = Abs(t)
   T = T * 10
   T = T / 16
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &H44 , 1 , Pind , Kanal
  End If
Return
 
 
 
'****************************
      'wyswietlanie i wywolywanie pomiaru
'****************************
Wyswietl_zmierz:
  Incr Mux
  If Mux = 5 Then Mux = 0
 
  Portd.2 = Not Minus
 
  For I = 1 To 3
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
  If W(3) = 40 Then W(3) = 255                              'wygaszenie zera wiodącego
 
  Select Case Mux
    Case 0:
      Portb = W(3)                                          ' And &B11111110
      Reset Portd.5
 
    Case 1:
     Set Portd.5
     Portb = W(2)                                           ' And &B11111110
     Reset Portd.4
 
    Case 2:
     Set Portd.4
     Portb = W(1) And &B11111110
     Reset Portd.6
 
    Case 3:
     Set Portd.6
     Portb = 255
     Gosub Temp
 
    'Case 4:                                                 'opoznienie na odczyt temp, jeśli nie ma to miga wyswietlacz
 
  End Select
 
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 65 , 231 , 137 , 131 , 39 , 19 , 17 , 199 , 1 , 3
'znak:    0     1     2     3     4     5     6     7     8     9

Portret użytkownika mirley

Re: Termometr

segmenty b i c od tej 1 napewno podłącz razem z wszystkimi pozostałymi b i c, po co kombinować. Tak samo zastanawiam się czy np tej kreski poziomej i pionowej nie dołączyć do segmentów np d i e. W programie trzeba zwiększyć zakres Mux o 1:

 Incr Mux
  If Mux = 6 Then Mux = 0

oraz dopisać nowego case:

  For I = 1 To 4
    Wysw_pomoc = Wysw Mod 10
    Ww = Wysw_pomoc
    W(i) = Lookup(ww , Tabela)
    Wysw = Wysw / 10
  Next I
 
  If W(4) = 65 Then 
    W(4) = 255 
    If W(3) = 65 Then W(3) = 255                              'wygaszenie zera wiodącego
  end if
 
  Select Case Mux
    Case 0:
      Portb = W(3)                                          ' And &B11111110
      Reset Portd.5
 
    Case 1:
     Set Portd.5
     Portb = W(2)                                           ' And &B11111110
     Reset Portd.4
 
    Case 2:
     Set Portd.4
     Portb = W(1) And &B11111110
     Reset Portd.6
 
    Case 3:
     Set Portd.6
     Portb = W(4) 
     reset portd.1  'kreska pozioma
     if Minus =  0 then reset portd.2 'kreska pionowa
     Reset Portd.3
 
    Case 4:
     Set Portd.3
     Portb = 255
     Gosub Temp
 
    'Case 5:  'pusty

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika tyktyk

Udało mi się uruchomić

Udało mi się uruchomić dodatkowy wyświetlacz. Musiałem tylko usunąć end if z tego miejsca.

If W(4) = 65 Then 
    W(4) = 255 
    If W(3) = 65 Then W(3) = 255                              'wygaszenie zera wiodącego
  end if

Nie sprawdziłem tylko czy zapala się ta dodatkowa jedynka do setnych temperatur bo czujnik już mam zamontowany a drugiego jeszcze nie kupiłem. Mam pytanko czy jak będzie temperatura 0,0 to będzie się palił+- czy po prostu w tym momencie będą ciemne?
Jak zrealizować alarm przy przekroczeniu 90 stopni?

Portret użytkownika mirley

Re: termometr

Nie możesz wywalić tego end if... ona tam ma być. Jak cos to wywal całe

If W(4) = 65 Then 
    W(4) = 255 
    If W(3) = 65 Then W(3) = 255                              'wygaszenie zera wiodącego
  end if

to jest obsługa wygaszenia 0 przed wskazaniem. nie świeci 01.0 stopnia tylko 1.0

Dla zera będzie się świecił +

Alarm jest prosty:

If F100ms = 1 Then
  Reset F100ms                                              'co 100ms
  If Pind.2 = 0 Then Kanal = 1
  If Pina.0 = 0 Then Kanal = 0
 
  'tu dopisz alarm
  if T >=900 then 
    'ustaw jakiś port lub inna akcja dla alarmu
  end if
 
End If

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika koksik

migotanie

Mirley mam problem. Po wgraniu programu (termometr) na wyświetlaczach miga napis 0.0. Zamiast attiny2313 20su dałem 20pu na kabelkach (obudowa dip). To może być problemem? Próbowałem już na 2 prockach i bez żadnych zmian.

Portret użytkownika mirley

RE: Termometr

A ustawiłeś fusebity?

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.