Seite 1 von 2

Pseudo-Leucht-Dioden

Verfasst: 28.05.2005 12:38
von Plankton
Hi Leute,
Also ich hab folgendes problem:
Ich will so ne art LED-Anzeige progn.
Man hat ganz viele Leucht-dioden (quadrate) die alle entweder schwarz oder rot sind. Und über diese quadrate kann man dann Text auf dem Bildschirm erscheinen lassen. Ich rätsel schon seit Tagen rum wie ich das
bewerkstelligen soll doch mir fällt einfach nix ein :cry: .

Re: Pseudo-Leucht-Dioden

Verfasst: 28.05.2005 12:41
von Danilo
Plankton hat geschrieben:Ich will so ne art LED-Anzeige progn.
Nimm doch einfach ein ImageGadget oder einen windowed Screen.
Dann zeichnest Du einfach die Dioden drauf.

Verfasst: 28.05.2005 12:52
von Plankton
mein problem ist ja wie ich die EINZELNEN Dioden zum leuchten (farbe wechseln) bringe.Damit soll man ja Text anzeigen können.
Soweit bin ich gekommen:

Code: Alles auswählen

...
FrontColor(0,0,0)
For i=1 To 792 Step 9 
   For j=1 To 360 Step 9 
      box i,j,8,8
   Next 
Next 
...
88 LEDs in der Breite und 40 in der Höhe

Verfasst: 28.05.2005 13:11
von MVXA

Code: Alles auswählen

