Select Language!
DisplayDisplay

Display

So that the wheelie even during driving is fully under control, it gets a 2.1 inch TFT display. The values are output by the processors on USARTs and changed with the MAX232 to RS232. This ensures smooth transmission to the display. The wheelie can also be connected to the PC instead of the display. There must be started a VT100 compatible terminal.
Hans-Peter Küsters provides a finished controller along with display and high-level commands in BASCOM. In addition, the set has an ATMega128 which has reserve for your own program code. Even in the basic version there is a RS232 converter available, so no additional hardware for my control panel is necessary. The price below 90 euros for display, controller, and RS232 converter has prevented me from DIY ;-)

First display test

Flash is required!

Howto

For the display-code 2 Lib-files are needed. These are shipped with the display. A converter that allows you to convert your own images into BIN files is also included. My background is stored in the files  lcd.bin and color.bin. They are later available for download.

Sourcecode

' (c) 2007 Speed-IT-up (Display3000), Peter Küsters

$hwstack = 128
$swstack = 128
$framesize = 128

$regfile = "m128def.dat"
$crystal = 16000000
$baud1 = 57600

Config Serialin1 = Buffered , Size = 40 , Bytematch = 13
Config Serialout1 = Buffered , Size = 40
Echo Off

Declare Sub Writeserinp
Declare Sub Checkserinp
Declare Sub Parser

Const Mymainchannel = 2
Const Sw_down = 50
Dim Buffer As String * 15
Dim Bufferarray(15) As Byte At Buffer Overlay
Dim Serinpstr As String * 63
Dim Serinpbuffer As String * 63
Dim Serinbuffarr(5) As Byte At Serinpbuffer Overlay
Dim Cr_received As Byte
Dim Strsize As Byte
Dim Mainchannel As Byte
Dim Subchannel As Word
Dim Wert As Single
Dim Frage As Byte
Dim Zeichenpos As Byte

Dim Strpuff As String * 20
Dim Status_old As String * 20
Dim Temp_level_oben As Byte
Dim Temp_level_unten As Byte
Dim Farbe As Word
Dim Voltage As Single
Dim Speed_l As Integer
Dim Speed_r As Integer
Dim Speed As Integer
Dim Speed_hold As Integer
Dim Strspeed As String * 20

'Now we need to select Port B as to an output port (data output to the display)
Ddrb = &B1111111                                            'DDR = Data direction register; All 8 ports switched to output (1)
$include Init21_display3000.bas

Open "COM2:" For Binary As #1

Orientation = Landscape
Graphics_mode = 256high_compressed
Gosub Lcd_cls
Restore Logo
Call Lcd_bitmap(0 , 0 , 175 , 131)
Enable Interrupts
Do
   If Cr_received = 1 Then                                  'wenn was im ser. Buffer ist abholen
      Cr_received = 0
      Input #1 , , Serinpstr Noecho
      Clear Serialin1
      'zum Abtrennen eines oder mehrerer LF am Anfang des Strings, das noch vom Vorgänger-String im Buffer steht
      While Asc(serinpstr) = 10
         Strsize = Len(serinpstr) - 1
         Serinpstr = Right(serinpstr , Strsize)
      Wend
      'Hier ist der String empfangen und ein event. LF entfernt
      Call Checkserinp
   End If
Loop
'---------------------------------------------------------------------------
'     Serial1charmatch
'     Im Eingangspuffer wurde ein "13" empfangen
'     Dieser eine Takt Interrupt verzögert theoretisch die Regelung!?!
'---------------------------------------------------------------------------

Serial1charmatch:
    Cr_received = 1
Return

'---------------------------------------------------------------------------
'     Writeserinp
'     Leitet den empfangenen String zum nächsten Modul weiter
'---------------------------------------------------------------------------

Sub Writeserinp
  'Print #1 Serinpstr                                        ' Befehl Weiterreichen
End Sub

'---------------------------------------------------------------------------
'     Checkserinp
'     Hier der String abgeholt
'     Der Mainchannel und der : wird geprüft
'---------------------------------------------------------------------------

