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 mirley

Re: Wyświetlacz

Niestety nie mam wolnego.... sam muszę zamówić. Jest dostępny w AVT i na allegro(LED 3 CYFRY 0,56" )

-

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 jarecki302

miganie literki C

Witam.Panowie podpowiedzcie co może być nie tak. Złożyłem ten termometr i coś dziwnego dzieje sie z literką C wyświetlaną na trzecim segmencie wyświetlacza, przez jakąś chwilę świeci sie całość a za chwilę zaczyna gasnąć i zaświecają się przypadkowe części literki C tak mniej więcej co 1 sekundę. Jeśli odłączę czujniki to świeci 0 i cala literka C. Oczywiście temperatura poprawna z obu czujników.

Pozdrawiam

Portret użytkownika jarecki302

miganie literki C

Witam.Panowie podpowiedzcie co może być nie tak. Złożyłem ten termometr i coś dziwnego dzieje sie z literką C wyświetlaną na trzecim segmencie wyświetlacza, przez jakąś chwilę świeci sie całość a za chwilę zaczyna gasnąć i zaświecają się przypadkowe części literki C tak mniej więcej co 1 sekundę. Jeśli odłączę czujniki to świeci 0 i cala literka C. Oczywiście temperatura poprawna z obu czujników.

Pozdrawiam

Portret użytkownika xtreme69

Wyświetlacze

Witaj Mirku
Mam małe pytanko, przymierzam się do zbudowania tego termometru z tym, że chciałbym zastosować 3 szt dużych wyświetlaczy zamiast takiego co masz w projekcie.
Czy będzie trzeba coś zmieniać w kodzie i jak podłączyć te wyświetlacze zamiast tego jednego oryginalnego z projektu.
Pozdrawiam

zamieszczam opis wyprowadzeń i parametry zasilania ( z tym jest największy problem, pin 3 i 4 potrzebuje ok 5V a cała reszta ok 13V

Portret użytkownika mirley

Re: Termometr

A ustawiłeś fusebity w mikrokontrolerze? Może to jest powodem migania?

--------------

Co do wyświetlaczy to łaczysz ze sobą katody tych samych segmentów wszystkich wyświetlaczy, dostajesz jeden zestaw segmentów a...g i tyle anod ile masz wyświetlaczy, czyli dokładnie tak jak dla wyświetlacza zastosowanego w projekcie. Aha sprawdź tylko czy wyświetlacz świeci po podłączeniu przez rezystor do 5V, bo ja kiedyś miałem z 3 diodami na segment w szeregu i świecił od 7V (napięcie przewodzenia 3 diod led)

-

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 xtreme69

Wyświetlacze

Moje wyświetlacze potrzebują niestety ok 15V i ok 5V Żeby świeciły wyraźnie.

Przerobiłem schemat z pomocą Kolegów z Elektrody

Zastosowane układy to 7407.
Czy przy takim podłączeniu trzeba będzie modyfikować kod programu?

Portret użytkownika mirley

Re: Wyświetlacze

jestem pewnie że tranzystory od wyświetlaczy nigdy się nie wyłączą ze względu na napięcie jakie podajesz na bazy 0-5V, żeby sie tranzystor wyłączył potrzebujesz tam 15V. Zajrzyj do mojego projektu timer serwisowy, tam jest to zrobione tak jak powinno być

-

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 xtreme69

Wyświetlacze

Czyli z mojego pomysłu nici (Elektrodowicze wprowadzili mnie w błąd). Będę musiał zastosować Twój patent, domyślam się, że będzie potrzeba zmienić trochę program ponieważ tam sterujesz NPN zamiast PNP.
Jak by miały wyglądać te zmiany p programie?

Portret użytkownika jarecki302

miganie "C"

Mirku dziękuję za odpowiedz ,raczej sa dobrze ustawione bity ale tak do końca nie wiem bo nagrywał mi kolega na lepszym programatorze bo na moim nie chciał się komunikować 2313. Zrobiłem tak że poszczególne segmenty wyświetlacza literki"C" podłączyłem na stałe przez rezystor do zasilania. Zrobiłem kilkanaście sztuk Twoich termometrów na AT51 i wszystko działało. Będę robił jeszcze jeden taki termometr już swoim programatorem, jeśli będę miał problemy to pozwolę sobie zawrócić Ci głowę.
dziękuje i pozdrawiam

jarecki302

Portret użytkownika mirley

Re: Termometr

Fragment programu sterowaia trzeba zmienić:

Select Case Mux
    Case 0:
      Portb = W(3)
      Set Portd.6
    Case 1:
     Reset Portd.6
     Portb = W(2) And &B11011111
     Set Portd.5
    Case 2:
     reset Portd.5
     Portb = W(1)
     Set Portd.4
    Case 3:
     Reset Portd.4
     Portb = 255
     Gosub Temp
    'Case 4:  
  End Select
Return

Wystarczy zamienić set na reset i na odwrót a na starcie w konfiguracji porty na których są anody powinny być ustawione na 0 zamiast na 1

Jesli potrzebne będą tranzystory też na katodach to wystarczy w liniach Portb = W(x) dac Portb = not W(x)

-

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 xtreme69

Wyświetlacze

Witam
Czy o takie zmiany w kodzie chodzi?

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Portb = &B00000000 : Portb = &B00000000
Config Portd = &B11111011 : 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 = 1
'****************************
      '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.2 = 0 Then Kanal = 1
  If Pina.0 = 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.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)
      Set Portd.6
    Case 1:
     Reset Portd.6
     Portb = W(2) And &B11011111
     Set Portd.5
    Case 2:
     reset Portd.5
     Portb = W(1)
     Set Portd.4
    Case 3:
     Reset Portd.4
     Portb = 255
     Gosub Temp
    'Case 4:
  End Select
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
'znak:    0     1     2     3     4     5     6     7     8     9

Najbardziej zastanawia mnie czy to jest dobrze:

Config Portb = &B00000000 : Portb = &B00000000

A to poprawiony schemat

Portret użytkownika gosc11

Zapytanie o pełną optymalizację urządzenia,

Witam,

trochę się dziwie, ze układ chodzi na 8mhz - procesor ciągnie sporo przy takiej częstotliwości i się szybko zużywa. 1mhz powinien wystarczyć.
Ogólnie układ jest bardziej żywotny jak na mniejszej częstotliwości działa. Co z funkcjami oszczędzania energii, wyłączeniem wyświetlania (LEDy się zużywają również jak świecą nonstop), co z ograniczeniami prądowymi, możliwością usypiania itd...???

Odczyt temp nie jest nam przecież non stop potrzebny - tylko wówczas jedynie, gdy na niego patrzymy przecież - czyli jak znam życie to 10s na 24h.

Dlaczego pytam o to, ponieważ właśnie padła mi lodówka - konkretnie termostat i właśnie chcę zastosować powyższy układ do termostatowania (mamy przecież dwie temp. z lodówki i zamrażalki) - jednak nie chce aby w układzie co trzy miesiące trzeba było wymieniać bebechy, bo się zużyły, bo ktoś nie pomyślał aby układ zoptymalizować, a licznik energii kręcił się jak głupi, co doprowadzi mnie do bankructwa, czy porażenia osób trzecich:-))).

