https://www.elektroda.pl/rtvforum/topic3871878.html
To jest termometr na DS18B20 od -30 do +34 tylko zamiast wyświetlacza użyta jest linijka z 64 diod sterowana przez Max7219
Oczywiście diody mogą być różnokolorowe. Na przykład poniżej zera niebieskie a powyżej "coraz cieplejsze"
Nie miałem linijki to podłączyłem ten wyświetlacz 8x7seg. Na początku jest test linijki (czy LEDy po kolei).
łatwo można zrobić by tylko jedna kropka odpowiedzialna za aktualną temp się zapaliła.
Nagrałem nawet krótkie wideo. Może potem tu wrzucę.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "attiny85.dat"
- $crystal = 1000000
- $hwstack = 4
- $swstack = 0
- $framesize = 24
- 'Termometr na DS18B20 -30st. C do +36st. C
- 'Wyswietlacz to linijka na MAX7219. Każdy bit po kolei w rejestrach MAX to 1st.C
- 'BARTek niveasoft bart-projects
- $projecttime = 63
- Config Submode = New
- Const Cdbg = 1
- #if Cdbg
- Open "COMB.3:9600,8,n,1" For Output As #1
- #endif
- '*********************************************
- '* MAX7219 CONFIG *
- '*********************************************
- Ser_data Alias Portb.0 : Config Ser_data = Output
- Cs_enable Alias Portb.1 : Config Cs_enable = Output : Set Cs_enable
- Ser_clk Alias Portb.2 : Config Ser_clk = Output :
- Dim Disp_buff As Word
- Dim Disp_num As Byte At Disp_buff + 1 Overlay
- Dim Disp_data As Byte At Disp_buff Overlay
- Dim Bar As Double , N As Byte
- Dim Disp(8) As Byte At Bar Overlay
- Sub Disp_write
- Reset Cs_enable
- Shiftout Ser_data , Ser_clk , Disp_buff , 1
- Set Cs_enable
- End Sub
- Sub Max7219_setup
- Disp_num = &H0C : Disp_data = 0 '&H0C Power mode, 0-OFF,1-ON
- Call Disp_write
- '-----------------------------------------------------------------------------------------------------------------------
- 'Disp_num = &H9 : Disp_data = &B1111_1111 'Jeden bit na jeden wyswietlacz,wlaczaja dekodowanie cyfr
- '10 - (kreska)'11 E '12 H '13 L '14 P '15 " " (pusty)
- '-----------------------------------------------------------------------------------------------------------------------
- 'dla linijki Bar nie korzystamy z dekodowania
- 'bity po kolei w osmiu bajtach oznaczają temp -30 do +34
- Disp_num = &H9 : Disp_data = &B0000_0000
- Call Disp_write
- Disp_num = &H0A : Disp_data = &H0F 'jasnosc 16 krokow, wartosci od &H00 do &H0F
- Call Disp_write
- Disp_num = &H0B : Disp_data = 7 'ile ma obsługiwac cyfr, wartosci od 0 do 7
- Call Disp_write
- Disp_num = &H0F : Disp_data = 0 'Test wyswietlacza, 0-OFF, 1-TEST ON
- Call Disp_write
- Disp_num = &H0C : Disp_data = 1 '&H0C Power mode, 0-OFF,1-ON
- Call Disp_write
- End Sub
- Sub Show_bar
- For N = 0 To 63
- If New_temp > N Then Set Bar.n Else Reset Bar.n
- Next
- For N = 1 To 8
- Disp_num = 9 - N 'odwróć kolejność / nie zawsze potrzebne
- Disp_data = Disp(n)
- Call Disp_write
- Next
- End Sub
- Sub Test_bar
- Local I As Byte
- For I = 0 To 63
- New_temp = I
- Call Show_bar
- Waitms 50
- Next
- Waitms 500
- For I = 63 To 0 Step - 1
- New_temp = I
- Call Show_bar
- Waitms 50
- Next
- End Sub
- '*********************************************
- '* DS18B20 CONFIG *
- '*********************************************
- Config 1wire = Portb.4
- Dim Bytes(9) As Byte , Sum As Byte
- Dim New_temp As Integer At Bytes(1) Overlay 'dwa pierwsze bajty tablicy tworzą tez Integer ;)
- Dim Prev_temp As Integer , Tempb As Byte
- Sub Start_conversion
- 1wreset
- 1wwrite &HCC
- 1wwrite &H44
- End Sub
- Sub Read_temp
- 1wreset
- 1wwrite &HCC
- 1wwrite &HBE
- Bytes(1) = 1wread(9) 'odczytaj 9 bajtów do tablicy (8 bajtów i CRC obliczone przez czujnik)
- Sum = Crc8(bytes(1) , 8) 'sam oblicz CRC z ośmiu bajtów
- If Bytes(8) = &H10 Then 'sprawdzenie czy ósmy bajt zawiera &H10
- If Sum = Bytes(9) Then 'jeśli nasze obliczenia zgadzaja się z tymi od czujnika...
- New_temp = New_temp * 10
- New_temp = New_temp \ 160 'dokładność 1st. C
- 'zabezpieczenie -30 do +34
- Select Case New_temp
- Case Is < -30 : New_temp = -30
- Case Is > 34 : New_temp = 34
- End Select
- #if Cdbg
- Print #1 , "T=" ; New_temp
- #endif
- New_temp = New_temp + 30 'przesuniecie 0 - 63
- 'tylko jesli temp sie zmieniła
- If Prev_temp <> New_temp Then
- Prev_temp = New_temp
- Call Show_bar
- End If
- End If
- End If
- End Sub
- Call Max7219_setup
- Call Start_conversion
- Call Test_bar
- Do
- Wait 1
- Call Read_temp
- Call Start_conversion
- Loop