Sub Checkserinp
   If Asc(serinpstr) = 35 Then                              'Strings mit # gleich weiterleiten
      'Call Writeserinp
      Exit Sub
   End If
   If Asc(serinpstr) = 27 Then                              'Strings mit ESC gleich weiterleiten
      'Call Writeserinp
      Exit Sub
   End If

   Zeichenpos = Instr(serinpstr , ":")
   If Zeichenpos > 0 Then                                   ' Doppelpunkt Gefunden
      If Instr(serinpstr , "*") > 0 And Instr(serinpstr , "*") < Zeichenpos Then
         'Call Writeserinp
         Call Parser
         Exit Sub
      Else                                                  'kein *
         Serinpbuffer = Left(serinpstr , Zeichenpos)
         Mainchannel = Val(serinpbuffer)
         If Mainchannel = Mymainchannel Then
            Call Parser
            Exit Sub
         Else
            'Call Writeserinp
            Exit Sub
         End If
      End If
   Else                                                     'kein :
      If Mainchannel = Mymainchannel Then                   'Mainchannel müsste noch von vorigem Durchlauf drinstehen
         Call Parser
         Exit Sub
      Else                                                  'anderes Modul
         'Call Writeserinp
         Exit Sub
      End If
   End If
End Sub
'---------------------------------------------------------------------------
'     Parser
'     Hier beginnt der Parser
'
'---------------------------------------------------------------------------
Sub Parser
   Local I As Byte
                                              'der ":" und alles davor kommt weg
   Zeichenpos = Len(serinpstr) - 2                          'Instr(serinpstr , Doppelpunkt)
   Serinpbuffer = Right(serinpstr , Zeichenpos)
   Zeichenpos = Instr(serinpbuffer , "=")
    If Zeichenpos > 0 Then                                  '= ist vorhanden
      Frage = 0
   Else
      Frage = 1
   End If
   If Zeichenpos = 0 Then Zeichenpos = Len(serinpbuffer)
   Buffer = Left(serinpbuffer , Zeichenpos)
   Subchannel = Val(buffer)
   If Frage = 0 Then
      Frage = Len(serinpbuffer) - Zeichenpos
      Buffer = Right(serinpbuffer , Frage)
      Wert = Val(buffer)
   End If
   Select Case Subchannel
      'Lenker
      Case 3
         Strpuff = Format(buffer , " +0")
         Call Lcd_print(strpuff , 24 , 85 , 1 , 1 , 1 , Black , White)
      'Power Motor links
      Case 7
         If Wert < 0 Then
            Temp_level_oben = 0
            Wert = Wert * -1
            Temp_level_unten = Wert / 5
         Else
            Temp_level_unten = 0
            Temp_level_oben = Wert / 5
         End If
         If Wert > 160 Then
            Farbe = Red
         Else
            Farbe = Green
         End If
         If Temp_level_unten > 36 Then Temp_level_unten = 36
         Temp_level_unten = 90 + Temp_level_unten
         Call Lcd_box(100 , 90 , 105 , Temp_level_unten , Farbe)
         Call Lcd_box(100 , Temp_level_unten , 105 , 126 , White)

         If Temp_level_oben > 36 Then Temp_level_oben = 36
         Temp_level_oben = 90 - Temp_level_oben
         Call Lcd_box(100 , Temp_level_oben , 105 , 90 , Farbe)
         Call Lcd_box(100 , 53 , 105 , Temp_level_oben , White)
      'Power Motor rechts
      Case 8
         If Wert > 0 Then
            Temp_level_unten = 0
            Temp_level_oben = Wert / 5
         Else
            Temp_level_oben = 0
            Wert = Wert * -1
            Temp_level_unten = Wert / 5
         End If
         If Wert > 160 Then
            Farbe = Red
         Else
            Farbe = Green
         End If
         If Temp_level_unten > 36 Then Temp_level_unten = 36
         Temp_level_unten = 90 + Temp_level_unten
         Call Lcd_box(70 , 90 , 75 , Temp_level_unten , Farbe)
         Call Lcd_box(70 , Temp_level_unten , 75 , 126 , White)

         If Temp_level_oben > 36 Then Temp_level_oben = 36
         Temp_level_oben = 90 - Temp_level_oben
         Call Lcd_box(70 , Temp_level_oben , 75 , 90 , Farbe)
         Call Lcd_box(70 , 53 , 75 , Temp_level_oben , White)

      Case 9                                                'Speed left
         Speed_l = Wert
         If Wert > 0 Then
            Temp_level_unten = 0
            Temp_level_oben = Wert / 5
         Else
            Temp_level_oben = 0
            Wert = Wert * -1
            Temp_level_unten = Wert / 5
         End If
         If Wert > 160 Then
            Farbe = Red
         Else
            Farbe = Blue
         End If
         If Temp_level_unten > 36 Then Temp_level_unten = 36
         Temp_level_unten = 90 + Temp_level_unten
         Call Lcd_box(75 , 90 , 80 , Temp_level_unten , Farbe)
         Call Lcd_box(75 , Temp_level_unten , 80 , 126 , White)

         If Temp_level_oben > 36 Then Temp_level_oben = 36
         Temp_level_oben = 90 - Temp_level_oben
         Call Lcd_box(75 , Temp_level_oben , 80 , 90 , Farbe)
         Call Lcd_box(75 , 53 , 80 , Temp_level_oben , White)
      Case 10                                               'Speed right
         Speed_r = Wert
         If Wert < 0 Then
            Temp_level_oben = 0
            Wert = Wert * -1
            Temp_level_unten = Wert / 5
         Else
            Temp_level_unten = 0
            Temp_level_oben = Wert / 5
         End If
         If Wert > 160 Then
            Farbe = Red
         Else
            Farbe = Blue
         End If
         If Temp_level_unten > 36 Then Temp_level_unten = 36
         Temp_level_unten = 90 + Temp_level_unten
         Call Lcd_box(95 , 90 , 100 , Temp_level_unten , Farbe)
         Call Lcd_box(95 , Temp_level_unten , 100 , 126 , White)

         If Temp_level_oben > 36 Then Temp_level_oben = 36
         Temp_level_oben = 90 - Temp_level_oben
         Call Lcd_box(95 , Temp_level_oben , 100 , 90 , Farbe)
         Call Lcd_box(95 , 53 , 100 , Temp_level_oben , White)
      Case 11
        If Buffer <> Status_old Then
         Status_old = Buffer
         Call Lcd_print( "                    " , 10 , 25 , 1 , 1 , 1 , White , White)
         Select Case Wert
            Case 10
               Call Lcd_print( "Störung! ADXL low" , 10 , 25 , 1 , 1 , 1 , Red , White)
            Case 11
               Call Lcd_print( "Störung! ADXL high" , 10 , 25 , 1 , 1 , 1 , Red , White)
            Case 12
               Call Lcd_print( "Störung! Gyro low" , 10 , 25 , 1 , 1 , 1 , Red , White)
            Case 13
               Call Lcd_print( "Störung! Gyro high" , 10 , 25 , 1 , 1 , 1 , Red , White)
            Case 14
               Call Lcd_print( "Störung! Fußschalter" , 10 , 25 , 1 , 1 , 1 , Red , White)
            Case Else
               If Buffer = "Standby" Then Speed_hold = 0
               Call Lcd_print(buffer , 10 , 25 , 1 , 1 , 1 , Black , White)
         End Select
        End If
      'Battery
      Case 12
         Voltage = Val(buffer)
         Voltage = Voltage * 0.0328
         Select Case Voltage
              Case 0 To 24
               Farbe = Red
              Case 24 To 25
               Farbe = Orange
              Case 25 To 29
               Farbe = Green
              Case Else
               Farbe = Black
         End Select
         Buffer = Str(voltage)
         Buffer = Left(buffer , 4)
         Strpuff = Format(buffer , " 0") + "V"
         Call Lcd_print(strpuff , 24 , 52 , 1 , 1 , 1 , Farbe , White)

        'Speed wird hier gezeichnet, da die Zeit bei den Speedbalken zu knapp wird.
         Speed = Speed_l + Speed_r
         Speed = Speed / 2
         If Speed < 1 And Speed > -1 Then Speed = 0
         Strspeed = Str(speed)
         Strspeed = Format(strspeed , " +0.0")
         Strspeed = Left(strspeed , 6)
         If Speed > Speed_hold Then
             Speed_hold = Speed
             Call Lcd_print(strspeed , 135 , 58 , 1 , 1 , 1 , Black , White)
         End If
         Strspeed = Strspeed + " km/h"
         Call Lcd_print(strspeed , 50 , 38 , 1 , 1 , 1 , Black , White)

      Case Else
   End Select
   Enable Interrupts
End Sub

End

$inc Logo , Nosize , "lcd.bin"
$inc Colortable , Nosize , "color.bin"
$include Glcd21_display3000.bas
$include Glcd21_fonts.bas