Oczywiście brakuje w tym rozwiązaniu przekaźników - jednak łatwo można je dodać.

Moje pytanie jest o optymalizację programu pod katem najmniejszego poboru energii (zasada oszczędności energii zgodnie z wytycznymi dla tego typu urządzeń), przy zachowaniu ścisłej intergralności i zdolności takowego termostatu do poprawnego działania na przestrzeni bardzo długiego okresu czasu - bez wyłączania urządzenia (np.:10-20lat), w optymalnym zakresie temperaturowym, przy standardowej wilgotności dla naszej strefy oraz intensywności promieniowania UV oraz przy pracy w atmosferze gazu nie obojętnego, czyli powietrza.

Jest to niezbędnym wymogiem obecnie produkowanych urządzeń.

Na ile czasu daje Pan gwarancję działania urządzenia przy powyżej podanych elementach i metodologii konstrukcji???

Dodatkowo zapytuję, czy jeśli układ się wyłączy to czy po ponownym włączeniu będzie pamiętał ostatnie ustawienia jakie mu nadaliśmy tzn. czy używamy EPROMu do zapisu ustawień???

Przy lodówce ma to znaczenie, jeszcze nie przeglądałem kodu.

PZD!!!

Portret użytkownika mirley

Termometr

Ustawienia portu:

Config Portb = &B11111111 : Portb = &B00000000

porty muszą być wyjściami jak wstawisz zera do konfigu to nic na nich nie zaświecisz bo będą wejściami

------------

Co do optymalizacji to żeby procek się szybciej zużywał pracując na szybszym zegarze.... pierwsze słyszę..... co do poboru mocy to się zgadzam, jednak przy tych mA pobieranych to średnio chciało by mi się tak z programem kombinować żeby przy 1MHz nic nie migało na wyświetlaczu LED i jeszcze czujniki dobrze działały. Układ na 8MHz spokojnie 20 lat pójdzie chyba że go sam zepsujesz... mam układy działające w garażu już 13 lat na mrozie i w temperaturze +30 stopni w cyklu rocznym - nic się z nim nie dzieje. Raz się procesorek zresetował jak była burza i walneło przepięciem po zasilaniu ale po ponownym ustawieniu zegarka wszystko chodzi dalej na 12MHz.

Tutaj zajmujemy sie raczej nauką budowy różnych urządzeń.... nikt tu nie mówi i nigdy nie mówił o zastosowaniach komercyjnych, czy do masowej produkcji.

termostat jest w najprostszej mozliwej wersji i nie ma zapisu do EEPROM jak dobrze pamiętam... pewnie dlatego że się nie zmieści w procesorku tiny2313.

Gwarancji nie ma żadnej..... jak zrobisz dobrze to układ cię przeżyje jak źle to się uszkodzi po 2 dniach

-

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 Damian3pg

Co ja narobiłem?

Witam, zmontowałem układ zgodnie z schematem lecz na zwykłych dużych elementach z wyjątkiem attiny (jest SMD) i dziwne rzeczy sie tu dzieją, mianowicie układ reaguje na zmianę temperatury (dotykam ds-a) bo cos tam sie zmienia, tylko nie wiem za bardzo co. Miałem dwu segmentowy wyświetlacz (zrobiony przez mnie) to został wykorzystany ale zamiast cyfr pokazuje "P6" albo jakieś inne segmenty są załączane, wygląda jak gdyby zupełnie losowo! Układ jest raczej dobrze zmontowany. Bardzo proszę o jakieś wskazówki bo juz siedzę nad tym z tydzień i bez jakichkolwiek rezultatów. Narazie wszystko zmontowane "luzem" bo nie wiem czy będzie działało i czy jest sens robić obudowe. Tak na marginesie dodam, że nie zależało mi na miniaturyzacji więc wyszło... jak wyszło...
Dodaje zdjęcia mojego cudeńka :D niestety do pobrania.
https://rapidshare.com/files/3612263722/13122012225.jpg
https://rapidshare.com/files/190602575/13122012226.jpg
https://rapidshare.com/files/1637748393/termometer.sch
http://rapidshare.com/files/2875107928/termometer.brd

Portret użytkownika xtreme69

Re: Co ja narobiłem?

Co do schematu to wygląda na prawidłowy, jeśli chodzi o wyświetlacz to widzę że brakuje jednej cyfry i kropki(w oryginale są 3 cyfry, a u kolegi 2) chyba,że nie ma być wyświetlane nic po przecinku. Wtedy nie podłączasz PD4 i PB5
Czy aby na pewno kolega dobrze podłączył segmenty wyświetlacza do Attiny2313 ?

Portret użytkownika Damian3gp

Znowu cos...

Dzięki wielkie, miałeś racje segmenty byly źle podłączone bo niedość, że do góry nogami to jescze tył na przód:D a sprawdzałem ze 3 razy ;/ Ale jest kolejny problem bo przez cały czas słabo świeci segment "f" a gdy jest wykorzystywany np w cyfrze 4 to świeci ładnie.

-

Damian

Portret użytkownika xtreme69

Może jakiś zimny lut lub

Może jakiś zimny lut lub jakieś zwarcie na płytce wyświetlacza?
Sprawdź wszystko jeszcze raz na spokojnie.

Portret użytkownika Damian3gp

Nareszcie

Udało się! wziąłem sobie do serca to co mi doradziłeś i właśnie znalazłem. Na płytce między R5 a R7 zaplątała się mała kulka cyny. Wystarczyło ją oderwac i pokazuje pięknie. Dziękuje za pomoc. Pozdrawiam Damian3gp.

-

Damian

Portret użytkownika xtreme69

wyświetlacze

Witam
Pojawił mi się mały problem po zbudowaniu układu na wyświetlaczach LTS mianowicie cały czas świecą się wszystkie kropki.
Temperaturę wyświetla prawidłowo.

Podłączone są tak jak radził Mirek czyli A do A, B do B, dp do dp itd.
Zamieszczam też zmodyfikowany przeze mnie program :sygnalizacja na Led który czujnik dokonuje pomiaru, zmiana sterowania wyświetlaczy dwa tranzystory NPN (BC548) + PNP(BC557).
Może tutaj popełniłem jakiś błąd.

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Portb = &B11111111 : Portb = &B00000000
Config Portd = &B11111011 : Portd = &B11111111
Config Porta = &B00000010 : 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 = 1
'****************************
      '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.2 = 0 Then Kanal = 1
  If Pina.0 = 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.3 = Not Minus
  If Kanal = 0 Then Porta.1 = 0 Else Porta.1 = 1
 
  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)
      Set Portd.6
    Case 1:
     Reset Portd.6
     Portb = W(2) And &B11011111
     Set Portd.5
    Case 2:
     Reset Portd.5
     Portb = W(1)
     Set Portd.4
    Case 3:
     Reset Portd.4
     Portb = 255
     Gosub Temp
    'Case 4:
  End Select
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
'znak:    0     1     2     3     4     5     6     7     8     9

Zimnych Lutów i zwarć nie ma sprawdzone wszystko kilkanaście razy.
Wykonałem już kilka takich układów na wyświetlaczach podobnych jak w projekcie i na oryginalnym sofcie i nie było takich problemów.

Pozdrawiam Michał

Portret użytkownika mirley

Re: Termometr

W programie w sekcji wyświetlania nie widze problemu, linijka Portb = W(2) And &B11011111 odpowiada za kropkę na wyświetlaczu W(2) reszta nie powinna miec kropki. na oryginalnym sofcie to działa dobrze?

-

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 xtreme69

Wyświetlacze

Nie jestem w stanie sprawdzić tego na oryginalnym sofcie, gdyż podłączenie wyświetlaczy jest zrealizowane inaczej niż tutaj. Mianowicie zrobione jest to według Twojego schematu Timer serwisowy

Portret użytkownika mirley

Re: Schemat

A masz procesor w obudowie przewlekanej? jeśli tak to go wyjmij z podstawki, włącz zasilanie i stykaj kabelkiem w podstawce odpowiednie piny, czyli: Włączasz anodę pierwszego wyświetlacza, i dotykasz kabelkiem do tranzystorów sterowania wszystkich katod (wszystko w podstawce procka). Jesli wszystko się zapala dobrze to trzeba szukać w programie?

-

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 xtreme69

Wyświetlacze

Jak będę w domu to zaraz sprawdzę bez procka na krótko.
Ale zastanawia mnie najbardziej to:
wg oryginału

Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111011 : Portd = &B11111111
Config Porta = &B00000000 : Porta = &B11111111

