Pseudo-Leucht-Dioden

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Plankton
Beiträge: 48
Registriert: 20.04.2005 19:48

Pseudo-Leucht-Dioden

Beitrag 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: .
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Pseudo-Leucht-Dioden

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Plankton
Beiträge: 48
Registriert: 20.04.2005 19:48

Beitrag 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
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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 :).
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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
Benutzeravatar
Plankton
Beiträge: 48
Registriert: 20.04.2005 19:48

Beitrag von Plankton »

VIELEN DANK NIC!!! :D :D :D :D

Edit:Wow! Diese methode kann man ja auf jeden Basic-Dialekt
anwenden
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Plankton
Beiträge: 48
Registriert: 20.04.2005 19:48

Beitrag 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
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Mit #delay statt #speed fände ichs noch ein bischen besser...
Sonst aber ein klasse Beispiel! :allright:
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten