Mini komputer samochodowy


Witam. Buduję komputerek do samochodu, który mierzy temperaturę silnika, temperaturę zewnętrzną oraz poziom gazu w butli. Program do atmegi napisany, działa jednak chciał bym przełączać poszczególne parametry przyciskiem. W tej chwili przełączenie następuje automatycznie. Program przerobiony ze znalezionego w sieci.
Jako czujniki temperatury lm35.

$regfile = "m8def.dat"
$crystal = 12000000
 
 
 
Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Portb.4 , Rs = Portb.5
 
Config Lcd = 16 * 2
 
 
 
 
Config Adc = Single , Prescaler = Auto                      ' ADC
 
 
Deflcdchar 1 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31
Deflcdchar 2 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32
 
 
 
   Declare Sub _temp1
   Declare Sub _temp2
   Declare Sub _temp3
   Declare Sub _temp S
 
Dim Usrednianie As Byte
   Dim Temp1 As Word
   Dim Temp2 As Word
   Dim Temp3 As Word
   Dim B As Byte
   Dim X As Byte
   Dim Cx As Byte
   Dim S As Byte
   Dim Level As Byte
   Dim Leve2 As Byte
   Dim T1 As Word
   Dim T2 As Word
   Dim T3 As Bit
   Enable Adcc
 
 Start Adc
 
   Cursor Off
     Cls
 
   Locate 1 , 4
   Lcd "Halo Szymon"
   Home L : Lcd "Renault 19"
   Wait 3
 
 
   For B = 1 To 16 Step 1
   Shiftlcd Right , 1
   Waitms 150
   Next : Cls : Waitms 200
 
   Home : Lcd "   Renault 19   "
   Home L : Lcd "       1.7        "
   Wait 3
   For B = 1 To 16 Step 1
   Shiftlcd Right , 1
   Waitms 150
   Next : Cls : Waitms 200
 
 
Do
 
   For Level = 1 To 10
 
    Call _temp1
 
 
 
   Locate 1 , 1
   Lcd "T siln: " : Lcd Temp1
   Locate 1 , 12
   Lcd "'C"
 
     If Temp1 > 15 And Temp1 < 80 Then
     Locate 2 , 6 : Lcd "niska"
     Elseif Temp1 >= 80 And Temp1 <= 88 Then
     Locate 2 , 6 : Lcd "Normalna"
     Elseif Temp1 >= 89 Then
     Locate 2 , 6 : Lcd "za wysoka"
     End If
 
      Waitms 500
      Next Level
   For B = 1 To 16 Step 1
   Shiftlcd Right , 1
   Waitms 100
   Next : Cls : Waitms 10
 
    For Level = 1 To 10
 
    Call _temp3
 
 
 
   Locate 1 , 1
   Lcd "T zewn.: " : Lcd Temp3
   Locate 1 , 12
   Lcd "'C"
 
     If Temp3 > -30 And Temp3 < 3 Then
     Locate 2 , 6 : Lcd "gololec"
     Elseif Temp1 > 3 And Temp1 < 50 Then
      Locate 2 , 6 : Lcd "       "
     End If
 
      Waitms 500
      Next Level
   For B = 1 To 16 Step 1
   Shiftlcd Right , 1
   Waitms 100
   Next : Cls : Waitms 10
 
 
   For Level = 1 To 10
   Call _temp2
   Locate 1 , 1 : Lcd "rez.|"
   Locate 1 , 6 : Lcd " 25|"
   Locate 1 , 10 : Lcd "50|"
   Locate 1 , 14 : Lcd "100"
   Select Case Temp2
 
   Case Is <= 1:
   For X = 1 To 1
   Locate 2 , X
   Lcd Chr(1)
   Next X
   S = X + 1
   For Cx = 16 To S Step -1
   Locate 2 , Cx
   Lcd Chr(2)
   Next Cx
 
   Case Is <= 6:
   For X = 1 To 2
   Locate 2 , X
   Lcd Chr(1)
   Next X
   S = X + 1
   For Cx = 16 To S Step -1
   Locate 2 , Cx
   Lcd Chr(2)
   Next Cx
 
   Case Is <= 18:
   For X = 1 To 3
   Locate 2 , X
   Lcd Chr(1)
   Next X
   S = X + 1
   For Cx = 16 To S Step -1
   Locate 2 , Cx
   Lcd Chr(2)
   Next Cx
 
   Case Is <= 25:
   For X = 1 To 4
   Locate 2 , X
   Lcd Chr(1)
   Next X
   S = X + 1
   For Cx = 16 To S Step -1
   Locate 2 , Cx
   Lcd Chr(2)
   Next Cx
 
   Case Is <= 31:
   For X = 1 To 5
   Locate 2 , X
   Lcd Chr(1)
   Next X
   S = X + 1
   For Cx = 16 To S Step -1
   Locate 2 , Cx
   Lcd Chr(2)
   Next Cx
 
 
   Case Is <= 37:
   For X = 1 To 6
   Locate 2 , X
   Lcd Chr(1)
   S = X + 1
    Next X
   For Cx = 16 To S Step -1
   Locate 2 , Cx
   Lcd Chr(2)
   Next Cx
 
 
   Case Is <= 43:
   For X = 1 To 7
   Locate 2 , X
   Lcd Chr(1)
   Next X
   S = X + 1
   For Cx = 16 To S Step -1
   Locate 2 , Cx
   Lcd Chr(2)
   Next Cx
 
 
   Case Is <= 50:
   For X = 1 To 8
   Locate 2 , X
   Lcd Chr(1)
   S = X + 1
   Next X
   For Cx = 16 To S Step -1
   Locate 2 , Cx
   Lcd Chr(2)
   Next Cx
 
 
       Case Is <= 56:
   For X = 1 To 9
   Locate 2 , X
   Lcd Chr(1)
   S = X + 1
   Next X
   For Cx = 16 To S Step -1
   Locate 2 , Cx
   Lcd Chr(2)
   Next Cx
 
 
   Case Is <= 62:
   For X = 1 To 10
   Locate 2 , X
   Lcd Chr(1)
   S = X + 1
   Next X
   For Cx = 16 To S Step -1
   Locate 2 , Cx
   Lcd Chr(2)
   Next Cx
 
 
   Case Is <= 68:
   For X = 1 To 11
   Locate 2 , X
   Lcd Chr(1)
   S = X + 1
   Next X
   For Cx = 16 To S Step -1
   Locate 2 , Cx
   Lcd Chr(2)
   Next Cx
 
 
   Case Is <= 75:
   For X = 1 To 12
   Locate 2 , X
   Lcd Chr(1)
   S = X + 1
   Next X
   For Cx = 16 To S Step -1
   Locate 2 , Cx
   Lcd Chr(2)
   Next Cx
 
 
      Case Is <= 81:
   For X = 1 To 13
   Locate 2 , X
   Lcd Chr(1)
   S = X + 1
   Next X
   For Cx = 16 To S Step -1
   Locate 2 , Cx
   Lcd Chr(2)
   Next Cx
 
 
   Case Is <= 87:
   For X = 1 To 14
   Locate 2 , X
   Lcd Chr(1)
   S = X + 1
   Next X
   For Cx = 16 To S Step -1
   Locate 2 , Cx
   Lcd Chr(2)
   Next Cx
 
 
   Case Is <= 90:
   For X = 1 To 15
   Locate 2 , X
   Lcd Chr(1)
   S = X + 1
   Next X
   For Cx = 16 To S Step -1
   Locate 2 , Cx
   Lcd Chr(2)
   Next Cx
 
   Case Is <= 100:
   For X = 1 To 16
   Locate 2 , X
   Lcd Chr(1)
   S = X + 1
   Next X
   For Cx = 16 To S Step -1
   Locate 2 , Cx
   Lcd Chr(2)
   Next Cx
 
   End Select
 
      Waitms 500
     Next Level
   For B = 1 To 16 Step 1
   Shiftlcd Right , 1
   Waitms 100
   Next : Cls : Waitms 10
 
 
  Loop                                                      'koniec pętli Do...Loop