po mojej modyfikacji:
Config Portb = &B11111111 : Portb = &B00000000
Config Portd = &B11111011 : Portd = &B11111111
Config Porta = &B00000010 : Porta = &B11111111

sterowanie kropką:

 Portb = W(2) And &B11011111

Może źle wnioskuje ale wydaje mi się, że skopałem coś z konfiguracją.

Dodano:
Sprawdziłem wszystko na krótko w podstawce tak jak mi doradziłeś i wyświetlacz działa prawidłowo czyli po załączeniu np.tranzystorów anody W(1) i podaniu sygnału na Pb.5 zapala się tylko jedna kropka.

Niestety zostały mi już tylko Attiny2313 w SMD więc nie mam procka na podmianę aby wykluczyć jego awarię.
Pozdrawiam Michał

Portret użytkownika xtreme69

Wyświetlacze

Udało mi się dorwać od znajomego sprawną Attiny i procek jest na 100% sprawny.
Pokombinowałem sobie trochę w kodzie i przy ustawieniu

Config Portb = &B11111101 : Portb = &B11111111

wygasza jeden segment na wszystkich wyświetlaczach, natomiast to ustawienie
Config Portb = &B11011111 : Portb = &B11111111

nie wyłącza segmentu "db" mimo iż PB.5 jest ustawiony jako wejście.
Kombinowałem z różnymi konfiguracjami portów w programie (mimo mojej słabej znajomości Bascoma) i nic nie pomaga.

P.S. Sory za post pod postem.

Portret użytkownika mirley

Re: Wyswietlacz

Napewno port b musi być ustawiony jako wyjście i jeśli masz tak jak w timerze serwisowym to stan wszystkich pinów powinien być równy 1. Prawie napewno wiem dlaczego tak się dzieje z ta kropką? Czy nie czasem jedna z kropek świeci jasniej? Cała idea z wysokim zasilaniem 9V w moim przypadku samego wyświetlacza bazuje na tym że jeśli pin jest w stanie wysokim to jest na nim 5V czyli 9V-5V = 4V i to za mało żeby zaświecić segment w którym jest kilka szeregowych diod. Natomiast Kropka może mieć mniej diod w szeregu i jeśli dałeś wyższe zasilanie niż ja to może ona świecić niezależnie od stanu procka. W ramach testu musiał byś dać tranzystor d sterowania pinem dp i nie sterować go bezpośrednio z portu. Dla testów możesz obniżyć zasilanie wyświetlacza czy czasami nie zacznie dobrze działać.

-

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 xtreme69

Wyświetlacze

Wszystkie kropki świecą jednakowo jasno.
Zasilam to zasilaczem laboratoryjnym, napięcie to 12,4 V
Obniżenie zasilania nie pomaga, Najpierw wygaszają się segmenty a później kropki.

Quote:
W ramach testu musiał byś dać tranzystor d sterowania pinem dp i nie sterować go bezpośrednio z portu

Możesz opisać dokładniej sterowanie pinem dp przez tranzystor bez sterowania z portu, bo nie bardzo wiem co masz na myśli.
Czy do tego będzie też potrzebna jakaś zmiana w programie?

Portret użytkownika mirley

Re: Wyświetlacz

Chodziło mi to że zamiast sterować katodami od kropek przez zwarcie do masy, dać tam tranzystor npn zwierający do masy i sterowac go stanem wysokim. Jednak jeśli mówisz że obnizenie zasilania nie pomogło to skończyły mi się pomysły. A jeśli zostawisz w programie sam do loop i ustawisz tylko pin zeby jedna z anod była włączona. To np migaj kropką co 1s używając w do loop tylko wait

-

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 xtreme69

Wyświetlacze

Teraz już wiem co miałeś na myśli, chodzi zapewne o coś takiego:

Czy taka zmiana w kodzie wtedy wystarczy

 Portb = W(2) And &B11011111

Też i się kończą pomysły, jak nie uda się tego rozwiązać to myślałem o brzydkim odcięciu ścieżek od segmentów dp pozostałych wyświetlaczy.

Portret użytkownika mirley

Re: Dp

Niestety z pewnością nie wystarczy ale na start wystarczy sprawdzić czy statycznie mikrokontroler zapala i gasi punkty dp na wyświetlaczach. Potem będzie trzeba jeszcze zanegować bit od punktu w całej tabelce lookup

-

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 lukpc1

znak "-" przy minusowych temperaturach

czy da się jakoś wprowadzić np diodę led że by informowała że to jest minusowa temperatura

Portret użytkownika xtreme69

Re znak -

Kolego wystarczy czytać ze zrozumieniem, Mirek wszystko ładnie opisał

Quote:
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 "-".

Podłączasz pod OUT.

Pozdrawiam Michał

Portret użytkownika lukpc1

ok juz wcześniej zobaczyłem

ok juz wcześniej zobaczyłem dzieki

Portret użytkownika cienkipyrtol

alarm temperatury

Witam!
Panowie a czy jest szansa żeby w tym projekcie w podstawowej wersji (czyli. czujnik 2 temperatur z minusem) do dowolnego portu podłączyć buzer i ustawić już w programie temperaturę załączenia na 85st. bez żadnej histerezy. Poprostu ma się włączyć buzer jak jest temperatura powyżej 85st.
To będzie alarm przed zagotowaniem wody w piecu c.o. i przy okazji będzie pokazywał temperaturę na piecu.