Procedure SetDiode(lngMode.l, gdtDiode.l)
    DefType.l lngImage, lngColor
    
    lngImage = CreateImage(#PB_Any, GadgetWidth(gdtDiode), GadgetHeight(gdtDiode))
    If StartDrawing(ImageOutput())
        Select lngMode
            Case 0: lngColor = RGB($00, $00, $00)
            Case 1: lngColor = RGB($80, $00, $00)
            Case 2: lngColor = RGB($FF, $00, $00)
        EndSelect 
        Box(0, 0, GadgetWidth(gdtDiode), GadgetHeight(gdtDiode), lngColor) 
        StopDrawing()
    EndIf 
    SetGadgetState(gdtDiode, UseImage(lngImage))
    FreeImage(lngImage)
EndProcedure

OpenWindow(0, 5, 5, 200, 100, #PB_Window_SystemMenu, "Diode")
CreateGadgetList(WindowID())
ImageGadget(1, 5, 5, 16, 16, 0)
ButtonGadget(6, 5, 26, 30, 25, "Test1")
ButtonGadget(7, 40, 26, 30, 25, "Test1")
ButtonGadget(8, 75, 26, 30, 25, "Test1")
Repeat
    Select WindowEvent()
        Case #PB_Event_CloseWindow
            Break
        Case #PB_Event_Gadget
            Select EventGadgetID()
                Case 6: SetDiode(0, 1)
                Case 7: SetDiode(1, 1)
                Case 8: SetDiode(2, 1)
            EndSelect
        Case 0 
            Delay(1)
    EndSelect
ForEver
Ich denke, der Code sagt alles :).

Verfasst: 28.05.2005 13:32
von NicTheQuick
Ich habe mal einen kleinen Code für dich geschrieben, versehen mit ein paar Kommentaren komms du damit sicherlich weiter.

Code: Alles auswählen

Dim LEDs.l(87, 39)

; LEDs aus Datsection einlesen
; Restore LED1
For j = 0 To 11
  For i = 0 To 29
    Read LEDs(i, j)
  Next
Next

InitSprite()

OpenWindow(0, 0, 0, 88 * 9, 40 * 7, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "LED-Test")
OpenWindowedScreen(WindowID(0), 0, 0, 800, 400, 0, 0, 0)

Repeat
  
  ClearScreen(0, 0, 0)
  
  StartDrawing(ScreenOutput())
    
    ; LEDs anzeigen
    For i = 0 To 87
      For j = 0 To 39
        
        ; Wenn an der Position im Array eine 1 steht
        If LEDs(i, j) = 1
          Color = RGB(127, 0, 0)  ; Dunkelrot
        Else
          Color = RGB(50, 0, 0)    ; Schwarz
        EndIf
        
        ; LED anzeigen
        Box(i * 9, j * 7, 8, 6, Color.l)
      Next
    Next
    
  StopDrawing()
  
  FlipBuffers()
  
  Select WindowEvent()
    Case #PB_EventCloseWindow
      Break
    
    ; Wenn die linke Maustaste gedrückt wurde
    Case #WM_LButtonDown
      ; Berechne die Position der LED anhand der Mauskoordinaten
      x.l = WindowMouseX() / 9
      y.l = WindowMouseY() / 7
      
      ; Ändere den Wert an dieser Stelle
      LEDs(x, y) ! 1
      
  EndSelect
  
  Delay(1)
  
ForEver

DataSection
  LED1:
    ;       H          i     !
    Data.l 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    Data.l 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    Data.l 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    Data.l 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    Data.l 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    
    Data.l 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    Data.l 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    
    ;       P          l         a          n           k           t           o           n
    Data.l 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0
    Data.l 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0
    Data.l 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0
    Data.l 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1
    Data.l 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1
EndDataSection

Verfasst: 28.05.2005 13:42
von Plankton
VIELEN DANK NIC!!! :D :D :D :D

Edit:Wow! Diese methode kann man ja auf jeden Basic-Dialekt
anwenden

Verfasst: 28.05.2005 14:08
von Danilo
Bin zwar ziemlich spät dran, aber naja...

Code: Alles auswählen

#speed = 75 ; milliseconds

#point_w   = 14
#point_h   = 7
#display_w = 50*#point_w
#display_h = 17*#point_h

#points_horz = #display_w / #point_w
#points_vert = #display_h / #point_h

#font_w = 12
#font_h = #font_w

Structure DISPLAY_FONT
  x.b[#FONT_W]
  y.b[#points_vert]
EndStructure

Dim DISPLAY(#points_horz,#points_vert)
Dim POINT_ID(2)
Dim FONT_DATA(256,#font_w,#points_vert)

Procedure InitDisplayFont()
  image = CreateImage(#PB_Any,#font_w,#points_vert)
  If image
    font  = LoadFont(1,"Lucida Console",#font_h)
    If StartDrawing(ImageOutput())
      DrawingMode(1)
      DrawingFont(font)
      FrontColor($FF,$FF,$FF)
      For i = 0 To 255
        Box(0,0,#font_w,#points_vert,0)
        Locate(0,0)
        DrawText(Chr(i))
        For y = 0 To #points_vert-1
          For x = 0 To #font_w-1
            If Point(x,y)
               FONT_DATA(i,x,y)=1
            EndIf
          Next x
        Next y
      Next i
      StopDrawing()
    EndIf
    CloseFont(1)
    FreeImage(image)
  EndIf
EndProcedure

Procedure DrawDisplayText(text$,skip)
  If skip
    skip_x    = skip%#font_w
    skip_char = skip/#font_w
    If skip_char
      text$=Right(text$,Len(text$)-skip_char)
    EndIf
  EndIf
  index = -1
  count = Len(text$)
  If count
    For i = 0 To count-1
      char = Asc(Mid(text$,i+1,1))
      For x = 0+skip_x To #font_w-1
         index + 1
         If index > #points_horz
           ProcedureReturn
         EndIf
        For y = 0 To #points_vert-1
          DISPLAY(index,y)=FONT_DATA(char,x,y)
        Next y
      Next x
      skip_x = 0
    Next i
  EndIf
EndProcedure

Procedure UpdateDisplay()
  UseImage(2)
  If StartDrawing(ImageOutput())
    For y = 0 To #points_vert-1
      For x = 0 To #points_horz-1
        DrawImage(POINT_ID(DISPLAY(x,y)),x*#point_w,y*#point_h)
      Next x
    Next y
    StopDrawing()
  EndIf
EndProcedure

If CreateImage(0,#point_w,#point_h)=0 Or CreateImage(1,#point_w,#point_h)=0 Or CreateImage(2,#display_w,#display_h)=0
  MessageRequester("ERROR","Cant create images !"):End
EndIf

Restore colors
For a = 0 To 1
  Read col
  POINT_ID(a) = UseImage(a)
  If StartDrawing(ImageOutput())
    ;Ellipse(#point_w/2,#point_h/2,(#point_w-1)/2,(#point_h-1)/2,col)
    Box(1,1,#point_w-1,#point_h-1,col)
    StopDrawing()
  EndIf
Next a


Restore text
Read DisplayText$

InitDisplayFont()
DrawDisplayText(DisplayText$,0):UpdateDisplay()

OpenWindow(0,0,0,#display_w,#display_h,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"LeuchtDioden")
  CreateGadgetList(WindowID())
  ImageGadget(1,0,0,#display_w,#display_h,UseImage(2))
  SetTimer_(WindowID(),0,#speed,0)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #WM_TIMER
      index + 1
      If index > Len(DisplayText$)*#font_w
        index=0
      EndIf
      DrawDisplayText(DisplayText$,index):UpdateDisplay()
      SetGadgetState(1,UseImage(2))
  EndSelect
ForEver


DataSection
  colors:
    Data.l $404040, $0000FF
  text:
    Data.s "    Das ist ein Display-Test für Plankton..."
EndDataSection
Mit den Konstanten am Anfang kann man viel ändern, z.B.
die Größe eines Punktes, die Scrollgeschwindigkeit usw.

Um für eine "Diode" eine Ellipse zu nehmen mußt Du nur
die auskommentierte Zeile mit Ellipse wieder einfügen und
dafür das Box() rausnehmen.

Verfasst: 28.05.2005 15:56
von Plankton
@Danilo: Boah!! Sogar mit bewegung! Woher könnt ihr das nur?
Nur ist der Code für mich viel zu kompliziert. Ich progge erst seit 3 Monaten (in PB jedenfalls)

Trotzdem Danke

Verfasst: 28.05.2005 16:21
von bluejoke
Mit #delay statt #speed fände ichs noch ein bischen besser...
Sonst aber ein klasse Beispiel! :allright:

Verfasst: 28.05.2005 16:22
von Danilo
Plankton hat geschrieben:@Danilo: Boah!! Sogar mit bewegung! Woher könnt ihr das nur?
Ich hatte vor längerer Zeit mal einen Lehrgang über Leuchtdiodenlaufschriftprogrammierung. ;)
Plankton hat geschrieben:Nur ist der Code für mich viel zu kompliziert.
Fang einfach am Anfang des Programmes an zu lesen, also
ab Zeile 89. Und dann Schritt für Schritt immer weiter...

Zuerst werden 3 Bilder erstellt. Ein großes für das Display
und 2 kleine für die "Dioden".

InitDisplayFont() zeichnet nacheinander jeden Buchstaben
auf ein Bild und liest die Pixel aus. Diese werden in dem
Array FONT_DATA gespeichert.
Alles Pixelweise, also für 'A' zum Beispiel so:

Code: Alles auswählen

0000000000
0000000000
0000000000
0000100000
0001110000
0001010000
0001001000
0010001000
0010000100
0111111100
0100000010
0100000010
1000000001
0000000000
0000000000
DrawDisplayText() zeichnet dann einen Text in das Array
DISPLAY. Dabei wird ein Offset zum scrollen berücksichtigt.

Und UpdateDisplay() überträgt das Array DISPLAY einfach
auf das Bild.

Der Scroller ist noch Timergesteuert, aber das war es dann
auch schon.