End
 
 
 
 
 Sub _temp1
    For B = 1 To 25 Step 1
   Temp1 = Getadc(0)
   Temp1 = Temp1 / 2
   Waitms 10
 
 
 
         Next
         End Sub
 
   Sub _temp2
    For B = 1 To 25 Step 1
   Temp2 = Getadc(1)
   Temp2 = Temp2 / 2
   Waitms 10
 
           Next
         End Sub
 
  Sub _temp3
    For B = 1 To 25 Step 1
   Temp3 = Getadc(2)
   Temp3 = Temp3 / 2
   Waitms 10
 
 
           Next
         End Sub




Portret użytkownika matrix

Re: Mini komputer samochodowy

Ten kawałek:

Locate 1 , 1
   Lcd "T siln: " : Lcd Temp1
   Locate 1 , 12
   Lcd "'C"
 
     If Temp1 > 15 And Temp1 < 80 Then
     Locate 2 , 6 : Lcd "niska"
     Elseif Temp1 >= 80 And Temp1 <= 88 Then
     Locate 2 , 6 : Lcd "Normalna"
     Elseif Temp1 >= 89 Then
     Locate 2 , 6 : Lcd "za wysoka"
     End If
 
      Waitms 500
      Next Level
   For B = 1 To 16 Step 1
   Shiftlcd Right , 1
   Waitms 100
   Next : Cls : Waitms 10
 
    For Level = 1 To 10
 
    Call _temp3

odpowiada za wyświetlanie temperatury silnika. Jemu podobne za wyświetlanie innych temperatur. Najprostszy sposób to wsadź wszystko w główną pętlę do...loop i dodaj mniejsze. Wyglądało by to tak:

do   'pętla główna
     'wszelkie instrukcje poza pomiarem temperatury
 
  if przycisk = 0 then
     do   'podpętla pierwsza
       bitwait przycisk, set
        'pomiar temp. silnika i wyświetlanie
        if przycisk = 0 then exit do
     loop
     do   'podpętla druga
       bitwait przycisk, set
         'pomiar temp. zewnętrznej i wyświetlanie
       if przycisk = 0 then exit do
     loop
     do   'podpętla trzecia
       bitwait przycisk, set
         'pomiar czego chcesz
       if przycisk = 0 then exit do
     loop
  end if
 
loop
end

Portret użytkownika Szymon SQ3OPC

petla w petli

A jakiś inny sposób? Nie jestem mistrzem w pisaniu programów jednak pętla w pętli chyba jest bardzo rzadko stosowana bo nie spotkałem się wcześniej z tak napisanym programem

Portret użytkownika matrix

Re: Mini komputer samochodowy

Szymon SQ3OPC wrote:
pętla w pętli chyba jest bardzo rzadko stosowana bo nie spotkałem się wcześniej z tak napisanym programem

Nie wiem jak inni, ale ja często stosuję takie rozwiązania w postaci pętli w pętli, jesli oczywiście jest mi to potrzebne. wszystko działa jak złoto.

Portret użytkownika Szymon SQ3OPC

zmiany

Zastosowałem wskazówki podane przez Ciebie. Działa jak chciałem. Teraz mam problemy z wyświetlaniem. Jak temperatura przekroczy 100 'c to po obniżeniu zostaje ostatnie zero, tak samo dzieje się poniżej 10' temperatura jaką pokazuje wyświetlacz to np 80 gdy powinien pokazywać 8

Portret użytkownika Grzeniu 73

dodaj dwie spacje ,które

dodaj dwie spacje ,które nadpiszą te zera