Termometr z dodatkowymi funkcjami do samohodu

Prezentacje projektów
ODPOWIEDZ
Awatar użytkownika
Michał6201
Posty: 165
Rejestracja: 03 paź 2015, 20:07

Termometr z dodatkowymi funkcjami do samohodu

Post autor: Michał6201 » 30 lis 2025, 22:17

Cześć
Ukończyłem właśnie termometr z dodatkowymi funkcjami do samochodu mojego taty - Corolla e12 z 2004r.
Z założenia miał to być tylko termometr, bo po zmianie z oryginalnego radia (które wyświetlało temp. zewnętrzną) na chińską stację multimedialną, nie było możliwości odczytania temp, a właścicielowi na tej funkcji zależało.
Jako że sam termometr to mało i prosto, to postanowiłem do układu dołożyć kilka funkcji:
- Zegarek wraz z datą
- sterowanie załączaniem świateł dziennych - Fabrycznie świateł dziennych ten samochód nie posiadał. Kupiliśmy na portalu a...o światła dzienne led. Każde uruchomienie silnika powodowało miganie i rozbłyski tych ledów, co szybko by ich zabiło. Teraz mój układ włącza światła dzienne z opóźnieniem 3 sekundy po uruchomieniu silnika.
- wykrywanie natężenia światła dziennego (pomiar przez ADC spadku napięcia na dzielniku fotorezystor i rezystor - wyświetlacz w ciągu dnia świeci pełną jasnością, natomiast po zmroku przyciemnia się, aby nie rozpraszać kierowcy. Sterowanie jasnością wyświetlacza zrobiłem programowo. Na wyświetlaczu przy włączonych światłach dziennych pojawia się ikonka DRL.
- Informacja o możliwej gołoledzi przy spadku temp, zewnętrznej poniżej +4stC.
- Informacja o konieczności włączenia świateł mijania o zmroku.
- Automatyczne przełączanie świateł dziennych na mijania o zmroku. (Tej funkcji nie dopisałem w programie z braku czasu i jest już za zimno, aby dobrać się do instalacji w samochodzie. Przełożyliśmy to na wiosnę.

Miejsce na wyświetlacz było mocno ograniczone w środkowej konsoli. Po wyjęciu zaślepki dostaliśmy otwór około 120/30mm. Niewiele, pierwotnie myśleliśmy o jakimś zwykłym alfanumerycznym wyświetlaczu, ale żaden z dostępnych tam się nie mieścił na wysokość. W końcu udało się dopasować wyświetlacz - padło na OLED SSD1322, matryca 256/64 piksele. Dzięki Bartkowi zdobyłem bibliotekę pod Bascom dla tego wyświetlacza.
Wyświetlacz zasilany jest napięciem +3,3V, więc aby nie komplikować układu, postanowiłem wszystko zasilić napięciem +3,3V. Zaprojektowałem płytkę i zamówiłem ją w JLCPCB, polutowałem wszystko i przystąpiłem do załadowania wsadu do mikrokontrolera ATmega32A. Niestety klapa, po kilku próbach zaprogramowania, moja atmega przestała być widoczna dla komputera. Podmieniłem ją, myśląc że kupiłem jakąś uszkodzoną. Druga sztuka podobnie jak poprzednia również szybko straciła życie. Zacząłem analizować mój układ po kolei i szukać gdzie jest problem. Myślałem, że popełniłem błąd w projektowaniu pcb i zrobiłem jakąś pętle masy i stąd te problemy. Postanowiłem zaprojektować drugą płytkę, tym razem chcąc uniknąć problemów z pętlą masy, zaprojektowałem pierwszy raz w życiu płytkę 4 warstwową :D Wiem, że dla tak prostego układu płytka 4 warstwowa, to przerost formy nad treścią, ale to był mój pierwszy raz :D Czegoś nowego się nauczyłem przy okazji :)
I tu się uśmiejecie ze mnie, przyznaję, moje niedopatrzenie i wiara na słowo, że ten mój programator jest dobry, kosztowała mnie kupę straconego czasu i 2 atmegi.
W czasie oczekiwania na paczkę z pcb przyjrzałem się mojemu niebieskiemu programatorowi z Chin za 15zł i znalazłem informację, że te programatory są oszukane i po ustawieniu na programatorze zworki na 3,3V, nadal linie miso, mosi, sck, rst są na poziomie +5V, a ja tym wynalazkiem programowałem mikrokontroler zasilany z +3,3V i dziwiłem się, że nie działa :oops:
Założyłem tu na forum temat z prośba o doradzenie jaki programator kupić i Kolega Press zaproponował mi AVR PROG MK2. Również dziękuję za podpowiedź Koledze :)
Po zlutowaniu nowej płytki, podłączyłem mój wypasiony programator i sukces - wszystko działa :)
Sam zegarek zrobiłem w oparciu o układ scalony DS1307. Czujniki temperatury DS18B20. Sygnały z samochodu postanowiłem odizolować od ATmegi za pomocą optoizolatora TCMT4100. Napięcia zasilania obniżyłem do wymaganych wartości za pomocą stabilizatorów LM1117. Układ po zgaszeniu silnika pobiera z akumulatora około 18mA.
Klawiaturę z 3 przycisków kupioną na ali obkleiłem filcem i obszyłem kawałkiem perforowanej skóry. Klawiatura schowana jest w schowku na środkowej konsoli. Będzie używana góra 2 -3 razy w roku przy zmianie czasu z zimowego na letni, ewentualnie korekta zegarka. Przycisków nie widać, ale są bardzo łatwo wyczuwalne pod palcem.
W załączeniu kilka fotek mojego termometru. Za 2 tygodnie jak będę u rodziców, to zrobię zdjęcie po wyjęciu środkowej konsoli, jak to przymocowałem od środka.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ostatnio zmieniony 30 lis 2025, 22:35 przez Michał6201, łącznie zmieniany 1 raz.
Awatar użytkownika
Michał6201
Posty: 165
Rejestracja: 03 paź 2015, 20:07