Do kol. Mirley.
W innym projekcie pytałem Ciebie o dokładnie to samo, niestety zmieniłem koncepcję i ten wyświetlacz będzie bardziej czytelny dla rodziców.

Pozdrawiam

Portret użytkownika mirley

Re: Termometr

Da się dopisac prosty alarm:

    .....
   T = T / 16
 
   if T > 850 then set portx.y else reset portx.y 
 
   1wreset Pind , Kanal
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &H44 , 1 , Pind , Kanal

Wadą jest to że termometr mierzy zawsze tylko jeden kanał więc alarm temperatury będzie działał na kanale który jest aktualnie wyświetlany

-

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 cienkipyrtol

Dzięki Mirley:) na drugiej

Dzięki Mirley:)
na drugiej stronie tego tematu jest podane jak zrobić autoprzełączanie między in/out.
Ustawię sobie alarm na 80st i w razie czego zdąży się włączyć. W sobote musze kupić wyświetlacz i wszystko poskładać, o efektach poinformuję.
Pozdrawiam

Portret użytkownika pawel1968

Minitermometr i histereza

Witam Mirku. Wykonałem kolejny Twój projekt ( z żadnym nie miałem najmniejszego problemu). Pytanie moje jest następujące: - jak z programu mini termometru usunąć histerezę? Które linijki kodu należy usunąć, gdyż nie mogę sobie z tym poradzić. Pozdrawiam.

'****************************
           'Konfiguracja
'****************************
$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111011 : 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 , Tu As Integer
Dim H As Integer , L As Integer
Dim Mux As Byte , I As Byte
Dim Ust As Bit
Dim Autoret As Byte
 
Dim F1s As Bit , F4ms As Bit , F100ms As Bit
Dim Minus As Bit
Dim Kanal As Byte
'****************************
      'Wartosci Poczatkowe
'****************************
Kanal = 1
Tu = 280
'****************************
      'Petla glowna
'****************************
Do
 
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
 
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.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:                                                 'opoznienie na odczyt temp, je?li nie ma to miga wyswietlacz
 
  End Select
 
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
'znak:    0     1     2     3     4     5     6     7     8     9

Portret użytkownika mirley

Re: histereza

 H = Tu + 10
 L =  Tu - 10

+10 i -10 daje histereze +/-1 stopień nie polecam całkiem wywalać histerezy, jednak jak dasz
 H = Tu 
 L =  Tu 

to będzie 0.1 stopnia histerezy bo tylko dla temperatury dokłądnie równej ustawionej nic się nie będzie dział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 pawel1968

Minitermometr i histereza

Witam i dziękuję za podpowiedź. Teraz rozumiem o co chodzi. Czyli działanie programu bez zmian będzie powodować wysterowanie portu PD.3 (przy temp. ustawionej na np. 30 st.C)przy 30 st C, wyłączenie przy 31 st C. Z programu wynika, że temp. początkowa to 28 st C, czyli nie można ustawić mniejszej temperatury przy której zmieni stan port PD.3 ( chyba ,że ustawimy w programie inną). Z tego fragmentu:

If T > H Then Set Portd.3
If T < L Then Reset Portd.3

widać, że stan portu PD.3 będzie zmieniał się przy 30 i 31 st. C. Co należy zrobić, aby termostat działał w następujący sposób: tem. ustawiona na np. 35 st. C następuje wysterowanie portu, temperatura rośnie np. do 90 st C i nic się nie dzieje. Temperatura spada do 34 st C i następuje zmiana stanu portu. Czy wystarczy usunąć jedną ze zmiennych H lub L i zastąpić inną, oraz dopisać tylko jeden warunek If? Nie wiem czy dobrze myślę?

Portret użytkownika Krystian

Ds18b20 na 2 przewodach

Witam super projekt .Może autor lub ktoś mi podpowie czy można do tego układu podlaczyc ds18b20 na 2 przewodach a nie na 3. pozdrawiam

Portret użytkownika oldname

Modułowy minitermometr dwukanałowy z termostatem

Trochę czasu upłynęło od postu #12 i #13 strona 4-ta ale przeszedłem od teorii do praktyki.Opracowałem,zbudowałem i uruchomiłem układ oparty na projekcie kolegi Mireya.
Najpierw pokażę kilka fotek.

Przenośny, czteromodułowy, zasilany z sieci, 4-ro cyfrowy minitermometr z termostatem. Na pierwszym zdjęciu temperatura z DS1(temperatura na zewnątrz) a na drugim z DS2(podgrzany lutownicą).

Trzycyfrowy ,czteromodułowy termostat z pomiarem temperatury. Na pierwszym zdjęciu pomiar DS2 w zamrażalniku a na drugim z DS1 w chłodziarce.

Schematy do trzycyfrowego i czterocyfrowego są podobne ale zaprezentuję oba.

Trochę musiałem przeprojektować płytki obwodów drukowanych i doprojektować poszczególne moduły.
Chciałem zamieścić w pliku PDF ale chyba nie ma takiej opcji na tym forum
W następnym poście zamieszczę wsady w bas.bo mam kilka pytań. Na tę chwilę muszę przerwać bo Bascom odmówił posłuszeństwa.

