Witam na wstępie chciałem powiedzieć, że nie jestem dobry w programowaniu, bo dopiero zaczynam i mnie to powoli wciąga. Mam parę pytań i postanowiłem napisać. Chce zrobić sobie taki mini komputer pokładowy do Fiata Cinquecento 700. Ten mały układ ma wskazywać temperaturę w środku samochodu i na zewnątrz a tak, że będzie pokazywać napięcie, jakim jest ładowany akumulator i ostatnia sprawa, do której nie mam pojęcia jak się zabrać to pokazywanie ile paliwa zostało w baku. Układ mam już częściowo zrobiony tylko mam jeden problem, co do mierzenia ile paliwa zostało w baku. Nie mam pojęcia jak się do tego zabrać jak w ogóle go można podłączyć do µC i jak napisać funkcje w programie. W książce znalazłem dane tego czujnika, który znajduje się w baku:
-rezystancja styków ślizgowych to ≤500mΩ
-zbiornik pełny 0...7Ω to jest 35 litrów
-zbiornik pusty 290...320Ω to jest 0 litrów
I jeszcze chciałbym, aby ktoś sprawdził mi to, co zrobiłem do tej pory.
Dołączam program, który po częściowo udało mi się znaleźć w sieci i złożyć w całość a także schemat, który sam zrobiłem i fragment schematu z książki.
Skan schematu z książki
Schemat do programu
-rezystancja styków ślizgowych to ≤500mΩ
-zbiornik pełny 0...7Ω to jest 35 litrów
-zbiornik pusty 290...320Ω to jest 0 litrów
I jeszcze chciałbym, aby ktoś sprawdził mi to, co zrobiłem do tej pory.
Dołączam program, który po częściowo udało mi się znaleźć w sieci i złożyć w całość a także schemat, który sam zrobiłem i fragment schematu z książki.
Skan schematu z książki
Schemat do programu
Code:
$regfile = "m8def.DAT" 'deklaracja procesora, w tym wypadku Atmega8
$crystal = 1200000 'deklaracja cześtotlwiości pracy (wew oscylator 1MHz w zupełności wystarcza)
'Deklaracja portów od wyświetlacza LCD
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.1 , Rs = Portd.0
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 = Portc.2 'deklaracja portu na którym będą podpięte DS18b20
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'konfiguracja wewnętrznego
'przetwornika A/C
Config Pind.0 = Input
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
Dim Wart_ac As Word 'zmienna na wartość odczytaną
'z przetwornika
Dim V As Single 'zmienna przechowująca obliczoną
'wartość zmierzonego napięcia
Dim Wart_nap As String * 4 'zmienna, do której wpisywana
'zostaje przetworzona wartość
'zmiennej V na tekst
Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32 'znak stopnia Celsjusza
Deflcdchar 1 , 32 , 32 , 12 , 31 , 27 , 17 , 27 , 31 'akumulator +
Deflcdchar 2 , 32 , 32 , 6 , 31 , 31 , 17 , 31 , 31 'alumulator -
Cursor Off 'Wyłącza kursor
Cls
Waitms 250
W = 1wirecount()
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
For B = 1 To 8
Next
End If
If Dsid2(8) = Crc8(dsid2(1) , 7) Then
For B = 1 To 8
Next
End If
Waitms 250
Waitms 250
Cls
'*******************koniec odczytu ID czujników temperatury*********************
Do
1wreset
1wwrite &H55 2
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
Waitms 100
'****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 '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 "IN" ; Ss ; Chr(0) ;
Else
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 "IN" ; Ss ; Chr(0) ;
End If
I2 = I2 * 10
I2 = I2 / 16
If I2 > 0 Then
Ss = Str(i2)
Ss = Format(ss , " 0.0")
Locate 1 , 9
Lcd "OUT" ; Ss ; Chr(0) ;
Else
Ss = Str(i2)
Ss = Format(ss , " 0.0")
Locate 1 , 9
Lcd "OUT" ; Ss ; Chr(0)
End If
Start Adc 'uruchamia wbudowany przetwornik
'początek pętli programu
Wart_ac = Getadc(1) 'odczytanie wartości z wejścia
'ADC1 mikrokontrolera
'czyszczenie LCD
Lowerline 'kursor do drugiej linii LCD
V = Wart_ac * 0.0049 'zamiana odczytanej wartości
'z A/C na napięcie 'Wart_ac * ok. 4,8 mV
V = V * 4
Wart_nap = Fusing(v , "#.&&") 'formatowanie wartości zmiennej
'V do do formatu x.xx i zamiana
'tej wartości na postać tekstową
Lcd Chr(1) ; Chr(2) ; " " ; Wart_nap ; "V " 'wyświetlenie obliczonej
'wartości Wart_nap w drugiej
'linii LCD
Wait 4
Loop
End