Re: Termometr z dodatkowymi funkcjami do samohodu

Post autor: Michał6201 » 30 lis 2025, 22:21

Nie mogłem więcej dodać zdjęć, więc wrzucam w drugiej wiadomości.
Dodatkowo kod źródłowy. Wiem że nie jest on ani optymalny pod względem zajmowanego miejsca, ani jakiś wyszukany, ale jak nie raz już tu wspominałem - ze mnie żaden programista.
Najważniejsze, że działa :D
  1. ' ###################################################
  2. ' ##############  TEMP_TOYOTA_V2  ###################
  3. ' ###### STEROWNIK TEMP/DRL TOYOTA COROLLA E12 ######
  4. ' #################  22.11.2025  ####################
  5. ' ###########  ZGODNY Z PCB M32E12V6  ###############
  6. ' ###################################################
  7.  
  8.  
  9.       $Regfile="m32adef.dat"
  10.       $Crystal= 11059200
  11.       $hwstack=40
  12.       $swstack=16
  13.       $framesize=32
  14.  
  15.    '  * OLED Initial Settings *
  16.    '
  17.    Const Rotate_180 = 1                                     'OLED screen installation direction (180degree rotation).
  18.                                                             ' (Connector: 0 = Right side, 1 = Left side)
  19.    Const Spi_wire_selection = 4                             'Select the number of lines for SPI connection.
  20.                                                             ' (3 = 3-wire: drawing spd low, 4 = 4-wire: drawing spd high)
  21.    '
  22. $lib "glcdSSD1322-SPI.lib"                                  'Embedded SSD1322 3.12inch 256x64 SPI library.
  23.    ' Specifies the connection port for OLED. Cs1 = [/CS] , Rst = [/RES] , A0 = [D/C] , Si = [SDIN] , Sclk = [SCLK]
  24.    Config Graphlcd = Color , Cs1 = Portc.3 , Rst = Portc.4 , A0 = Portc.5 , Si = Portc.6 , Sclk = Portc.7       '[Cs1]&[Rst] optional.
  25.  
  26.    ' Character drawing commands : [Lcdat Y , X , Character , FG , BG]
  27.    '   Y = Y(row) address (0 - 63) , X = X(column) address (0 - 255) , Character = String or variable to display
  28.    '   FG = Foreground Grayscale Value (0 - 15) , BG = Background Grayscale Value (0 - 15) / (0:dark - 15:bright)
  29.    '   Note: Since the SSD1322 writes 4-bit grayscale data in word units, set the X address in 4-dot intervals. (ex. 0,4,8 - 248,252)
  30.  
  31.    ' Command to draw BGC image data in RLE compressed format : [Showpic X , Y , label]
  32.    '   X = X(column) address (0 - 255), Y = Y (row)address (0 - 63), label = label of image data to display.
  33.    '     See the help for SHOWPIC command.
  34.    '   To create RLE compressed BGC image data from BMP images, use the LCD RGB-8 converter [LCDconvert.exe].
  35.    ' Below is a table that maps 8-bit BGC format RGB8 code (RRRG_GGBB) to a 4-bit grayscale brightness value (0 - 15).
  36.    Const _bgc_r2 = &B0000_1000                              'BGC RGB8 code [Red2]
  37.    Const _bgc_r1 = &B0000_0000                              'BGC RGB8 code [Red1]
  38.    Const _bgc_r0 = &B0000_0000                              'BGC RGB8 code [Red0]
  39.    Const _bgc_g2 = &B0000_0100                              'BGC RGB8 code [Green2]
  40.    Const _bgc_g1 = &B0000_0000                              'BGC RGB8 code [Green1]
  41.    Const _bgc_g0 = &B0000_0000                              'BGC RGB8 code [Green0]
  42.    Const _bgc_b1 = &B0000_0010                              'BGC RGB8 code [Blue1]
  43.    Const _bgc_b0 = &B0000_0000                              'BGC RGB8 code [Blue0]
  44.    ' By default, the intermediate luminance value for each of the colors R,G,B is the lower 4bits(0-15) of the grayscale luminance value.
  45.    ' Adjust the grayscale to match the color scheme of the original image.
  46.  
  47.  
  48. ' Konfiguracja I2C
  49. $lib "i2c_twi.lbx"
  50. Config Scl = PortC.0
  51. Config Sda = PortC.1
  52. I2cinit
  53. Config Twi = 100000
  54.  
  55. ' Konfiguracja i zmienne dla RTC DS1307
  56. Const Ds1307w = &HD0    'BIN 11010000 DEC 208 Adres DS 1307 Write
  57. Const Ds1307r = &HD1    'BIN 11010000 DEC 209 Adres DS 1307 Read
  58. Config Submode = New    'nowy tryb deklaracji procedur
  59.  
  60. Config Clock = User
  61. Config Date = Dmy , Separator = Minus
  62. 'Time$ = "23:58:11"
  63. 'Date$ = "13-09-25"
  64.  
  65. Config POrTD.4 = Input : PORTD.4 = 1 : S1 Alias PIND.4 'S1
  66. Config POrTD.5 = Input : PORTD.5 = 1 : S2 Alias PIND.5 'S2
  67. Config POrTD.6 = Input : PORTD.6 = 1 : S3 Alias PIND.6 'S3
  68.  
  69. Config POrTD.2 = Input : PORTD.2 = 1 : ACC Alias PIND.2 ' ACC ON
  70. Config PortB.0 = Input : PortB.0 = 1 : SQW Alias PinB.0 ' PRZERWANIE 1HZ
  71. Config POrTD.3 = Input : PORTD.3 = 1 : PARKING_LIGHTS Alias PIND.3 ' PARKING LIGHT ON/FF
  72. Config POrTB.4 = Input : PORTB.4 = 1 : AUTO_L Alias PINB.4 ' WŁĄCZNIK AUTOMATYCZNYCH ŚWIATEŁ MIJANIA
  73.  
  74. Config PortC.2 = Output : PortC.2 = 0 : buzzer Alias PortC.2 'BUZZER
  75. Config Portb.2 = Output : Portb.2 = 0 : DRL Alias Portb.2 ' DRL ON/OFF
  76. Config Portb.3 = Output : Portb.3 = 0 : RLB Alias Portb.3 ' RELAY LOW BEAM ON/0FF - sterowanie przekaźnikiem włączającym automatycznie światła mijana
  77. Config POrTD.7 = Input : PORTD.7 = 1 : NC Alias PIND.7 ' NO CONNECT
  78.  
  79. Dim Lock As Byte , Licznik As Byte , Jest_X_impulsow As Byte   ' Zmienne do odliczania opóźnienia
  80.  
  81. Dim w1 As Bit ' Zmienna pomocnicza dla WARNING1
  82. w1 = 0
  83. Dim w2 As Bit ' Zmienna pomocnicza dla WARNING2
  84. w2 = 0
  85.  
  86. Dim Pulses As Word  'Zmienna długości dźwięku
  87. Dim Periods As Word 'Zmienna barwy dźwięku
  88.  
  89. Declare Sub Getdatetime
  90. Declare Sub Settime
  91. Declare Sub Setdate
  92.  
  93. Dim Weekday As Byte
  94. Declare Sub Setweekday
  95.  
  96. Dim _sec_str As string * 2
  97. Dim _min_str As string * 2
  98. Dim _hour_str As string * 2
  99. Dim _day_str As string * 2
  100. Dim _month_str As string * 2
  101. Dim _year_str As string * 2
  102.  
  103. Dim Pos2 As Byte
  104. Dim Mig As Bit
  105. Dim Menu as Byte
  106. Dim Refresh as Byte
  107. Refresh = 0
  108. Mig = 0
  109.  
  110. ' 1 Hz SQW Output
  111. I2cstart
  112. I2cwbyte Ds1307w ' Zapis do rejestru DS1307
  113. I2cwbyte &H07   'Adres rejestru do zapisu on/off SQW oraz jaka częstotliwość
  114. I2cwbyte &B10010000 ' Częstotliwość SQW: 1Hz = 10010000, 4,096kHz = 10010001, 8,192kHz = 10010010, 32,768kHz = 10010011
  115. I2cstop
  116.  
  117.  
  118. ' Konfiguracja 1-WIRE i zmienne dla DS18B20
  119.  Config 1wire = PortB.1
  120.  
  121. ' Zmienne temperatury
  122. Dim Ds1(8) As Byte
  123. Dim Ds2(8) As Byte
  124. Dim Temp As Byte
  125. Dim Temp_str As String * 5
  126. Dim T As Integer
  127. Dim T_zew As Integer 'Zmienna dla wyświetlania ikony gołoledź
  128. Dim Wew(9) As Byte
  129. Dim Zew(9) As Byte
  130.  
  131. ' ADRES CZUJNIKA IN (28EEE97B00000031)
  132. Ds1(1) = &H28
  133. Ds1(2) = &HEE
  134. Ds1(3) = &HE9
  135. Ds1(4) = &H7B
  136. Ds1(5) = &H00
  137. Ds1(6) = &H00
  138. Ds1(7) = &H00
  139. Ds1(8) = &H31
  140.  
  141. ' ADRES CZUJNIKA OUT (28B3BD7C00000059)
  142. Ds2(1) = &H28
  143. Ds2(2) = &HB3
  144. Ds2(3) = &HBD
  145. Ds2(4) = &H7C
  146. Ds2(5) = &H00
  147. Ds2(6) = &H00
  148. Ds2(7) = &H00
  149. Ds2(8) = &H59
  150.  
  151.  
  152. ' KONFIGURACJA ADC ORAZ ZMIENNYCH POMIARU NAPIĘCIA Z CZUJNIKA ŚWIATŁA
  153. ' Reference = Avcc ; Internal ; Off
  154. ' Internal = 2,56V [ATmega32]
  155. ' Off - zewnętrzne źródło napięcia odniesienia podłączone do Aref z kondensatorem
  156.  
  157. Config Adc = Single , Prescaler = Auto , Reference = Internal 'KONFIGURACJA WEWNĘTRZNEGO PRZETWORNIKA ADC
  158. Start Adc 'URUCHOMIENIE ADC
  159. Dim wart_adc As Word        ' wartość pobrana z ADC
  160. Dim pom As Single           ' zmienna pomocnicza do obliczenia wartości napięcia
  161. Dim wart_nap As String * 4  ' wartość do wyświetlenia w voltach
  162.  
  163.  
  164.         Glcdcmd &HC1 : Glcddata 10     'Contrast setting. (0-255)
  165.         Glcdcmd &HAF                   'Sleep mode OFF. (Display ON)
  166.       ' Glcdcmd &HAE                   'Sleep mode ON. (Display OFF)
  167.  
  168.  
  169. ' ################################################################################
  170. ' ############################# GŁÓWNA PĘTLA #####################################
  171. ' ################################################################################
  172.    Do
  173.  
  174.    If PARKING_LIGHTS = 0 Then 'Jeżeli światła postojowe włączone to
  175.    DRL = 0 ' wyłącz światła dzienne
  176.    else    ' w innym przypadku
  177.    DRL = 1 ' włącz światła dzienne
  178.    end if
  179.  
  180.    'If AUTO_L = 0 Then (dopisać obsługę automatycznych świateł)
  181.  
  182.                                                If ACC = 1 Then : cls : gosub Sleep_mode_on ' JEŻELI SILNIK ZGASZONY, TO IDŻ DO PROCEDURY UŚPIENIA
  183.                                                end if
  184. ' POMIAR NAPIĘCIA Z CZUJNIKA ŚWIATŁA
  185.  wart_adc = Getadc(4)     ' pobranie wartości z adc
  186.  pom = 0.0025 * wart_adc
  187.  wart_nap = Fusing(pom , "#.&&") 'do wyświetlenia na OLED wpisać "wart_nap"
  188.  
  189.                      If POM > 0.5 Then
  190.                      Glcdcmd &HC1 : Glcddata 200 ' w dzień zwiększ jasność wyświetlacza
  191.                      end if
  192.                        If POM < 0.4 Then
  193.                        Glcdcmd &HC1 : Glcddata 10  ' w nocy zmniejsz jasność wyświetlacza
  194.                        end if
  195.  
  196.         If POM < 0.4 And w2 = 0 And PARKING_LIGHTS = 1 Then gosub Warning2 ' Jeżeli jest ciemno i nie są włączone światła mijania, to wyświetla tylko 1 raz ostrzeżenie Warning2
  197.  
  198.  
  199. Setfont colorFont
  200. Mig = SQW
  201. If Mig = 0 Then Mig = 1 Else Mig = 0
  202.  
  203. Call Getdatetime        ' POBRANIE DANYCH Z RTC
  204. Lcdat 0 , 0 , _day_str ; "-" ; _month_str ; "-" ; "20" ; _year_str , 15 , 0 'WYŚWIETLANIE KALENDARZA
  205. Lcdat 0 , 190 , _hour_str ; ":" ; _min_str ; ":" ; _sec_str , 15 , 0  ' WYŚWIETLENIE ZEGARKA
  206.  
  207.  
  208.  
  209. ' OBSŁUGA MENU DLA ZEGARKA I KALENDARZA
  210. Debounce S1 , 0 , Menu_sub , Sub  ' Przycisk MENU
  211. Debounce S2 , 0 , s2_sub , Sub    ' Przycisk zwiekszania wybranej wartości
  212. 'Debounce S3 , 0 , s3_sub , sub    ' Przycisk zmniejszania wybranej wartości
  213.  
  214.  If Refresh = 1 Then
  215.  Refresh = 0
  216.    Setfont Color8x8
  217.     Select Case Menu
  218.           Case 1
  219.           Lcdat 0 , 110 , "SET TIME"
  220.           Case 2
  221.           Lcdat 0 , 110 , "SET TIME"
  222.  
  223.           Case 3
  224.           Lcdat 0 , 110 , "SET DATA"
  225.           Case 4
  226.           Lcdat 0 , 110 , "SET DATA"
  227.           Case 5
  228.           Lcdat 0 , 110 , "SET DATA"
  229.    End select
  230.  
  231. End If
  232.  
  233. ' Procedura szukania czujników 2 X DS18B20
  234. ' oraz odczytu temperatury z czujników in/out
  235. 1wreset
  236. 1wwrite &HCC
  237. 1wwrite &H44
  238.  
  239. 1wreset
  240. 1wwrite &H55
  241. 1wwrite Ds1(1) , 8
  242. 1wwrite &HBE
  243. Wew(1) = 1wread(9)
  244. 1wreset
  245. 1wwrite &H55
  246. 1wwrite Ds2(1) , 8
  247. 1wwrite &HBE
  248. Zew(1) = 1wread(9)
  249.  
  250.  
  251. ' ----- CZUJNIK OUT -----
  252. T = Makeint(zew(1) , Zew(2))
  253. T = T * 10
  254. T = T / 16
  255. T_zew = T / 10    'obliczenie wartości temp out dla ikony gołoledzi
  256. Temp_str = Str(t)
  257. Temp_str = Format(temp_str , "0.0")
  258.  
  259. Setfont Color16x16
  260. 'Setfont colorFont
  261. Lcdat 20 , 0 , Chr(125) , 15 , 0 ' IKONA TERMOMETRU OUT
  262. If Err = 0 Then
  263. Lcdat 20 , 30 , Temp_str ; Chr(127) ; "C "
  264. else
  265. Lcdat 20 , 30 , "Error   " , 15 , 0
  266.    end if
  267.  
  268.  
  269. ' ----- CZUJNIK IN -----
  270. T = Makeint(wew(1) , Wew(2))
  271. T = T * 10
  272. T = T / 16
  273. Temp_str = Str(t)
  274. Temp_str = Format(temp_str , "0.0")
  275.  
  276. Setfont Color16x16
  277. 'Setfont colorFont
  278. Lcdat 45 , 0 , Chr(124) , 15 , 0 ' IKONA TERMOMETRU IN
  279. If Err = 0 Then
  280. Lcdat 45 , 30 , Temp_str ; Chr(127) ; "C " , 15 , 0
  281. else
  282. Lcdat 45 , 30 , "Error   " , 15 , 0
  283.    end if
  284.  
  285. ' ################## OBSŁUGA IKON #############################
  286.    Setfont colorfonticon
  287.    If DRL = 1 Then  ' Jeśli światła DRL włączone
  288.    Lcdat 28 , 230 , Chr(61) , 15 , 0 ' IKONA ŚWIATŁA DZIENNE [DRL]
  289.    Else
  290.    Lcdat 28 , 230 , " " , 15 , 0
  291.    end if
  292.  
  293.  
  294. If T_zew < 4 Then  ' Jeśli temp out spadnie poniżej 4stC
  295. Lcdat 28 , 160 , Chr(62) , 15 , 0 ' IKONA GOŁOLEDŹ
  296. Else
  297. Lcdat 28 , 160 , " " , 15 , 0
  298. end if
  299. If T_zew < 4 And w1 = 0 Then gosub Warning1 ' Jeśli temp out spadnie poniżej 4st, wyświetl tylko 1 raz ostrzeżenie o gołoledzi Warning1
  300.  
  301.  
  302.    If AUTO_L = 0 Then ' Jeśli włącznik automatycznych świateł mijania włączony
  303.    Lcdat 28 , 195 , Chr(60) , 15 , 0 ' IKONA ŚWIATŁA MIJANIA [AUTO]
  304.    Else
  305.    Lcdat 28 , 195 , " " , 15 , 0
  306.    end if
  307.  
  308. Loop
  309. End
  310.  
  311. ' ############################### KONIEC GŁÓWNEJ PĘTLI ###########################
  312.  
  313.  Getdatetime:
  314.   I2cstart
  315.   I2cwbyte Ds1307w
  316.   I2cwbyte 0
  317.   I2cstart
  318.   I2cwbyte Ds1307r
  319.   I2crbyte _sec , Ack
  320.   I2crbyte _min , Ack
  321.   I2crbyte _hour , Ack
  322.   I2crbyte Weekday , Ack
  323.   I2crbyte _day , Ack
  324.   I2crbyte _month , Ack
  325.   I2crbyte _year , Nack
  326.   I2cstop
  327.  
  328.   _sec = Makedec(_sec)
  329.   _min = Makedec(_min)
  330.   _hour = Makedec(_hour)
  331.   _day = Makedec(_day)
  332.   _month = Makedec(_month)
  333.   _year = Makedec(_year)
  334.  
  335.  _sec_str = str(_sec) : _sec_str = Format(_sec_str , "00")
  336.  _min_str = str(_min) : _min_str = Format(_min_str , "00")
  337.  _hour_str = str(_hour) : _hour_str = Format(_hour_str , "00")
  338.  _day_str = str(_day) : _day_str = Format(_day_str , "00")
  339.  _month_str = str(_month) : _month_str = Format(_month_str , "00")
  340.  _year_str = str(_year) : _year_str = Format(_year_str , "00") ' dopisałem
  341.  
  342. If Mig = 0 Then
  343. Select Case Menu
  344. Case 1
  345. Mid(_hour_str , 1) = "  " 'wstaw spację w miejscu Menu (migaj)
  346. Case 2
  347. Mid(_min_str , 1) = "  " 'wstaw spację w miejscu Menu (migaj)
  348.  
  349. Case 3
  350. Mid(_day_str , 1) = "  "
  351. Case 4
  352. Mid(_month_str , 1) = "  "
  353.    Case 5
  354. Mid(_year_str , 1) = "  "
  355.  
  356. End Select
  357. End If
  358.  
  359. Return
  360.  
  361. Setdate:
  362.   _day = Makebcd(_day)
  363.   _month = Makebcd(_month)
  364.   _year = Makebcd(_year)
  365.   I2cstart
  366.   I2cwbyte Ds1307w
  367.   I2cwbyte 4
  368.   I2cwbyte _day
  369.   I2cwbyte _month
  370.   I2cwbyte _year
  371.   I2cstop
  372.   Waitms 10
  373. Return
  374.  
  375. Setweekday:
  376.   I2cstart
  377.   I2cwbyte Ds1307w
  378.   I2cwbyte 3
  379.   I2cwbyte Weekday
  380.   I2cstop
  381.   Waitms 10
  382. Return
  383.  
  384. Settime:
  385.   _sec = Makebcd(_sec)
  386.   _min = Makebcd(_min)
  387.   _hour = Makebcd(_hour)
  388.   I2cstart
  389.   I2cwbyte Ds1307w
  390.   I2cwbyte 0
  391.   I2cwbyte _sec
  392.   I2cwbyte _min
  393.   I2cwbyte _hour
  394.   I2cstop
  395.   Waitms 10
  396. Return
  397.  
  398.  
  399.  Menu_sub:
  400.   Setfont Color8x8
  401.      Incr Menu : If Menu > 5 Then Menu = 0
  402.      Lcdat 0 , 110 , "        " , 15 , 0
  403.      Refresh = 1
  404.  Return
  405.  
  406.  S2_sub:
  407.    Select Case Menu
  408.  
  409.         Case 1
  410.         Incr _hour  :  If _hour > 59 Then _hour = 0
  411.         _sec = 0  :   Call Settime
  412.  
  413.         Case 2
  414.         Incr _min  :    If _min > 59 Then _min = 0
  415.         _sec = 0  :   Call Settime
  416.  
  417.                 Case 3
  418.                 Incr _day  :  If _day > 31 Then _day = 1
  419.                 Call Setdate
  420.  
  421.                 Case 4
  422.                 Incr _month  :  If _month > 12 Then _month = 1
  423.                 Call Setdate
  424.  
  425.                 Case 5
  426.                 Incr _year  :  If _year > 35 Then _year = 1
  427.                 Call Setdate
  428.  
  429.    End Select
  430.    Refresh = 1
  431.    Return
  432.  
  433.  
  434. ' ################ PROCEDURA UŚPIENIA #######################
  435. Sleep_mode_on:
  436. Do
  437. w1 = 0
  438. W2 = 0
  439. Mig = SQW
  440. DRL = 0 'ŚWIATŁA DZIENNE WYŁĄCZONE
  441. RLB = 0 ' PRZEKAŹNIK AUTOMATYCZNYCH ŚWIATEŁ MIJANIA WYŁĄCZONY
  442. Glcdcmd &HAE 'Sleep mode ON. (Display OFF)
  443.  
  444.       '===== ODLICZENIE CZASU DO WŁĄCZENIA WYŚWIETLACZA ORAZ ŚWIATEŁ DZIENNYCH ======
  445.       If ACC = 0 Then      'Jeśli zapłon włączony, to:
  446.       If Mig = 0 Then      'jeśli RTC ustalił stan niski
  447.       Lock = 1             'to zapamietaj, ustaw flage
  448.          Else                  'jesli RTC ustawil już stan wysoki
  449.          If Lock = 1 Then      'a byl wczesniej stan niski (flaga)
  450.          Lock = 0              'skasuj flage do czasu kolejnego niskiego stanu
  451.          Incr Licznik          'tylko raz na zmiane stanu zwiekszamy licznik
  452.               If Licznik = 8 Then  ' jeśli licznik osiągnął wartość 8 (8sekund), to
  453.               Licznik = 0          ' zeruj licznik
  454.               Jest_X_impulsow = 1  ' zakończenie odliczania
  455.          End If
  456.          End If
  457.          End If
  458.              If Jest_X_impulsow = 1 Then
  459.                 Jest_X_impulsow = 0
  460.  
  461.       Glcdcmd &HAF 'Sleep mode OFF. (Display ON) - WŁĄCZENIE WYŚWIETLACZA
  462.       CLS
  463.  
  464.    '  DRL = 1 'ŚWIATŁA DZIENNE WŁĄCZONE (DO SPRAWDZENIA!!!)
  465.       Showpic 79 , 0 , Plaatje   ' WYŚWIETLENIE LOGO TOYOTA  [x-szerokość , y-wysokość]
  466.       waitms 2500 ' ODCZEKAJ OKOŁO 2,5s
  467.       cls ' CZYSZCZENIE EKRANU
  468.  
  469.       DRL = 1 'ŚWIATŁA DZIENNE WŁĄCZONE (DO SPRAWDZENIA!!!)
  470.  
  471.    return ' POWRÓT DO GŁÓWNEJ PĘTLI
  472.    end if
  473.    end if
  474. Loop
  475.  
  476.  
  477. ' ################## OSTRZEŻENIE O GOŁOLEDZI #################
  478. Warning1:
  479.  
  480. cls  ' czyszczenie wyświetlacza
  481.      Pulses = 1100 ' ustalenie długości tonu dźwiękowego
  482.      Periods = 320 ' ustawienie barwy tonu
  483.      Sound buzzer , Pulses , Periods ' dźwięk ostrzegawczy
  484.     waitms 200
  485.      Pulses = 1100 ' ustalenie długości tonu dźwiękowego
  486.      Periods = 320 ' ustawienie barwy tonu
  487.      Sound buzzer , Pulses , Periods ' dźwięk ostrzegawczy
  488. Do
  489. Mig = SQW
  490.  
  491. Setfont colorfonticon
  492. Lcdat 20 , 20 , Chr(62) , 15 , 0 ' ikona gołoledź
  493.  
  494. Setfont Color16x16
  495. Lcdat 15 , 90 , "UWAGA!" , 15 , 0
  496.  
  497. Setfont Color8x8
  498. Lcdat 35 , 90 , "MOZLIWOSC OBLODZENIA" , 15 , 0
  499. Lcdat 46 , 90 , "JEDZ OSTROZNIE!" , 15 , 0
  500.  
  501.          ' ===== ODLICZANIE CZASU WYŚWIETLANIA OSTRZEŻENIA =====
  502.            If Mig = 0 Then      'jeśli RTC ustalił stan niski
  503.            Lock = 1             'to zapamietaj, ustaw flage
  504.            Else                 'jesli RTC ustawil już stan wysoki
  505.               If Lock = 1 Then     'a byl wczesniej stan niski (flaga)
  506.               Lock = 0             'skasuj flage do czasu kolejnego niskiego stanu
  507.               Incr Licznik         'tylko raz na zmiane stanu zwiekszamy licznik
  508.               If Licznik = 12 Then ' jeśli licznik osiągnął wartość 12 (12 sekund), to
  509.               Licznik = 0          ' zeruj licznik
  510.               Jest_X_impulsow = 1  ' zakończenie odliczania
  511.                    End If
  512.                    End If
  513.                    End If
  514.              If Jest_X_impulsow = 1 Then
  515.                 Jest_X_impulsow = 0
  516.                 W1 = 1
  517.                    end if
  518.  
  519. If w1 = 1 Then ' zmiana zmiennej pomocniczej
  520. cls
  521. w1 = 1
  522. return 'powrót do pędli głównej
  523. end if
  524. Loop
  525.  
  526.  
  527. ' ################## OSTRZEŻENIE O WYŁĄCZONYCH ŚWIATŁACH MIJANIA #################
  528. Warning2:
  529. w2 = 1
  530. cls
  531.      Pulses = 1100 ' ustalenie długości tonu dźwiękowego
  532.      Periods = 320 ' ustawienie barwy tonu
  533.      Sound buzzer , Pulses , Periods ' dźwięk ostrzegawczy
  534.     waitms 200
  535.      Pulses = 1100 ' ustalenie długości tonu dźwiękowego
  536.      Periods = 320 ' ustawienie barwy tonu
  537.      Sound buzzer , Pulses , Periods ' dźwięk ostrzegawczy
  538. Do
  539. w2 = 1
  540. DRL = 1 ' ŚWIATŁA DZIENNE NADAL WŁĄCZONE
  541.  
  542.        ' POMIAR NAPIĘCIA Z CZUJNIKA ŚWIATŁA
  543.          wart_adc = Getadc(0)     ' pobranie wartości z adc
  544.          pom = 0.0025 * wart_adc
  545.          wart_nap = Fusing(pom , "#.&&") 'do wyświetlenia na OLED wpisać "wart_nap"
  546.          If w2 = 1 And POM > 0.5 Then
  547.          cls
  548.          w2 = 1
  549.          return 'powrót do pędli głównej
  550.          end if
  551.  
  552. Setfont colorfonticon
  553. Lcdat 20 , 20 , Chr(36) , 15 , 0 ' ikona gołoledź
  554.  
  555. Setfont Color16x16
  556. Lcdat 15 , 80 , "UWAGA!" , 15 , 0
  557.  
  558. Setfont Color8x8
  559. Lcdat 35 , 80 , "WLACZ SWIATLA MIJANIA!" , 15 , 0
  560.  
  561. If w2 = 1 And PARKING_LIGHTS = 0 Then 'Jeżeli włączysz światła mijania, to idź do głównej pętli
  562. cls
  563. w2 = 1
  564. return 'powrót do pędli głównej
  565. end if
  566. Loop
  567.  
  568.  
  569. Beep:
  570. buzzer = 1
  571. waitms 50
  572. buzzer = 0
  573. Return
  574.  
  575.  
  576. ' ================== Fonts ===================
  577.  $INCLUDE "color8x8.font"
  578.  $INCLUDE "color16x16.font"
  579.  $INCLUDE "My_font.font"
  580.  $INCLUDE "Icon.font"
  581.  
  582.  
  583. ' ================== Picture =================
  584.    Plaatje:
  585. $bgf "pp.BGC"
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Termometr z dodatkowymi funkcjami do samohodu

Post autor: niveasoft » 01 gru 2025, 13:47

No i gitara. Ładnie wygląda.
Nawet jakby VFD i był oryginalny :lol:
Press
Posty: 79
Rejestracja: 21 sty 2018, 23:08

Re: Termometr z dodatkowymi funkcjami do samohodu

Post autor: Press » 05 gru 2025, 0:06

Bardzo ładny projekt. Gratulacje :)
ODPOWIEDZ