[/qb]

-

oldname

Portret użytkownika oldname

Do postu wyżej

Bascom ruszył.
Wsad do trzycyfrowego.

           'Konfiguracja
'****************************
 
$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111011 : Portd = &B11111111
Config Porta = &B00000010 : 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(2) As Integer , Tu As Integer
Dim H As Integer , L As Integer , Th As Integer
Dim Mux As Byte , I As Byte , Kanal As Byte
Dim Ust As Bit
Dim Menu As Byte , Brakds(2) As Byte , Autokanal As Byte
Dim F500ms As Bit , F4ms As Bit , F100ms As Bit
Dim Minus As Bit
 
'****************************
      'Petla glowna
'****************************
 
Readeeprom Tu , 1
Readeeprom Th , 10
 
Do
 
If F4ms = 1 Then
  Reset F4ms
 
    Select Case Menu
 
      Case 0:
      Kanal = 0
      Minus = T(1).15
      Wysw = Abs(t(1))
 
      Case 1:
      Kanal = 1
      Minus = T(2).15
      Wysw = Abs(t(2))
 
      Case 2:
      If Kanal = 0 Then
       Minus = T(1).15
       Wysw = Abs(t(1))
      Else
       Minus = T(2).15
       Wysw = Abs(t(2))
      End If
 
      Case 3:
      Minus = Tu.15
      Wysw = Abs(tu)
 
      Case 4:
      Wysw = Abs(th)
 
   End Select
 
    Gosub Wyswietl_zmierz
 
End If
 
   If F100ms = 1 Then
    Reset F100ms
 
    If Pina.0 = 0 And Pind.2 = 0 Then                       '
       If Ust = 0 Then
          Ust = 1
         Incr Menu
       End If
         Else
          Ust = 0
    End If
 
   Select Case Menu
 
     Case 3:
 
      If Pind.2 = 0 Then
        Incr Tu
      End If
 
      If Pina.0 = 0 Then
        Decr Tu
      End If
 
     Case 4:
 
      If Pind.2 = 0 Then
       Incr Th
      End If
 
      If Pina.0 = 0 Then
       Decr Th
      End If
 
     Case 5:
 
      Gosub Zapistu
      Gosub Zapishi
        Menu = 0
 
   End Select
 
    H = Tu + Th
    L = Tu - Th
 
  If T(1) > H Then Reset Portd.3
  If T(1) < L Then Set Portd.3
  If Brakds(1) = 1 Then Reset Portd.3
 
End If
 
Loop
End
'****************************
   'zapis
'****************************
 Zapishi:
 
 
   Disable Interrupts
   Writeeeprom Th , 10
   Enable Interrupts
 
Return
 
 Zapistu:
 
   Disable Interrupts
   Writeeeprom Tu , 1
   Enable Interrupts
 
Return
'****************************
      '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) = 5 Then
       Dziel(2) = 0
       Set F500ms
     End If
   End If
Return
'****************************
      'pomiar temp
'****************************
 
Temp:
 
 If F500ms = 1 Then
   Reset F500ms
 
   Incr Autokanal
  If Autokanal = 10 Then
  Autokanal = 0
   Toggle Kanal.0
     End If
 
   1wreset Pind , Kanal
   Brakds(kanal + 1) = Err
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &HBE , 1 , Pind , Kanal
   T(kanal + 1) = 1wread(2 , Pind , Kanal):
   T(kanal + 1) = T(kanal + 1) * 10
   T(kanal + 1) = T(kanal + 1) / 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 = 6 Then Mux = 0
 
  Porta.1 = Not Minus
 
  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(3) = 40 Then W(3) = 255
 
 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)
     Portb.5 = Kanal.0
     Reset Portd.4
 
    Case 3:
     Set Portd.4
     Portb = 255
     Gosub Temp
 
  End Select
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
'Znak : 0 1 2 3 4 5 6 7 8 9

Wsad do czterocyfrowego
'****************************
           'Konfiguracja
'****************************
 
$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B11111011 : Portd = &B11111111
Config Porta = &B00000010 : 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(4) As Byte
Dim Wysw_pomoc As Word
Dim T(2) As Integer , Tu As Integer
Dim H As Integer , L As Integer , Th As Integer
Dim Mux As Byte , I As Byte , Kanal As Byte
Dim Ust As Bit
Dim Menu As Byte , Brakds(2) As Byte , Autokanal As Byte
Dim F500ms As Bit , F4ms As Bit , F100ms As Bit
Dim Minus As Bit
 
'****************************
      'Petla glowna
'****************************
 
Readeeprom Tu , 1
Readeeprom Th , 10
 
Do
 
If F4ms = 1 Then
  Reset F4ms
 
    Select Case Menu
 
      Case 0:
      Kanal = 0
      Minus = T(1).15
      Wysw = Abs(t(1))
 
      Case 1:
      Kanal = 1
      Minus = T(2).15
      Wysw = Abs(t(2))
 
       Case 2:
      If Kanal = 0 Then
       Minus = T(1).15
       Wysw = Abs(t(1))
      Else
       Minus = T(2).15
       Wysw = Abs(t(2))
      End If
 
      Case 3:
      Minus = Tu.15
      Wysw = Abs(tu)
 
      Case 4:
      Wysw = Abs(th)
 
   End Select
 
    Gosub Wyswietl_zmierz
 
