' ###################################################
' ############## TEMP_TOYOTA_V2 ###################
' ###### STEROWNIK TEMP/DRL TOYOTA COROLLA E12 ######
' ################# 22.11.2025 ####################
' ########### ZGODNY Z PCB M32E12V6 ###############
' ###################################################
$Regfile="m32adef.dat"
$Crystal= 11059200
$hwstack=40
$swstack=16
$framesize=32
' * OLED Initial Settings *
'
Const Rotate_180 = 1 'OLED screen installation direction (180degree rotation).
' (Connector: 0 = Right side, 1 = Left side)
Const Spi_wire_selection = 4 'Select the number of lines for SPI connection.
' (3 = 3-wire: drawing spd low, 4 = 4-wire: drawing spd high)
'
$lib "glcdSSD1322-SPI.lib" 'Embedded SSD1322 3.12inch 256x64 SPI library.
' Specifies the connection port for OLED. Cs1 = [/CS] , Rst = [/RES] , A0 = [D/C] , Si = [SDIN] , Sclk = [SCLK]
Config Graphlcd = Color , Cs1 = Portc.3 , Rst = Portc.4 , A0 = Portc.5 , Si = Portc.6 , Sclk = Portc.7 '[Cs1]&[Rst] optional.
' Character drawing commands : [Lcdat Y , X , Character , FG , BG]
' Y = Y(row) address (0 - 63) , X = X(column) address (0 - 255) , Character = String or variable to display
' FG = Foreground Grayscale Value (0 - 15) , BG = Background Grayscale Value (0 - 15) / (0:dark - 15:bright)
' 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)
' Command to draw BGC image data in RLE compressed format : [Showpic X , Y , label]
' X = X(column) address (0 - 255), Y = Y (row)address (0 - 63), label = label of image data to display.
' See the help for SHOWPIC command.
' To create RLE compressed BGC image data from BMP images, use the LCD RGB-8 converter [LCDconvert.exe].
' Below is a table that maps 8-bit BGC format RGB8 code (RRRG_GGBB) to a 4-bit grayscale brightness value (0 - 15).
Const _bgc_r2 = &B0000_1000 'BGC RGB8 code [Red2]
Const _bgc_r1 = &B0000_0000 'BGC RGB8 code [Red1]
Const _bgc_r0 = &B0000_0000 'BGC RGB8 code [Red0]
Const _bgc_g2 = &B0000_0100 'BGC RGB8 code [Green2]
Const _bgc_g1 = &B0000_0000 'BGC RGB8 code [Green1]
Const _bgc_g0 = &B0000_0000 'BGC RGB8 code [Green0]
Const _bgc_b1 = &B0000_0010 'BGC RGB8 code [Blue1]
Const _bgc_b0 = &B0000_0000 'BGC RGB8 code [Blue0]
' 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.
' Adjust the grayscale to match the color scheme of the original image.
' Konfiguracja I2C
$lib "i2c_twi.lbx"
Config Scl = PortC.0
Config Sda = PortC.1
I2cinit
Config Twi = 100000
' Konfiguracja i zmienne dla RTC DS1307
Const Ds1307w = &HD0 'BIN 11010000 DEC 208 Adres DS 1307 Write
Const Ds1307r = &HD1 'BIN 11010000 DEC 209 Adres DS 1307 Read
Config Submode = New 'nowy tryb deklaracji procedur
Config Clock = User
Config Date = Dmy , Separator = Minus
'Time$ = "23:58:11"
'Date$ = "13-09-25"
Config POrTD.4 = Input : PORTD.4 = 1 : S1 Alias PIND.4 'S1
Config POrTD.5 = Input : PORTD.5 = 1 : S2 Alias PIND.5 'S2
Config POrTD.6 = Input : PORTD.6 = 1 : S3 Alias PIND.6 'S3
Config POrTD.2 = Input : PORTD.2 = 1 : ACC Alias PIND.2 ' ACC ON
Config PortB.0 = Input : PortB.0 = 1 : SQW Alias PinB.0 ' PRZERWANIE 1HZ
Config POrTD.3 = Input : PORTD.3 = 1 : PARKING_LIGHTS Alias PIND.3 ' PARKING LIGHT ON/FF
Config POrTB.4 = Input : PORTB.4 = 1 : AUTO_L Alias PINB.4 ' WŁĄCZNIK AUTOMATYCZNYCH ŚWIATEŁ MIJANIA
Config PortC.2 = Output : PortC.2 = 0 : buzzer Alias PortC.2 'BUZZER
Config Portb.2 = Output : Portb.2 = 0 : DRL Alias Portb.2 ' DRL ON/OFF
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
Config POrTD.7 = Input : PORTD.7 = 1 : NC Alias PIND.7 ' NO CONNECT
Dim Lock As Byte , Licznik As Byte , Jest_X_impulsow As Byte ' Zmienne do odliczania opóźnienia
Dim w1 As Bit ' Zmienna pomocnicza dla WARNING1
w1 = 0
Dim w2 As Bit ' Zmienna pomocnicza dla WARNING2
w2 = 0
Dim Pulses As Word 'Zmienna długości dźwięku
Dim Periods As Word 'Zmienna barwy dźwięku
Declare Sub Getdatetime
Declare Sub Settime
Declare Sub Setdate
Dim Weekday As Byte
Declare Sub Setweekday
Dim _sec_str As string * 2
Dim _min_str As string * 2
Dim _hour_str As string * 2
Dim _day_str As string * 2
Dim _month_str As string * 2
Dim _year_str As string * 2
Dim Pos2 As Byte
Dim Mig As Bit
Dim Menu as Byte
Dim Refresh as Byte
Refresh = 0
Mig = 0
' 1 Hz SQW Output
I2cstart
I2cwbyte Ds1307w ' Zapis do rejestru DS1307
I2cwbyte &H07 'Adres rejestru do zapisu on/off SQW oraz jaka częstotliwość
I2cwbyte &B10010000 ' Częstotliwość SQW: 1Hz = 10010000, 4,096kHz = 10010001, 8,192kHz = 10010010, 32,768kHz = 10010011
I2cstop
' Konfiguracja 1-WIRE i zmienne dla DS18B20
Config 1wire = PortB.1
' Zmienne temperatury
Dim Ds1(8) As Byte
Dim Ds2(8) As Byte
Dim Temp As Byte
Dim Temp_str As String * 5
Dim T As Integer
Dim T_zew As Integer 'Zmienna dla wyświetlania ikony gołoledź
Dim Wew(9) As Byte
Dim Zew(9) As Byte
' ADRES CZUJNIKA IN (28EEE97B00000031)
Ds1(1) = &H28
Ds1(2) = &HEE
Ds1(3) = &HE9
Ds1(4) = &H7B
Ds1(5) = &H00
Ds1(6) = &H00
Ds1(7) = &H00
Ds1(8) = &H31
' ADRES CZUJNIKA OUT (28B3BD7C00000059)
Ds2(1) = &H28
Ds2(2) = &HB3
Ds2(3) = &HBD
Ds2(4) = &H7C
Ds2(5) = &H00
Ds2(6) = &H00
Ds2(7) = &H00
Ds2(8) = &H59
' KONFIGURACJA ADC ORAZ ZMIENNYCH POMIARU NAPIĘCIA Z CZUJNIKA ŚWIATŁA
' Reference = Avcc ; Internal ; Off
' Internal = 2,56V [ATmega32]
' Off - zewnętrzne źródło napięcia odniesienia podłączone do Aref z kondensatorem
Config Adc = Single , Prescaler = Auto , Reference = Internal 'KONFIGURACJA WEWNĘTRZNEGO PRZETWORNIKA ADC
Start Adc 'URUCHOMIENIE ADC
Dim wart_adc As Word ' wartość pobrana z ADC
Dim pom As Single ' zmienna pomocnicza do obliczenia wartości napięcia
Dim wart_nap As String * 4 ' wartość do wyświetlenia w voltach
Glcdcmd &HC1 : Glcddata 10 'Contrast setting. (0-255)
Glcdcmd &HAF 'Sleep mode OFF. (Display ON)
' Glcdcmd &HAE 'Sleep mode ON. (Display OFF)
' ################################################################################
' ############################# GŁÓWNA PĘTLA #####################################
' ################################################################################
Do
If PARKING_LIGHTS = 0 Then 'Jeżeli światła postojowe włączone to
DRL = 0 ' wyłącz światła dzienne
else ' w innym przypadku
DRL = 1 ' włącz światła dzienne
end if
'If AUTO_L = 0 Then (dopisać obsługę automatycznych świateł)
If ACC = 1 Then : cls : gosub Sleep_mode_on ' JEŻELI SILNIK ZGASZONY, TO IDŻ DO PROCEDURY UŚPIENIA
end if
' POMIAR NAPIĘCIA Z CZUJNIKA ŚWIATŁA
wart_adc = Getadc(4) ' pobranie wartości z adc
pom = 0.0025 * wart_adc
wart_nap = Fusing(pom , "#.&&") 'do wyświetlenia na OLED wpisać "wart_nap"
If POM > 0.5 Then
Glcdcmd &HC1 : Glcddata 200 ' w dzień zwiększ jasność wyświetlacza
end if
If POM < 0.4 Then
Glcdcmd &HC1 : Glcddata 10 ' w nocy zmniejsz jasność wyświetlacza
end if
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
Setfont colorFont
Mig = SQW
If Mig = 0 Then Mig = 1 Else Mig = 0
Call Getdatetime ' POBRANIE DANYCH Z RTC
Lcdat 0 , 0 , _day_str ; "-" ; _month_str ; "-" ; "20" ; _year_str , 15 , 0 'WYŚWIETLANIE KALENDARZA
Lcdat 0 , 190 , _hour_str ; ":" ; _min_str ; ":" ; _sec_str , 15 , 0 ' WYŚWIETLENIE ZEGARKA
' OBSŁUGA MENU DLA ZEGARKA I KALENDARZA
Debounce S1 , 0 , Menu_sub , Sub ' Przycisk MENU
Debounce S2 , 0 , s2_sub , Sub ' Przycisk zwiekszania wybranej wartości
'Debounce S3 , 0 , s3_sub , sub ' Przycisk zmniejszania wybranej wartości
If Refresh = 1 Then
Refresh = 0
Setfont Color8x8
Select Case Menu
Case 1
Lcdat 0 , 110 , "SET TIME"
Case 2
Lcdat 0 , 110 , "SET TIME"
Case 3
Lcdat 0 , 110 , "SET DATA"
Case 4
Lcdat 0 , 110 , "SET DATA"
Case 5
Lcdat 0 , 110 , "SET DATA"
End select
End If
' Procedura szukania czujników 2 X DS18B20
' oraz odczytu temperatury z czujników in/out
1wreset
1wwrite &HCC
1wwrite &H44
1wreset
1wwrite &H55
1wwrite Ds1(1) , 8
1wwrite &HBE
Wew(1) = 1wread(9)
1wreset
1wwrite &H55
1wwrite Ds2(1) , 8
1wwrite &HBE
Zew(1) = 1wread(9)
' ----- CZUJNIK OUT -----
T = Makeint(zew(1) , Zew(2))
T = T * 10
T = T / 16
T_zew = T / 10 'obliczenie wartości temp out dla ikony gołoledzi
Temp_str = Str(t)
Temp_str = Format(temp_str , "0.0")
Setfont Color16x16
'Setfont colorFont
Lcdat 20 , 0 , Chr(125) , 15 , 0 ' IKONA TERMOMETRU OUT
If Err = 0 Then
Lcdat 20 , 30 , Temp_str ; Chr(127) ; "C "
else
Lcdat 20 , 30 , "Error " , 15 , 0
end if
' ----- CZUJNIK IN -----
T = Makeint(wew(1) , Wew(2))
T = T * 10
T = T / 16
Temp_str = Str(t)
Temp_str = Format(temp_str , "0.0")
Setfont Color16x16
'Setfont colorFont
Lcdat 45 , 0 , Chr(124) , 15 , 0 ' IKONA TERMOMETRU IN
If Err = 0 Then
Lcdat 45 , 30 , Temp_str ; Chr(127) ; "C " , 15 , 0
else
Lcdat 45 , 30 , "Error " , 15 , 0
end if
' ################## OBSŁUGA IKON #############################
Setfont colorfonticon
If DRL = 1 Then ' Jeśli światła DRL włączone
Lcdat 28 , 230 , Chr(61) , 15 , 0 ' IKONA ŚWIATŁA DZIENNE [DRL]
Else
Lcdat 28 , 230 , " " , 15 , 0
end if
If T_zew < 4 Then ' Jeśli temp out spadnie poniżej 4stC
Lcdat 28 , 160 , Chr(62) , 15 , 0 ' IKONA GOŁOLEDŹ
Else
Lcdat 28 , 160 , " " , 15 , 0
end if
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
If AUTO_L = 0 Then ' Jeśli włącznik automatycznych świateł mijania włączony
Lcdat 28 , 195 , Chr(60) , 15 , 0 ' IKONA ŚWIATŁA MIJANIA [AUTO]
Else
Lcdat 28 , 195 , " " , 15 , 0
end if
Loop
End
' ############################### KONIEC GŁÓWNEJ PĘTLI ###########################
Getdatetime:
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cstart
I2cwbyte Ds1307r
I2crbyte _sec , Ack
I2crbyte _min , Ack
I2crbyte _hour , Ack
I2crbyte Weekday , Ack
I2crbyte _day , Ack
I2crbyte _month , Ack
I2crbyte _year , Nack
I2cstop
_sec = Makedec(_sec)
_min = Makedec(_min)
_hour = Makedec(_hour)
_day = Makedec(_day)
_month = Makedec(_month)
_year = Makedec(_year)
_sec_str = str(_sec) : _sec_str = Format(_sec_str , "00")
_min_str = str(_min) : _min_str = Format(_min_str , "00")
_hour_str = str(_hour) : _hour_str = Format(_hour_str , "00")
_day_str = str(_day) : _day_str = Format(_day_str , "00")
_month_str = str(_month) : _month_str = Format(_month_str , "00")
_year_str = str(_year) : _year_str = Format(_year_str , "00") ' dopisałem
If Mig = 0 Then
Select Case Menu
Case 1
Mid(_hour_str , 1) = " " 'wstaw spację w miejscu Menu (migaj)
Case 2
Mid(_min_str , 1) = " " 'wstaw spację w miejscu Menu (migaj)
Case 3
Mid(_day_str , 1) = " "
Case 4
Mid(_month_str , 1) = " "
Case 5
Mid(_year_str , 1) = " "
End Select
End If
Return
Setdate:
_day = Makebcd(_day)
_month = Makebcd(_month)
_year = Makebcd(_year)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 4
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop
Waitms 10
Return
Setweekday:
I2cstart
I2cwbyte Ds1307w
I2cwbyte 3
I2cwbyte Weekday
I2cstop
Waitms 10
Return
Settime:
_sec = Makebcd(_sec)
_min = Makebcd(_min)
_hour = Makebcd(_hour)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cwbyte _sec
I2cwbyte _min
I2cwbyte _hour
I2cstop
Waitms 10
Return
Menu_sub:
Setfont Color8x8
Incr Menu : If Menu > 5 Then Menu = 0
Lcdat 0 , 110 , " " , 15 , 0
Refresh = 1
Return
S2_sub:
Select Case Menu
Case 1
Incr _hour : If _hour > 59 Then _hour = 0
_sec = 0 : Call Settime
Case 2
Incr _min : If _min > 59 Then _min = 0
_sec = 0 : Call Settime
Case 3
Incr _day : If _day > 31 Then _day = 1
Call Setdate
Case 4
Incr _month : If _month > 12 Then _month = 1
Call Setdate
Case 5
Incr _year : If _year > 35 Then _year = 1
Call Setdate
End Select
Refresh = 1
Return
' ################ PROCEDURA UŚPIENIA #######################
Sleep_mode_on:
Do
w1 = 0
W2 = 0
Mig = SQW
DRL = 0 'ŚWIATŁA DZIENNE WYŁĄCZONE
RLB = 0 ' PRZEKAŹNIK AUTOMATYCZNYCH ŚWIATEŁ MIJANIA WYŁĄCZONY
Glcdcmd &HAE 'Sleep mode ON. (Display OFF)
'===== ODLICZENIE CZASU DO WŁĄCZENIA WYŚWIETLACZA ORAZ ŚWIATEŁ DZIENNYCH ======
If ACC = 0 Then 'Jeśli zapłon włączony, to:
If Mig = 0 Then 'jeśli RTC ustalił stan niski
Lock = 1 'to zapamietaj, ustaw flage
Else 'jesli RTC ustawil już stan wysoki
If Lock = 1 Then 'a byl wczesniej stan niski (flaga)
Lock = 0 'skasuj flage do czasu kolejnego niskiego stanu
Incr Licznik 'tylko raz na zmiane stanu zwiekszamy licznik
If Licznik = 8 Then ' jeśli licznik osiągnął wartość 8 (8sekund), to
Licznik = 0 ' zeruj licznik
Jest_X_impulsow = 1 ' zakończenie odliczania
End If
End If
End If
If Jest_X_impulsow = 1 Then
Jest_X_impulsow = 0
Glcdcmd &HAF 'Sleep mode OFF. (Display ON) - WŁĄCZENIE WYŚWIETLACZA
CLS
' DRL = 1 'ŚWIATŁA DZIENNE WŁĄCZONE (DO SPRAWDZENIA!!!)
Showpic 79 , 0 , Plaatje ' WYŚWIETLENIE LOGO TOYOTA [x-szerokość , y-wysokość]
waitms 2500 ' ODCZEKAJ OKOŁO 2,5s
cls ' CZYSZCZENIE EKRANU
DRL = 1 'ŚWIATŁA DZIENNE WŁĄCZONE (DO SPRAWDZENIA!!!)
return ' POWRÓT DO GŁÓWNEJ PĘTLI
end if
end if
Loop
' ################## OSTRZEŻENIE O GOŁOLEDZI #################
Warning1:
cls ' czyszczenie wyświetlacza
Pulses = 1100 ' ustalenie długości tonu dźwiękowego
Periods = 320 ' ustawienie barwy tonu
Sound buzzer , Pulses , Periods ' dźwięk ostrzegawczy
waitms 200
Pulses = 1100 ' ustalenie długości tonu dźwiękowego
Periods = 320 ' ustawienie barwy tonu
Sound buzzer , Pulses , Periods ' dźwięk ostrzegawczy
Do
Mig = SQW
Setfont colorfonticon
Lcdat 20 , 20 , Chr(62) , 15 , 0 ' ikona gołoledź
Setfont Color16x16
Lcdat 15 , 90 , "UWAGA!" , 15 , 0
Setfont Color8x8
Lcdat 35 , 90 , "MOZLIWOSC OBLODZENIA" , 15 , 0
Lcdat 46 , 90 , "JEDZ OSTROZNIE!" , 15 , 0
' ===== ODLICZANIE CZASU WYŚWIETLANIA OSTRZEŻENIA =====
If Mig = 0 Then 'jeśli RTC ustalił stan niski
Lock = 1 'to zapamietaj, ustaw flage
Else 'jesli RTC ustawil już stan wysoki
If Lock = 1 Then 'a byl wczesniej stan niski (flaga)
Lock = 0 'skasuj flage do czasu kolejnego niskiego stanu
Incr Licznik 'tylko raz na zmiane stanu zwiekszamy licznik
If Licznik = 12 Then ' jeśli licznik osiągnął wartość 12 (12 sekund), to
Licznik = 0 ' zeruj licznik
Jest_X_impulsow = 1 ' zakończenie odliczania
End If
End If
End If
If Jest_X_impulsow = 1 Then
Jest_X_impulsow = 0
W1 = 1
end if
If w1 = 1 Then ' zmiana zmiennej pomocniczej
cls
w1 = 1
return 'powrót do pędli głównej
end if
Loop
' ################## OSTRZEŻENIE O WYŁĄCZONYCH ŚWIATŁACH MIJANIA #################
Warning2:
w2 = 1
cls
Pulses = 1100 ' ustalenie długości tonu dźwiękowego
Periods = 320 ' ustawienie barwy tonu
Sound buzzer , Pulses , Periods ' dźwięk ostrzegawczy
waitms 200
Pulses = 1100 ' ustalenie długości tonu dźwiękowego
Periods = 320 ' ustawienie barwy tonu
Sound buzzer , Pulses , Periods ' dźwięk ostrzegawczy
Do
w2 = 1
DRL = 1 ' ŚWIATŁA DZIENNE NADAL WŁĄCZONE
' POMIAR NAPIĘCIA Z CZUJNIKA ŚWIATŁA
wart_adc = Getadc(0) ' pobranie wartości z adc
pom = 0.0025 * wart_adc
wart_nap = Fusing(pom , "#.&&") 'do wyświetlenia na OLED wpisać "wart_nap"
If w2 = 1 And POM > 0.5 Then
cls
w2 = 1
return 'powrót do pędli głównej
end if
Setfont colorfonticon
Lcdat 20 , 20 , Chr(36) , 15 , 0 ' ikona gołoledź
Setfont Color16x16
Lcdat 15 , 80 , "UWAGA!" , 15 , 0
Setfont Color8x8
Lcdat 35 , 80 , "WLACZ SWIATLA MIJANIA!" , 15 , 0
If w2 = 1 And PARKING_LIGHTS = 0 Then 'Jeżeli włączysz światła mijania, to idź do głównej pętli
cls
w2 = 1
return 'powrót do pędli głównej
end if
Loop
Beep:
buzzer = 1
waitms 50
buzzer = 0
Return
' ================== Fonts ===================
$INCLUDE "color8x8.font"
$INCLUDE "color16x16.font"
$INCLUDE "My_font.font"
$INCLUDE "Icon.font"
' ================== Picture =================
Plaatje:
$bgf "pp.BGC"