Witam,potrzebuję pomocy w dokończeniu programu (jeśli istnieje możliwość) schemat znalazłem na elektrodzie
,kod też który przerobiłem pod siebie (docelowo ma być to zamontowane w motocyklu) ma za zadanie dokonywać pomiary temp układu chłodzenia i oleju oraz pomiaru napięcia akumulatora i tu mam problem jak to zrobić żeby w pozycji nr 3 wyświetlało mi napięcie i do jakiego portu atmegi podać sygnał (napięcie) czyli jednym słowem pewna pomiary temp. i pomiar ładowania aku.W zamian oferuję 15 pkt.
program pisany w bascomie
w schemacie są 4 czujniki w wykorzystanę są dwa
lub z korzystać z tego kodu
w tym przypadku może być użyte w pętli, czyli najpierw pokaże temp, silnika i oleju
a za chwile ładowanie.
program pisany w bascomie
$regfile = "m8def.DAT"
$crystal = 1000000
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcd = 16 * 2
Config 1wire = Portd.5
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim I1(9) As Byte
Dim I2(9) As Byte
Dim I As Byte , Tmp As Byte
Dim Crc As Byte
Dim T As Integer , T1 As Integer
Dim X As Integer
Dim Ia As String * 4
Dim Ib As String * 4
Dim W As Byte
Deflcdchar 1 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32
Deflcdchar 2 , 31 , 27 , 19 , 27 , 27 , 17 , 31 , 32
Deflcdchar 3 , 31 , 17 , 29 , 17 , 23 , 17 , 31 , 32
Deflcdchar 4 , 31 , 17 , 29 , 17 , 29 , 17 , 31 , 32
Deflcdchar 5 , 31 , 21 , 21 , 17 , 29 , 29 , 31 , 32
Deflcdchar 6 , 32 , 32 , 32 , 14 , 32 , 32 , 32 , 32 ' replace ? with number (0-7)
X = 0
Cursor Off
Cls
Lcd " YAMAHA FAZER " ;
Lowerline
Lcd " FZS 600 "
Wait 3
Cls
W = 1wirecount()
Lcd "liczba czujnikow"
Lowerline
Lcd "temperatury: "
Waitms 500
Lcd W
Wait 1
Cls
Dsid1(1) = 1wsearchfirst()
Dsid2(1) = 1wsearchnext()
Gosub Stupne
Do
If X < 120 Then
1wreset
1wwrite &H55
1wverify Dsid1(1)
1wwrite &HBE
I1(1) = 1wread(9)
1wreset
1wwrite &H55
1wverify Dsid2(1)
1wwrite &HBE
I2(1) = 1wread(9)
1wreset
1wwrite &HCC
1wwrite &H44
Waitms 300
Waitms 300
If I1(8) = Crc8(i1(1) , 7) Then
Crc = 0
End If
If Crc = 0 Then
Tmp = I1(1) And 1
If Tmp = 1 Then Decr I1(1)
T = Makeint(i1(1) , I1(2))
T = T * 50 : T = T - 25 : T1 = I1(8) - I1(7) : T1 = T1 * 100
T1 = T1 / I1(8) : T = T + T1 : T = T / 10
End If
If Crc = 1 Then
Locate 1 , 1 : Lcd "-- "
Else
If Crc = 0 Then
Locate 1 , 1
Ia = Str(t)
Lcd Left(ia , 2) : Lcd "."
Lcd Mid(ia , 3 , 1)
Else
Locate 1 , 1 : Lcd "** "
End If
End If
If I2(8) = Crc8(i2(1) , 7) Then
Crc = 0
End If
If Crc = 0 Then
Tmp = I2(1) And 1
If Tmp = 1 Then Decr I2(1)
T = Makeint(i2(1) , I2(2))
T = T * 50 : T = T - 25 : T1 = I2(8) - I2(7) : T1 = T1 * 100
T1 = T1 / I2(8) : T = T + T1 : T = T / 10
End If
If Err = 1 Then
Locate 2 , 1 : Lcd "-- "
Else
If Crc = 0 Then
Locate 2 , 1
Ib = Str(t)
Lcd Left(ib , 2) : Lcd "."
Lcd Mid(ib , 3 , 1)
Else
Locate 2 , 1 : Lcd "** "
End If
End If
X = X + 1
Else
Cls
Gosub Wpis1
Gosub Wpis2
X = 0
Cls
Gosub Stupne
End If
Loop
End
Wpis1:
Cls
Lcd Chr(2) ; " TEMP. SILNIKA" ;
Lowerline
Lcd " "
Lcd Left(ia , 2) : Lcd "."
Lcd Mid(ia , 3 , 1)
Lcd Chr(1) ; "C"
Wait 6
Return
Wpis2:
Cls
Lcd Chr(3) ; " TEMP. OLEJU" ;
Lowerline
Lcd " "
Lcd Left(ib , 2) : Lcd "."
Lcd Mid(ib , 3 , 1)
Lcd Chr(1) ; "C"
Wait 6
Return
Stupne:
Locate 1 , 5 : Lcd Chr(1) ; "C"
Locate 1 , 15 : Lcd Chr(6) ; "V"
Locate 2 , 5 : Lcd Chr(1) ; "C"
Locate 1 , 8 : Lcd Chr(2)
Locate 2 , 8 : Lcd Chr(3)
Locate 1 , 9 : Lcd Chr(4)
Returnw schemacie są 4 czujniki w wykorzystanę są dwa
lub z korzystać z tego kodu
'Termometr 4 punktowy DS18b20 by Duch na podstawie materiałów znalezionych w sieci
'Kontakt duszkowski@o2.pl
$regfile = "m8def.DAT" 'deklaracja procesora, w tym wypadku Atmega8
$crystal = 1000000 'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)
'Deklaracja portów od wyświetlacza LCD
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcd = 16 * 2 'ustawiamy typ wyświetlacza (soft jest dostosowany do pracy z wyświetlaczem 2x20, przy pracy z innym wyświetlaczem trzeba będzie skorygować wyświetlanie znaków)
'*************************************WAŻNE**********************************************
'Pamiętać o podłączeniu rezystora podciągającego o wartości 4.7kohm między linią DQ a VCC
Config 1wire = Portd.5 'deklaracja portu na którym będą podpięte DS18b20
Dim I1 As Integer , Ss As String * 6
Dim I2 As Integer
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim B As Byte 'deklaracja zmiennej do odczytu kodów ID
Dim W As Byte 'deklaracja zmiennej do odczytu ilośc czujników
Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32 'znak stopnia Celsjusza
Cursor Off 'Wyłącza kursor
Cls 'Funkcja CLS czyści ekran
Lcd " YAMAHA FAZER " ; 'ekran startowy (pojawia się tylko podczas włączania urządzenia)
Lowerline
Lcd " FZS 600 "
Wait 3
Cls
W = 1wirecount()
Lcd "liczba czujnikow"
Lowerline
Lcd "temperatury: "
Waitms 500
Lcd W
Wait 1
Cls 'Znajdź pierwszy czujnik podpięty do portu
Dsid1(1) = 1wsearchfirst() 'Znajdź kolejny czujnik podpięty do portu
Dsid2(1) = 1wsearchnext() 'Znajdź kolejny czujnik podpięty do portu
'*******************Odczyt numerów ID czujników temperatury*********************
If Dsid1(8) = Crc8(dsid1(1) , 7) Then 'ta opcja pojawia się tylko przy włączaniu urządzenia
Locate 1 , 1
Lcd " Silnik OK "
Wait 1
Locate 1 , 1
For B = 1 To 8
Lcd Hex(dsid1(b))
Next
End If
Wait 1
If Dsid2(8) = Crc8(dsid2(1) , 7) Then
Locate 2 , 1
Lcd " Olej OK "
Wait 1
Locate 2 , 1
For B = 1 To 8
Lcd Hex(dsid2(b))
Next
End If
Wait 1
Cls
'*******************koniec odczytu ID czujników temperatury*********************
Do
1wreset
1wwrite &H55
1wverify Dsid1(1) 'wysyłamy adres pierwszego czujnika
1wwrite &HBE
I1 = 1wread(2)
'---------------------------------
1wreset
1wwrite &H55
1wverify Dsid2(1) 'wysylam adres drugiego czujnika
1wwrite &HBE
I2 = 1wread(2)
'---------------------------------
'--------konwersja temp dla wszystkich dsow
1wreset
1wwrite &HCC
1wwrite &H44
Wait 1
'****Jeśli pracujesz z wyświetlaczem innym niż 2x20 to tutaj trzeba wprowadzić zmiany w LOCATE********
I1 = I1 * 10
I1 = I1 / 16
'If I1 > 0 Then Cls 'korekta przesuniecia znaku st C przy przejściu z temp ujemnej na dodatnią
Ss = Str(i1)
Ss = Format(ss , " 0.0")
Locate 1 , 1 'Pozycja wyświetlania nazwy i temperatury (1.1 -> 1 linia 1 kolumna, 2.10 -> 2 linia 10 kolumna itd)
Lcd "Silnik " ; Ss ; Chr(0) ;
I2 = I2 * 10
I2 = I2 / 16
'If I2 > 0 Then Cls
Ss = Str(i2)
Ss = Format(ss , " 0.0")
Locate 2 , 1
Lcd "Olej " ; Ss ; Chr(0) ;
Loopw tym przypadku może być użyte w pętli, czyli najpierw pokaże temp, silnika i oleju
a za chwile ładowanie.