End If
 
   If F100ms = 1 Then
    Reset F100ms
 
    If Pina.0 = 0 And Pind.2 = 0 Then                       '
       If Ust = 0 Then
          Ust = 1
         Incr Menu
       End If
         Else
          Ust = 0
    End If
 
   Select Case Menu
 
     Case 3:
 
      If Pind.2 = 0 Then
        Incr Tu
      End If
 
      If Pina.0 = 0 Then
        Decr Tu
      End If
 
     Case 4:
 
      If Pind.2 = 0 Then
       Incr Th
      End If
 
      If Pina.0 = 0 Then
       Decr Th
      End If
 
     Case 5:
 
      Gosub Zapistu
      Gosub Zapishi
        Menu = 0
 
   End Select
 
    H = Tu + Th
    L = Tu - Th
 
  If T(1) > H Then Reset Portd.3
  If T(1) < L Then Set Portd.3
  If Brakds(1) = 1 Then Reset Portd.3
 
End If
 
Loop
End
'****************************
   'zapis
'****************************
 
Zapistu:
 
   Disable Interrupts
   Writeeeprom Tu , 1
   Enable Interrupts
 
Return
 
Zapishi:
 
   Disable Interrupts
   Writeeeprom Th , 10
   Enable Interrupts
 
Return
'****************************
      '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) = 5 Then
       Dziel(2) = 0
       Set F500ms
     End If
   End If
Return
'****************************
      'pomiar temp
'****************************
 
Temp:
 
 If F500ms = 1 Then
   Reset F500ms
 
   Incr Autokanal
  If Autokanal = 10 Then
  Autokanal = 0
   Toggle Kanal.0
  End If
 
   1wreset Pind , Kanal
   Brakds(kanal + 1) = Err
   1wwrite &HCC , 1 , Pind , Kanal
   1wwrite &HBE , 1 , Pind , Kanal
   T(kanal + 1) = 1wread(2 , Pind , Kanal):
   T(kanal + 1) = T(kanal + 1) * 10
   T(kanal + 1) = T(kanal + 1) / 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 = 6 Then Mux = 0
 
  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) = 40 Then W(4) = 255
   'If W(3) = 40 Then W(3) = 255
 
 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)
     Portb.5 = Kanal.0
     Reset Portd.4
 
    Case 3:
     Set Portd.4
     Portb = W(4)
     Portb.7 = Not Minus
     Portb.1 = Minus
     Reset Porta.1
 
    Case 4:
     Set Porta.1
     Portb = 255
     Gosub Temp
 
  End Select
Return
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 40 , 235 , 50 , 162 , 225 , 164 , 36 , 234 , 32 , 160
'Znak : 0 1 2 3 4 5 6 7 8 9

Wsady te należy kompilować w najnowszym Bascomie bo w starszych wersjach zabraknie flesha.
Nie wszystko w tym programie ogarniam w 100% dlatego proszę o uwagi. W którymś poście kolega Mirley powiedział że nie każdy program który działa jest dobrze napisany i ja się z tym całkowicie zgadzam. Wsad do czterocyfrowego zajmuje 2030 bajtów a do trzycyfrowego 1998 bajtów. Próbowałem dopisać jeszcze jedno menu(ustawianie czasu przełączenia temperatur) ale zabrakło około 8 bajtów. Proszę o analizę i sugestie co by można zmienić czy ulepszyć.

-

oldname

Portret użytkownika Krystian

Automatyczne wylaczanie

Ogromna prosba do Mirleya aby pomógł zrobić aby można bylo wylaczyc klawiszem automatyczne zmiany temperatury z 2 czujników a potem tym samym klawisze to wlaczyc.Gdyż czasami nie jest potrzebna automatyczna zmiana.Tego Mi bardzoo brakuje Pozdrawiam.

Portret użytkownika cienkipyrtol

Panowie właśnie odpaliłem

Panowie właśnie odpaliłem termometr i wszystko ruszyło od kopa- super sprawa.
We wtorek jak będę miał chwilkę czasu w pracy będę usiłował dodać alarm i automatyczne przełączanie
pomiędzy temperaturami wg. wskazówek kol. mirka.
Mam jeszcze jedno pytanie:
Czy nie uważacie, że ciekawym sposobem wyświetlania ujemnych temperatur jest sposób bez miejsca po przecinku i na pierwszym elemencie wyświetlany znak minusa. czyli np. - 1, - 2, -12 itd. ale tylko temperatury ujemne, dodatnie normalnie po przecinku np. 4.5 ; 23.8 itd.
Czy jest to wogóle wykonalne czy kod musiałby być znacząco zmodyfikowany?

Pozdrawiam

Portret użytkownika lukpc1

hej mirley ja też byłbym

hej mirley ja też byłbym zainteresowany tą opcją, czy możesz zmienić kod, tak by jeden przycisk włączał i wyłączał auto zmiane czujnika, a drugi przełączał pomiędzy czujnikami. Było by świetnie, czy możesz podać linijki kodu do zmiany. Pozdrawiam lukpc1

Portret użytkownika oldname

