Elektroniczny termometr - linijka

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Elektroniczny termometr - linijka

Post autor: niveasoft » 13 lut 2022, 16:08

Na Elektrodzie jest taki temat w którym się udzieliłem i na końcu napisałem króciutki programik.
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" :D

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ę.
  1. $regfile = "attiny85.dat"
  2. $crystal = 1000000
  3. $hwstack = 4
  4. $swstack = 0
  5. $framesize = 24
  6.  
  7. 'Termometr na DS18B20 -30st. C do +36st. C
  8. 'Wyswietlacz to linijka na MAX7219. Każdy bit po kolei w rejestrach MAX to 1st.C
  9. 'BARTek niveasoft bart-projects
  10.  
  11. $projecttime = 63
  12.  
  13. Config Submode = New
  14. Const Cdbg = 1
  15.  
  16. #if Cdbg
  17.  Open "COMB.3:9600,8,n,1" For Output As #1
  18. #endif
  19. '*********************************************
  20. '*           MAX7219 CONFIG                  *
  21. '*********************************************
  22.   Ser_data Alias Portb.0 : Config Ser_data = Output
  23.   Cs_enable Alias Portb.1 : Config Cs_enable = Output : Set Cs_enable
  24.   Ser_clk Alias Portb.2 : Config Ser_clk = Output :
  25.  
  26.   Dim Disp_buff As Word
  27.   Dim Disp_num As Byte At Disp_buff + 1 Overlay
  28.   Dim Disp_data As Byte At Disp_buff Overlay
  29.  
  30.   Dim Bar As Double , N As Byte
  31.   Dim Disp(8) As Byte At Bar Overlay
  32.  
  33. Sub Disp_write
  34.   Reset Cs_enable
  35.    Shiftout Ser_data , Ser_clk , Disp_buff , 1
  36.   Set Cs_enable
  37. End Sub
  38.  
  39. Sub Max7219_setup
  40.    Disp_num = &H0C : Disp_data = 0                          '&H0C Power mode, 0-OFF,1-ON
  41.     Call Disp_write
  42.  
  43. '-----------------------------------------------------------------------------------------------------------------------
  44.   'Disp_num = &H9 : Disp_data = &B1111_1111                 'Jeden bit na jeden wyswietlacz,wlaczaja dekodowanie cyfr
  45.                                                             '10 - (kreska)'11 E '12 H '13 L '14 P '15 " " (pusty)
  46. '-----------------------------------------------------------------------------------------------------------------------
  47. 'dla linijki Bar nie korzystamy z dekodowania
  48. 'bity po kolei w osmiu bajtach oznaczają temp -30 do +34
  49.    Disp_num = &H9 : Disp_data = &B0000_0000
  50.     Call Disp_write
  51.    Disp_num = &H0A : Disp_data = &H0F                       'jasnosc 16 krokow, wartosci od &H00 do &H0F
  52.     Call Disp_write
  53.    Disp_num = &H0B : Disp_data = 7                          'ile ma obsługiwac cyfr, wartosci od 0 do 7
  54.     Call Disp_write
  55.    Disp_num = &H0F : Disp_data = 0                          'Test wyswietlacza, 0-OFF, 1-TEST ON
  56.     Call Disp_write
  57.    Disp_num = &H0C : Disp_data = 1                          '&H0C Power mode, 0-OFF,1-ON
  58.     Call Disp_write
  59. End Sub
  60.  
  61. Sub Show_bar
  62.  
  63.   For N = 0 To 63
  64.     If New_temp > N Then Set Bar.n Else Reset Bar.n
  65.   Next
  66.  
  67.   For N = 1 To 8
  68.    Disp_num = 9 - N                                         'odwróć kolejność / nie zawsze potrzebne
  69.     Disp_data = Disp(n)
  70.      Call Disp_write
  71.   Next
  72. End Sub
  73.  
  74. Sub Test_bar
  75.   Local I As Byte
  76.  
  77.   For I = 0 To 63
  78.    New_temp = I
  79.    Call Show_bar
  80.     Waitms 50
  81.   Next
  82.     Waitms 500
  83.   For I = 63 To 0 Step - 1
  84.    New_temp = I
  85.    Call Show_bar
  86.     Waitms 50
  87.   Next
  88.  
  89. End Sub
  90.  
  91.  
  92. '*********************************************
  93. '*           DS18B20 CONFIG                  *
  94. '*********************************************
  95.   Config 1wire = Portb.4
  96.  
  97.   Dim Bytes(9) As Byte , Sum As Byte
  98.   Dim New_temp As Integer At Bytes(1) Overlay               'dwa pierwsze bajty tablicy tworzą tez Integer ;)
  99.   Dim Prev_temp As Integer , Tempb As Byte
  100.  
  101. Sub Start_conversion
  102.  1wreset
  103.    1wwrite &HCC
  104.    1wwrite &H44
  105. End Sub
  106.  
  107. Sub Read_temp
  108.     1wreset
  109.       1wwrite &HCC
  110.       1wwrite &HBE
  111.       Bytes(1) = 1wread(9)                                  'odczytaj 9 bajtów do tablicy (8 bajtów i CRC obliczone przez czujnik)
  112.  
  113.     Sum = Crc8(bytes(1) , 8)                                'sam oblicz CRC z ośmiu bajtów
  114.  
  115.      If Bytes(8) = &H10 Then                                'sprawdzenie czy ósmy bajt zawiera &H10
  116.  
  117.        If Sum = Bytes(9) Then                               'jeśli nasze obliczenia zgadzaja się z tymi od czujnika...
  118.  
  119.          New_temp = New_temp * 10
  120.          New_temp = New_temp \ 160                          'dokładność 1st. C
  121.  
  122.         'zabezpieczenie -30 do +34
  123.          Select Case New_temp
  124.           Case Is < -30 : New_temp = -30
  125.           Case Is > 34 : New_temp = 34
  126.          End Select
  127.  
  128.          #if Cdbg
  129.           Print #1 , "T=" ; New_temp
  130.          #endif
  131.  
  132.           New_temp = New_temp + 30                          'przesuniecie 0 - 63
  133.  
  134.           'tylko jesli temp sie zmieniła
  135.           If Prev_temp <> New_temp Then
  136.            Prev_temp = New_temp
  137.  
  138.             Call Show_bar
  139.  
  140.           End If
  141.  
  142.        End If
  143.  
  144.      End If
  145. End Sub
  146.  
  147. Call Max7219_setup
  148.  Call Start_conversion
  149.   Call Test_bar
  150.  
  151.  
  152. Do
  153.  Wait 1
  154.  
  155.   Call Read_temp
  156.    Call Start_conversion
  157. Loop
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
ODPOWIEDZ