do cienkipyrtol/krystian/lukpc1

Kolega Mirley pewno korzysta z uroków zimy dlatego odniosę się do pytań, zwłaszcza że wykonałem kilka tych termometrów.Co do znaku minusa to lepiej dodać prostokątną diodę z opornikiem(parę postów wyżej widok lodówki z trzycyfrowym termometrem). Co do przełączania wyświetlania temperatur oraz załączania alarmu proponuję skorzystać z projektu post #40 na tej stronie.Wystarczy wykonać moduł "I" czyli projekt Mirleya z dodaną diodą znaku"-",dodatkowego przycisku,diody zaporowej przy korzystaniu z programatora USBASP i rezystora lub potencjometru by wyregulować jasność świecenia wyświetlacza oraz wyprowadzenie pinu portu termostatu (alarmu) do sterowania dowolnym urządzeniem. Program zapewnia dzięki dodatkowemu przyciskowi(przycisk z dwoma wyprowadzeniami 3x6) wybór Menu. Po załączeniu wyświetla menu:
1.temperaturę z ds1/ po naciśnięciu
2.temperaturę z ds2/ po naciśnięciu
3.naprzemiennie temperaturę ds1 lub ds2 co 5sek/ można zmienić w programie/po naciśnięciu
4.wartość temperatury ustawianej termostatu (alarmu) w zakresie temperatur dodatnich jak i ujemnych/po naciśnięciu
5.wartość bezwzględną histerezy termostatu (alarmu)/ po naciśnięciu powrót do pozycji pierwszej
Częstotliwość odczytu temperatury zależy od wartości zmiennej Autokanal (1sek to wartość 2)
Podczas wyświetlania ds1 świeci się ostatnia kropka a podczas wyświetlania temperatury ustawianej lub histerezy ostatnia kropka miga z częstotliwością ustawionej wartości Autokanal.
Termostat działa zawsze z ds1 niezależnie od wyświetlanej temperatury.Ustawienia temperatury i histerezy zapisywane są do pamięci eeprom. Urządzenia które wykonałem pracują od kilku tygodni bezawaryjnie.W poście #40 brak obwodów drukowanych ale jeśli ktoś reflektuje to wyślę emailem.
W kodzie pewno można by jeszcze co nieco pozmieniać i jak ktoś ma pomysł to proszę o sugestie.
Koledzy którzy mają już gotowe płytki niestety ale tak jak i ja muszą chyba poczekać na kolegę Mirleya

-

oldname

Portret użytkownika Krystian

Bardziej mi zależy na tym co

Bardziej mi zależy na tym co już mam żeby jednym włącznikiem włączyć automatyczne przełączanie . a drugim przełączać ręcznie pomiędzy czujnikami pozdrawiam

Portret użytkownika oldname

Wyłączanie automatycznego przełączania temperatur


'****************************
'pomiar temp
'****************************
Temp:
If F1s = 1 Then
Reset F1s

If Pind.2 = 0 And Pina.0 = 0 Then
Incr Pomasw
Gosub Zapispomasw
End If
If Pomasw = 10 Then
Pomasw = 0
End If
Incr Auto_sw
If Auto_sw = Pomasw Then
Auto_sw = 0
Toggle Kanal.0
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
Trochę przeredagowałem tego posta ponieważ zasadniczo nie wprowadza efektu oczekiwanego. Pojawił się problem i jestem ciekaw dlaczego tak jest.
Przyciskając oba przyciski jednocześnie można ustawić czs przełączania do 10sek. Jeżeli ustawimy 0,0 wtedy automatyczne przełączanie nie działa a przyciskami można wybierać dowolnego ds-a.Ma ten kod niestety wadę, a mianowicie po każdym przejściu przez zero w czasie ustawiania czasu przełączania, trzeba odczekać około 4 minut by następowało przełączanie w ustawionym czasie. Jeśli po ustawieniu tego czasu wyłączymy zasilanie na parę sek to wszystko jest ok.Dlaczego się tak dzieje to nie wiem ale może ktoś poradzi co trzeba zrobić.

-

oldname

Portret użytkownika IMEX2

4 minuty

Sprawa dotyczy tego Auto_sw As Byte
czyli 255 / 60 i tu masz około 4 minut

zmień to

     Incr Auto_sw
   If Auto_sw = Pomasw Then
     Auto_sw = 0
     Toggle Kanal.0
   End If

na to

     Incr Auto_sw
   if auto_sw > 10 then auto_sw = 0
   If Auto_sw = Pomasw Then
     Auto_sw = 0
     Toggle Kanal.0
   End If

to tak na sztywno bez " = "
możesz zmienić i to dalej z " If Auto_sw = Pomasw Then " na " If Auto_sw => Pomasw Then "

-

Grzesiek - miasto Ostróda

GG 12372371 dom
tel 502812675 SMS

Portret użytkownika oldname

4 minuty

Tak to nie działa.Cały czas przełącza ds-y. Mnie to trzeba bardziej łopatologicznie.

-

oldname

Portret użytkownika IMEX2

co nie dziala

pisz na GG lub co ci nie działa

przy pierwszym odpaleniu po tej zmianie juz nie bedzie 4 min

-

Grzesiek - miasto Ostróda

GG 12372371 dom
tel 502812675 SMS