Springen naar inhoud


- - - - -

Hoe een leddisplay aansturen?

Led VB.Net RS232

  • Log in a.u.b. om te beantwoorden
Er zijn 162 reacties in dit onderwerp

#1 Swets

Swets

    Professional Developer

  • Leden
  • PipPipPipPip
  • 367 berichten
    Laatst bezocht 22 feb 2018 16:36
  • LocatieKrimpen a/d IJssel

Geplaatst op 09 november 2010 - 23:43

Ik heb een aantal van die led displays gekocht bij baco...

zie hier wat meer info:
http://gathering.twe...sages/1288241/0
http://www.circuitso...orum/view/60243
http://spritesmods.com/?art=ledmatrix

ik heb de electronica in orde, en dat werkt nu goed....

Ik heb het nu zo als ik via rs232 er "start0101010101010101" naar toe stuur, wordt per nibble het scherm van links boven naar rechts onder gevuld met 0101...  :mrgreen:

Geplaatste afbeelding
ecececececececec

Geplaatste afbeelding
22222222222222

Geplaatste afbeelding
44444444444444

oke ik denk dat dit wel duidelijk is...

Ik heb nu een klein test programmaatje gemaakt in visual-basic 2010, met een aantal buttons...

met de onderstaande code:
Visual Basic Code:
Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
		Dim tel As Byte
		If checkEnableSerial.Checked = True Then
			SerialPort1.Write("start")
			For tel = 1 To 128
				SerialPort1.Write("22")
			Next
		End If
	End Sub


maar nu verder..... liefst natuurlijk in VB 2010.... (want dat wil ik weer door krijgen, ben een beetje blijven hangen bij VB6.0)

tja... tis eigenlijk ook een soort oproep van ja  wat zouden jullie maken?

zelf zat ik te denken aan iets wat een animated gif in kan lezen? deze pixel voor pixel uit lezen.... en door sturen naar het display?

of een formulier met iets van een raster van 64x32 , waar je pixels aan en uit kan zetten... en dan een save frame knop ofzo...  en dat je het genen wat je gemaakt heb kan save....?

kortom,  wat zouden jullie maken?   en graag een beetje hulp ....

#2 RedThread

RedThread

    Beheerder VBIB

  • Beheerder
  • 3593 berichten
    Laatst bezocht gisteren, 20:06
  • LocatieTongeren,Belgium.
Inzender

Geplaatst op 10 november 2010 - 16:13

Waarom geen lichtkrant ?

Weergave van tekst (link rechts, rechts links, boven onder , scrollend, blinking, variabele snelheid, etc) dus.

Al moet ik zeggen dat jouw idee van een animated gif weergeven ook niet slecht is !

greetzzz
RedThread.

#3 Swets

Swets

    Professional Developer

  • Leden
  • PipPipPipPip
  • 367 berichten
    Laatst bezocht 22 feb 2018 16:36
  • LocatieKrimpen a/d IJssel

Geplaatst op 10 november 2010 - 17:16

lichtkrant...  ja zou ook kunnen....  maar lijkt me leuk als ik er ook plaatjes enzo op kan laten zien...
(ik heb er trouwens nog 5, dus ik kan er 1 groot display van maken)

maar een gif, per pixel uit lezen... is dat te doen in visual basic?

en is er iemand die me kan vertellen hoe?

#4 josk79

josk79

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 614 berichten
    Laatst bezocht 16 aug 2018 17:25

Geplaatst op 10 november 2010 - 23:24

Ik heb iets leuk voor je voorbereid. Een klasse om je leddisplay mee te kunnen tekenen. Het maakt gebruik van System.Drawing.Graphics om te kunnen tekenen met bijvoorbeeld DrawLine, DrawRectangle etc...

Ik ben ervan uitgegaan dat je resolutie 32x16 is.

Visual Basic Code:
Public Class LedDisplay


	Public Color0 As Color = Color.Black
	Public Color1 As Color = Color.Red

	Dim _bitmap As Bitmap = New Bitmap(32, 16)
	Dim _graphics As Graphics = Graphics.FromImage(Bitmap)

	Public ReadOnly Property Bitmap() As Bitmap
		Get
			Return _bitmap
		End Get
	End Property
	Public ReadOnly Property Graphics() As Graphics
		Get
			Return _graphics
		End Get
	End Property

	Sub New()
		Clear()
	End Sub

	'Pixel tekenen of lezen 
	Default Public Property Pixel(ByVal x As Integer, ByVal y As Integer) As Boolean
		Get
			'Return true als roodwaarde > 50%
			Return Bitmap.GetPixel(x, y).R > 127
		End Get
		Set(ByVal value As Boolean)
			bitmap.SetPixel(x, y, If(value, Color1, Color0))
		End Set
	End Property

	'Maakt het plaatje leeg
	Public Sub Clear()
		graphics.Clear(Color0)
	End Sub

	Public Function ToHexString() As String
		'Returnt de hexadecimale string die per rs232 kan worden verzonden
		ToHexString = "start"
		For i = 0 To bitmap.Height - 1
			For j = 0 To bitmap.Width - 1 Step 8
				Dim byt As Integer = 0
				For k = 0 To 7
					If Pixel(j + k, i) Then byt += 2 ^ k
				Next
				ToHexString &= Conversion.Hex(byt).PadLeft(2, "0"c)
			Next
		Next
	End Function

End Class


Hier een stuk code met een demonstratie:

Visual Basic Code:
Public Class Form1
	Dim WithEvents tmr As New Timer
	Dim picbox As PictureBox
	Dim txtbox As TextBox

	Dim leddisp As New LedDisplay

	Dim ctr As Integer = 0

	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
		'Teken controls op het form
		Me.Size = New Size(400, 400)
		picbox = New PictureBox
		picbox.Bounds = New Rectangle(0, 0, 320, 160)
		Me.Controls.Add(picbox)

		txtbox = New TextBox
		txtbox.Multiline = True
		txtbox.Bounds = New Rectangle(0, 200, 320, 160)
		Me.Controls.Add(txtbox)


		'Start de timer
		tmr.Interval = 100
		tmr.Start()
	End Sub


	Private Sub tmr_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmr.Tick

		'Demonstratie animatie uitvoeren
		leddisp.Clear()
		leddisp.Graphics.DrawRectangle(New Pen(leddisp.Color1), 0, 0, ctr, ctr)
		leddisp.Graphics.DrawEllipse(New Pen(leddisp.Color1), 31 - ctr, 0, ctr, ctr)
		ctr = (ctr + 1) Mod 16

		ShowLedDisplayOnForm()


	End Sub

	Private Sub ShowLedDisplayOnForm()
		'Tekent het leddisplay op de picturebox in het form
		picbox.Image = New Bitmap(picbox.Width, picbox.Height)
		Dim gr As Graphics = Graphics.FromImage(picbox.Image)
		gr.InterpolationMode = Drawing2D.InterpolationMode.NearestNeighbor
		gr.DrawImage(leddisp.Bitmap, 0, 0, picbox.Image.Width, picbox.Image.Height)

		'Schrijf de hexstring in de textbox in het form
		txtbox.Text = leddisp.ToHexString
	End Sub
End Class



Het enige dat je hoeft te doen om te testen is dit plakken in een nieuw windows forms project. Om het naar je leddisplay te sturen gebruik je de .ToHexString()

... inplaats van gebruik te maken van Graphics / Bitmap kun je natuurlijk ook gewoon een array van booleans gebruiken.

#5 Swets

Swets

    Professional Developer

  • Leden
  • PipPipPipPip
  • 367 berichten
    Laatst bezocht 22 feb 2018 16:36
  • LocatieKrimpen a/d IJssel

Geplaatst op 10 november 2010 - 23:38

Heel erg bedankt,   ik ga het gelijk bekijken........

#6 Swets

Swets

    Professional Developer

  • Leden
  • PipPipPipPip
  • 367 berichten
    Laatst bezocht 22 feb 2018 16:36
  • LocatieKrimpen a/d IJssel

Geplaatst op 10 november 2010 - 23:44

moet ik dan zelf een picturebox, textbox en een timer op het formulier zetten?

ja sorry.... zijn me eerste stappen met 2010

#7 Swets

Swets

    Professional Developer

  • Leden
  • PipPipPipPip
  • 367 berichten
    Laatst bezocht 22 feb 2018 16:36
  • LocatieKrimpen a/d IJssel

Geplaatst op 10 november 2010 - 23:55

Ik heb een nieuwe class aan me project  ge-add... en daar heb ik de code hier boven public class in gekopieers en ik heb hem LedDisplay.vb genoemt...

daarna heb ik een form gemaakt, en bij de code het andere stuk programma neer gezet....

maar als ik het probeert te runnen... zie ik onderin  in de error list..
I is not declared en Y is not declared en K is not declared...

dus er zullen ergens nog wel iets van DIM y as byte  ofzo moeten komen?

#8 Swets

Swets

    Professional Developer

  • Leden
  • PipPipPipPip
  • 367 berichten
    Laatst bezocht 22 feb 2018 16:36
  • LocatieKrimpen a/d IJssel

Geplaatst op 11 november 2010 - 00:06

joepie....   het werkt... althans nog niet goed... maar ik zie op me form een rondje groter worden, en een vierkantje.... en ik zie in de textbox de string langs komen die verzonden moet worden naar het leddisplay....

en ik heb bij gezet  , in die Sub showLedDisplayOnForm , serialport1.write(txtbox.text)

en ik zie van alles op het display gebeuren, maar geen rondje en vierkantje....  maar wat me ook op viel...

is dat die string in txtbox...  niet elke keer even lang is....   ik zien hem soms 1 korter, en soms eentje langer....  dus ergens gaat er iets fout....   denk met een 0 ofzo....  

ik ga nog eens zoeken.....

#9 Swets

Swets

    Professional Developer

  • Leden
  • PipPipPipPip
  • 367 berichten
    Laatst bezocht 22 feb 2018 16:36
  • LocatieKrimpen a/d IJssel

Geplaatst op 11 november 2010 - 00:38

Geplaatste afbeelding

dit heb ik nu,  maar er gaat iets niet helemaal goed....

want als ik naat het plaatje kijkt, moeten de eerst 3 pixels aan...  dus dat zou iets van E moeten zijn...

als eerste had ik nu "startE0.....  verwacht?

en het gaat dus ergens fout in die class... in de function  toHexString

dus daar zal ik eens in moeten duiken....

start07 lijkt wel een beetje iets van omgedraaidt...  00000111 en het zou moeten zijn 11100000   en dat zou startE0 zijn...?

#10 josk79

josk79

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 614 berichten
    Laatst bezocht 16 aug 2018 17:25

Geplaatst op 11 november 2010 - 00:48

De tekststring is bij mij aldoor evenlang hoor. Hij lijkt te verspringen door het lettertype (letters zijn niet altijd even breed). Voeg dit toe in form_load om een lettertype met vaste breedte te gebruiken:

Visual Basic Code:
txtbox.Font = New System.Drawing.Font("Courier New", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 0)


Over je genoemde probleem; misschien moet de bitvolgorde per byte omgedraait worden. Vervang eens in ToHexString:

Visual Basic Code:
If Pixel(j + k, i) Then byt += 2 ^ k


door :

Visual Basic Code:
If Pixel(j + k, i) Then byt += 2 ^ (7 - k)



#11 Swets

Swets

    Professional Developer

  • Leden
  • PipPipPipPip
  • 367 berichten
    Laatst bezocht 22 feb 2018 16:36
  • LocatieKrimpen a/d IJssel

Geplaatst op 11 november 2010 - 01:18

Geplaatste afbeelding
Geplaatste afbeelding
Geplaatste afbeelding

kijk hij doet het....

alleen als ik die string die in die texbox staat in 1 keer naar de seriele poort stuurt, gaat het display fout,  maar dat kan ook wel aan het programma liggen in mij PIC microcontroller....

als ik het zo doe:
Visual Basic Code:
 Dim tel As Byte
		If checkEnableSerial.Checked = True Then
			For tel = 1 To 133
				SerialPort1.Write(Mid(txtbox.Text, tel, 1))
			Next
		End If


gaat het wel goed?  misschien dat de pic het dan anders niet bij kan werken...

Ja sorry... de string was inderdaad altijd even lang....

he...vind dit al super leuk....  er verschijnt iets op het display...

morgen verder stoeien....

Heeeeeeel  erg bedankt...

is trouwens een animated gif op deze manier uitlezen moeilijk?

#12 josk79

josk79

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 614 berichten
    Laatst bezocht 16 aug 2018 17:25

Geplaatst op 11 november 2010 - 01:21

Ik weet niet hoe het met animated gifs gaat, ik heb je een voorbeeldje ge-pm'd met een bitmap.

Idee: Je kunt ook het spelletje PONG programmeren op je leddisplay!

Geplaatste afbeelding

#13 Vozzie

Vozzie

    Moderator

  • Leden
  • PipPipPipPipPipPipPip
  • 1855 berichten
    Laatst bezocht 12 jul 2017 13:15
Inzender

Geplaatst op 11 november 2010 - 03:04

Hallo,

Gifjes ontleden kan als volgt. Je kan aan de kleur van elke frame door bmp.GetPixel(x,y).

Visual Basic Code:
Imports System
Imports System.Drawing
Imports System.Drawing.Imaging

Public Class Form1

	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
		Dim btn As New Button
		Me.AutoScroll = True
		btn.Bounds = New Rectangle(10, 10, Me.ClientSize.Width - 20, btn.Height)
		btn.Text = "download gif"
		btn.Anchor = AnchorStyles.Left Or AnchorStyles.Top Or AnchorStyles.Right
		AddHandler btn.Click, AddressOf btn_click
		Me.Controls.Add(btn)
	End Sub

	Private Sub btn_click(ByVal sender As System.Object, ByVal e As System.EventArgs)
		If Not IO.File.Exists("c:\baby.gif") Then My.Computer.Network.DownloadFile("http://www.hifi-notes.com/images/baby.gif", "c:\baby.gif")
	  Dim img As Image = Image.FromFile("c:\baby.gif")
		Dim dimensions() As Guid = img.FrameDimensionsList()
		Dim frameDimension As New FrameDimension(dimensions(0))
		Dim frameCount As Integer = img.GetFrameCount(frameDimension)
		Dim top As Integer = DirectCast(sender, Button).Bottom + 10
		For i As Integer = 0 To frameCount - 1
			img.SelectActiveFrame(frameDimension, i)
			Using bmp As Bitmap = New Bitmap(img)
				Dim pictureBox As New PictureBox()
				pictureBox.Bounds = New Rectangle(10, top, bmp.Width, bmp.Height)
				pictureBox.Image = DirectCast(bmp.Clone(), Bitmap)
				Me.Controls.Add(pictureBox)
				top += bmp.Height + 10
			End Using
		Next
	End Sub

End Class

(had eerst WebClient.DownloadData gedaan, welk een byte array terug geeft. Die byte array in een MemoryStream geplaatst en deze stream als argument mee gegeven aan Image.FromStream(memoryStream). Maar dit gaf fouten,... Eerst saven naar file lost het op. Meer info: http://social.msdn.m...3-3890007d81ea/ )

Source: http://www.eggheadca...animatedgif.asp

Gifje/Image optimaliseren: http://msdn.microsof...y/aa479306.aspx

Groeten

#14 Swets

Swets

    Professional Developer

  • Leden
  • PipPipPipPip
  • 367 berichten
    Laatst bezocht 22 feb 2018 16:36
  • LocatieKrimpen a/d IJssel

Geplaatst op 11 november 2010 - 09:02

bedankt , zal dit vannavond bekijken,  zit nu op me werk...

#15 pluto

pluto

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 663 berichten
    Laatst bezocht 28 jan 2018 21:10

Geplaatst op 11 november 2010 - 10:32

Ik heb de code van josk79 geprobeerd en bij mij werkt het perfect.  Hoe doen jullie dit toch?  Ik heb ook eens een cursus gevolgd via afstands leren in SNT BRUGGE (Bart R.).  En in het 2 deel ben ik vast gelopen bij de klassen.  En zat toen met een verhuis (had dan veel werk).  Maar nu met de winter voor de deur zoek ik verder.

groetjes

#16 Swets

Swets

    Professional Developer

  • Leden
  • PipPipPipPip
  • 367 berichten
    Laatst bezocht 22 feb 2018 16:36
  • LocatieKrimpen a/d IJssel

Geplaatst op 11 november 2010 - 11:07

@pluto:  Heb je ook zo'n display dan?  of heb je het op de computer geprobeerd?

En bij mij doet hij het nu ook,  en ook het verzenden via de compoort gaat goed... (zie de foto's)

#17 pluto

pluto

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 663 berichten
    Laatst bezocht 28 jan 2018 21:10

Geplaatst op 11 november 2010 - 11:50

Swets ik het programma gewoonn op pc geprobeerd

groetjes

#18 josk79

josk79

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 614 berichten
    Laatst bezocht 16 aug 2018 17:25

Geplaatst op 11 november 2010 - 21:59

Het pong-spel leek me zo leuk om te doen dat ik er zelf maar iets voor heb gefabriceerd:

Ten eerste deze klassen definieeren in een nieuwe module:

Visual Basic Code:
Public Class PongGame
	Private p1up As Boolean, p1down As Boolean

	Public Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
		'Controleer of een knop wordt ingedrukt
		Dim Handled As Boolean = True
		Select Case e.KeyCode
			Case Keys.Up
				p1up = True
			Case Keys.Down
				p1down = True
			Case Else
				Handled = False
		End Select
		e.Handled = Handled
	End Sub

	Public Sub KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
		'Controleer of een knop wordt losgelaten
		Dim Handled As Boolean = True
		Select Case e.KeyCode
			Case Keys.Up
				p1up = False
			Case Keys.Down
				p1down = False
			Case Else
				Handled = False
		End Select
		e.Handled = Handled
	End Sub

	Public Sub Update()
		'Update speler 1
		If p1up Then Player1.Y -= 1
		If p1down Then Player1.Y += 1
		'Pong.Player1.AutoPlay()

		'Update speler 2
		Player2.AutoPlay()

		'update de bal
		Ball.Move()
	End Sub


	Public Width As Integer = 32
	Public Height As Integer = 16
	Public Player1 As PongPlayer = New PongPlayer(Me)
	Public Player2 As PongPlayer = New PongPlayer(Me)
	Public WithEvents Ball As PongBall = New PongBall(Me)

	Sub New()
		Player1.X = 2
		Player2.X = Width - 3
	End Sub

	Private Sub Ball_Dies() Handles Ball.Dies
		Ball = New PongBall(Me, Ball.MovesToTheRight)
	End Sub
End Class

Public Class PongBall
	Public Event Dies() 'De bal is de speler gepasseerd

	Private _Pong As PongGame
	Private MoveX As Integer = 1
	Private MoveY As Integer = 1
	Private _X As Integer
	Private _Y As Integer

	Private Function TestBounce(ByVal Player As PongPlayer) As Boolean
		'Controleer of de bal tegen een speler aan stuitert
		If Me.X = Player.X And Me.Y >= Player.Y And Me.Y < Player.Y + Player.Height Then
			'Door MoveX, MoveY, _X en _Y floating point te maken kun je ook nog de hoek 
			'veranderen die de bal opstuitert!
			MoveX = -MoveX
			_X += MoveX
		End If
	End Function

	Public Function MovesToTheRight() As Boolean
		Return MoveX > 0
	End Function

	Public ReadOnly Property X() As Integer
		Get
			Return _X
		End Get
	End Property
	Public ReadOnly Property Y() As Integer
		Get
			Return _Y
		End Get
	End Property

	Sub Move()
		'Verplaats in Y-richting en stuiter als we de rand raken
		_Y += MoveY
		If _Y <= 0 Then
			_Y = 0
			MoveY = -MoveY
		ElseIf _Y >= _Pong.Height - 1 Then
			_Y = _Pong.Height - 1
			MoveY = -MoveY
		End If

		'Verplaats in X-richting en sterf als we de rand raken
		_X += MoveX
		If _X <= 0 OrElse _X >= _Pong.Width - 1 Then
			RaiseEvent Dies()
		End If

		TestBounce(_Pong.Player1)
		TestBounce(_Pong.Player2)
	End Sub


	Sub New(ByVal Pong As PongGame, Optional ByVal MovesToTheRight As Boolean = True)
		_Pong = Pong
		Me._X = _Pong.Width \ 2
		Me._Y = 3
		If Not MovesToTheRight Then Me.MoveX = -Me.MoveX
	End Sub
End Class

Public Class PongPlayer
	Private pong As PongGame
	Public Height As Integer = 4

	Private _X As Integer
	Public Property X() As Integer
		Get
			Return _X
		End Get
		Set(ByVal value As Integer)
			_X = value
			If _X < 0 Then
				_X = 0
			ElseIf _X >= pong.Width Then
				_X = pong.Width - 1
			End If
		End Set
	End Property

	Private _Y As Integer
	Public Property Y() As Integer
		Get
			Return _Y
		End Get
		Set(ByVal value As Integer)
			_Y = value
			If _Y < 0 Then
				_Y = 0
			ElseIf _Y + Height - 1 >= pong.Height Then
				_Y = pong.Height - Height
			End If
		End Set
	End Property

	Sub AutoPlay()
		'Als de bal dichtbij is en in de richting van de speler wordt gespeeld:
		'De bal achterna gaan!
		If Math.Abs(pong.Ball.X - Me.X) < pong.Height And _
		(pong.Ball.MovesToTheRight Xor pong.Ball.X > Me.X) Then
			If pong.Ball.Y < Me.Y + 2 Then
				Me.Y -= 1
			ElseIf pong.Ball.Y >= Me.Y + Me.Height - 2 Then
				Me.Y += 1
			End If
		End If
	End Sub

	Sub New(ByVal Pong As PongGame)
		Me.pong = Pong
	End Sub

End Class



En dan wat kleine aanpassingen in Form1:

- Definieren van Pong as PongGame
- KeyUp en KeyDown event doorsturen naar Pong
- Pong.Update aanroepen bij tmr.Tick
- Pong entiteiten tekenen op leddisplay bij tmr.Tick

Visual Basic Code:
Public Class Form1

	' [...]

	Dim Pong As New PongGame

	Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
		Pong.KeyDown(sender, e)
	End Sub

	Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
		Pong.KeyUp(sender, e)
	End Sub

	' [...]


	Private Sub tmr_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmr.Tick

		'Update het pong-spel
		Pong.Update()

		'Tekenen op leddisplay
		leddisp.Clear()
		leddisp.Bitmap.SetPixel(Pong.Ball.X, Pong.Ball.Y, leddisp.Color1)
		leddisp.Graphics.DrawLine(New Pen(leddisp.Color1), Pong.Player1.X, Pong.Player1.Y, Pong.Player1.X, Pong.Player1.Y + Pong.Player1.Height - 1)
		leddisp.Graphics.DrawLine(New Pen(leddisp.Color1), Pong.Player2.X, Pong.Player2.Y, Pong.Player2.X, Pong.Player2.Y + Pong.Player2.Height - 1)

		'Laat zien op form
		ShowLedDisplayOnForm()

	End Sub

	' [...]

End Class



#19 Swets

Swets

    Professional Developer

  • Leden
  • PipPipPipPip
  • 367 berichten
    Laatst bezocht 22 feb 2018 16:36
  • LocatieKrimpen a/d IJssel

Geplaatst op 11 november 2010 - 23:21

lol,  ik ga het gelijk proberen.....

#20 Swets

Swets

    Professional Developer

  • Leden
  • PipPipPipPip
  • 367 berichten
    Laatst bezocht 22 feb 2018 16:36
  • LocatieKrimpen a/d IJssel

Geplaatst op 11 november 2010 - 23:50

Swets zei:

lol,  ik ga het gelijk proberen.....

hij doet het... althans... ik weet nog niet met welke toetsen... of moeten de streepjes vanzelf op en neer gaan....

Geplaatste afbeelding

#21 Swets

Swets

    Professional Developer

  • Leden
  • PipPipPipPip
  • 367 berichten
    Laatst bezocht 22 feb 2018 16:36
  • LocatieKrimpen a/d IJssel

Geplaatst op 12 november 2010 - 00:10

denk dat ik er ook nogiets van een checksum in moet maken... want soms  afentoe 1 frame komt verminkt in de electronica....
dus wordt wel goed verzonden.... dat zie ik in de tekstbox... maar dan gaat er in het display iets fout....

dus dat programma ook nog eens bekijken...  misschien kan ik dat ook nog verbeteren.....

en ik wil dat gif verhaal ook nog eens bekijken.....

want ik heb zo'n programma om animated gif te maken...   zou wel leuk zijn als ik dat ook op het display kon krijgen....

#22 josk79

josk79

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 614 berichten
    Laatst bezocht 16 aug 2018 17:25

Geplaatst op 12 november 2010 - 01:10

Oh ja, sorry vergeten te melden:

Form1.KeyPreview = True

Dan kun je de linker speler besturen met de cursortoetsen up/down. De rechter wordt door de PC bestuurd. Als je beide door de PC wilt laten besturen kun je de Update routine veranderen in de PongGame klasse:

Visual Basic Code:
   Public Sub Update()
		'Update speler 1
		'If p1up Then Player1.Y -= 1 'Dit is met toetsenbord
		'If p1down Then Player1.Y += 1 'Dit is met toetsenbord
		Player1.AutoPlay()  'Dit is door PC bestuurd
		'Update speler 2
		Player2.AutoPlay()

		'update de bal
		Ball.Move()
	End Sub




#23 Swets

Swets

    Professional Developer

  • Leden
  • PipPipPipPip
  • 367 berichten
    Laatst bezocht 22 feb 2018 16:36
  • LocatieKrimpen a/d IJssel

Geplaatst op 12 november 2010 - 09:29

pluto zei:

Ik heb de code van josk79 geprobeerd en bij mij werkt het perfect.  Hoe doen jullie dit toch?  Ik heb ook eens een cursus gevolgd via afstands leren in SNT BRUGGE (Bart R.).  En in het 2 deel ben ik vast gelopen bij de klassen.  En zat toen met een verhuis (had dan veel werk).  Maar nu met de winter voor de deur zoek ik verder.

groetjes

moet wel zeggen dat ik nu die klasse een beetje begin te begrijpen....
Ik heb een paar boeken visualbasic .net  en een paar keer aanbegonnen, maar liep ook steeds vast op die klasse.... beginnen ze weer over auto's, en wielen .....  :mrgreen: en dan pakte ik visual basic 6.0 maar weer.... ( want daar kon ik wel aardig mee uit de voeten, en die IDE was ik ook gewend) .

maar nu begin ik het (denk ik) te begrijpen.....  klasse is een verhaal (soort van bouwtekening) over hoe iets werkt, dus wat je erin moet stoppen.. wat er dan uit komt....

en een object is stuk software wat gebouwd is naar de bouwtekening van een bepaalde klasse....

je kan een klasse in 1 project ook vaker gebruiken? althans  dat denk ik...?

je zou een klasse kunnen schrijven voor bijvoorbeeld een zelf gemaakte button ofzo... en die dan vaker in je project kunnen gebruiken?

maar eigenlijk begrijp ik de voordelen niet zo.... ja dat als je dan die klasse veranderd, gelijk al je zelf gemaakt knoppen veranderen?

eigenlijk is een klasse net zoiets als een activeX (ocx) in visual basic6 ? (want die heb ik ook nog wel zelf gemaakt)

maar waarom maak je bijvoorbeeld die pong spel voor een deel in een klasse?

je had toch ook alles op het formulier kunnen bouwen?

#24 pluto

pluto

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 663 berichten
    Laatst bezocht 28 jan 2018 21:10

Geplaatst op 12 november 2010 - 09:55

Dag Swets ja klassen begrijp ik ook niet hoor.  En wat het nut er van is nog minder  ik geef een vb

Visual Basic Code:
Public Class Class1
	Private xValue As String


	Public Property x() As String
		Get
			Return xValue
		End Get
		Set(ByVal value As String)
			xValue = value
		End Set
	End Property
	Public Sub reverse()
		xValue = StrReverse(xValue)

	End Sub

	Public Sub display()
		MsgBox(xValue)

	End Sub
End Class


dan aanroepen met
Visual Basic Code:
Public Class Form1

	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
		Dim textobject As New Class1
		textobject.x = "bo the cat"
		textobject.display()
		textobject.reverse()
		textobject.display()

	End Sub
End Class



Zulke weg om die string te kunnen omzetten
groetjes

#25 Vozzie

Vozzie

    Moderator

  • Leden
  • PipPipPipPipPipPipPip
  • 1855 berichten
    Laatst bezocht 12 jul 2017 13:15
Inzender

Geplaatst op 12 november 2010 - 15:48

Hallo,

pluto zei:

Zulke weg om die string te kunnen omzetten

Maar wel netjes,...


Om classes echt structureel te gebruiken bestudeer je best Design patterns... Zie: http://en.wikipedia....mputer_science)

Let wel op voor ziektes als singletonitis of staticitis(shareditis)  :mrgreen:

Groeten

#26 pluto

pluto

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 663 berichten
    Laatst bezocht 28 jan 2018 21:10

Geplaatst op 12 november 2010 - 22:34

thx voor de tip Vozzie, maar ik kan geen weg met het engels. (is ook al een probleem met de boeken van vb 2010 nog zeer weinig in het nederlands nu.)

groetjes

#27 Swets

Swets

    Professional Developer

  • Leden
  • PipPipPipPip
  • 367 berichten
    Laatst bezocht 22 feb 2018 16:36
  • LocatieKrimpen a/d IJssel

Geplaatst op 12 november 2010 - 22:47

pluto zei:

Dag Swets ja klassen begrijp ik ook niet hoor.  En wat het nut er van is nog minder  ik geef een vb

Visual Basic Code:
Public Class Class1
	Private xValue As String


	Public Property x() As String
		Get
			Return xValue
		End Get
		Set(ByVal value As String)
			xValue = value
		End Set
	End Property
	Public Sub reverse()
		xValue = StrReverse(xValue)

	End Sub

	Public Sub display()
		MsgBox(xValue)

	End Sub
End Class


dan aanroepen met
Visual Basic Code:
Public Class Form1

	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
		Dim textobject As New Class1
		textobject.x = "bo the cat"
		textobject.display()
		textobject.reverse()
		textobject.display()

	End Sub
End Class



Zulke weg om die string te kunnen omzetten
groetjes

sterker nog , ik snap helemaal niet wat het doet...?  
kan iemand dat uit leggen... waarom dit netjes is?

#28 Vozzie

Vozzie

    Moderator

  • Leden
  • PipPipPipPipPipPipPip
  • 1855 berichten
    Laatst bezocht 12 jul 2017 13:15
Inzender

Geplaatst op 12 november 2010 - 23:17

Hallo,

Mja, je neemt het nogal letterlijk, zo specifiek netjes was het niet. Ik bedoelde maar, "het was al een manier van een programma indelen in  logische objecten...(eenheden)." Dit geval zou al veel beter geweest zijn mocht zijn class ook een toepasselijke naam gehad hebben. Zoals "StringReverser" ofzo,...

Dat kan met modules ook maar met classes hebbenveel meer mogelijkheden. Zoals abstracte classes, overerving,... Eigenschappen als "properties" en functies als "methods"... Etc

Een ander groot verschil met modules is dat je instanties van classes kunt maken. Deze instantie heet dan een object.

Dim instantie = New ClassSomething


Groeten

#29 josk79

josk79

    Master Developer

  • Leden
  • PipPipPipPipPip
  • 614 berichten
    Laatst bezocht 16 aug 2018 17:25

Geplaatst op 13 november 2010 - 00:34

Swets,

ik zag op je site dat je PLC programmeur bent. Nou ben ik dat ook dus kan ik klasses misschien op deze manier uitleggen:

Stel je hebt een proces met diverse kleppen met opensturing en open/dicht terugmelding . Je zou voor al deze kleppen losse stukjes code of een subroutine kunnen schrijven maar het mooiste is door een klasse/addon-instructie/functieblok te maken waarin de klepsturing in is gedefinieerd en deze gebruiken. In VB zou een klepklasse er bijv. zo uit kunnen zien:

Omschrijving:

Gebruik Klep.StuurOpen() om de klep te openen
Gebruik Klep.StuurDicht() om de klep te sluiten
Klep.O_Open is de output om de klep open te sturen
Koppel de open terugmelding aan Klep.I_Open
Koppel de dicht terugmelding aan Klep.I_Dicht
Wanneer de terugmelding gedurende 5 sec niet klopt wordt Klep.KlepstandTimeout hoog!

Wanneer KlepStandTimeout wijzigt of O_Open wijzigt, wordt een event geraised zodat het programme erop kan reageren.

Visual Basic Code:
Class KlepSturing
	Public Event onchange_O_Open() ' Event dat wordt aangeroepen wanneer O_Open veranderd
	Public Event onchange_KlepstandTimeout() ' Event dat wordt aangeroepen als niet binnen x-tijd de terugmelding klopt

	Public I_Open As Boolean   ' Klepstand openmelding
	Public I_Dicht As Boolean  ' Klepstand dichtmelding

	Private WithEvents tmr As New Timer ' Timer om iedere 100msec de klepstand te controleren
	Private sw As New Stopwatch ' Stopwatch om klepstand timeout te controleren

	Sub New()
		tmr.Interval = 100
		tmr.Start()
	End Sub

	Private _O_Open As Boolean
	Private Sub Set_O_Open(ByVal value As Boolean)
		' Setter om O_Open aan te passen en een event te raisen als
		' de waarde is veranderd
		If O_Open = value Then Exit Sub
		_O_Open = value
		RaiseEvent onchange_O_Open()
	End Sub
	Public ReadOnly Property O_Open() As Boolean 'Klep opensturen
		' Deze property is readonly, dus men kan niet zeggen Klep.O_Open = True
		' Hiervoor dient men StuurOpen en StuurDicht te gebruiken
		Get
			Return _O_Open
		End Get
	End Property

	Private _KlepstandTimeout As Boolean
	Private Sub Set_KlepstandTimeout(ByVal value As Boolean)
		' Setter om KlepstandTimeout aan te passen en een event te raisen als
		' de waarde is veranderd
		If _KlepstandTimeout = value Then Exit Sub
		_KlepstandTimeout = value
		RaiseEvent onchange_KlepstandTimeout()
	End Sub
	Public ReadOnly Property KlepstandTimeout() As Boolean
		' Deze property is readonly, dus kan niet buiten het object
		' worden aangepast
		Get
			Return _KlepstandTimeout
		End Get
	End Property

	Public Sub StuurOpen() 'Klep opensturen
		Set_O_Open(True)
	End Sub

	Public Sub StuurDicht() 'Klep dichtsturen
		Set_O_Open(False)
	End Sub

	Public Function KlepstandOk() As Boolean
		' Controleer of de terugmelding
		If O_Open And I_Open And Not I_Dicht _
		OrElse Not O_Open And Not I_Open And I_Dicht Then
			' De klepstand komt overeen met de uitsturing
			Return True
		Else
			' De klepstand komt niet overeen met de uitsturing
			Return False
		End If
	End Function

	Private Sub tmr_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmr.Tick
		' Controleer iedere 100mSec de klepstand
		If Not KlepstandOk() Then
			' Start de stopwatch als de klepstand niet juist is
			If Not sw.IsRunning Then
				sw.Reset()
				sw.Start()
			End If
		Else
			' Stop de stopwatch als de klepstand juist is
			sw.Stop()
		End If
		' Loopt de stopwatch 5 sec? dan klepstandtimeout
		If sw.IsRunning AndAlso sw.ElapsedMilliseconds > 5000 Then
			Set_KlepstandTimeout(True)
		Else
			Set_KlepstandTimeout(False)
		End If
	End Sub
End Class


Form om het te testen:

Visual Basic Code:
Public Class Form1
	Dim WithEvents klep1 As KlepSturing = New KlepSturing

	Dim WithEvents chkO_Open As CheckBox
	Dim WithEvents chkI_Open As CheckBox
	Dim WithEvents chkI_Dicht As CheckBox
	Dim WithEvents chkFoutstandTimeout As CheckBox
	Dim WithEvents butStuurOpen As Button
	Dim WithEvents butStuurDicht As Button

	Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
		' Controls toevoegen aan form
		chkO_Open = New CheckBox
		chkO_Open.Text = "O_Open (klep wordt opengestuurd)"
		chkO_Open.Enabled = False
		Me.Controls.Add(chkO_Open)
		chkI_Open = New CheckBox
		chkI_Open.Text = "I_Open (klep is open terugmelding)"
		Me.Controls.Add(chkI_Open)
		chkI_Dicht = New CheckBox
		chkI_Dicht.Text = "I_Dicht (klep is dicht terugmelding)"
		Me.Controls.Add(chkI_Dicht)
		chkI_Dicht.Checked = True 'Simuleer terugmelding dicht
		chkFoutstandTimeout = New CheckBox
		chkFoutstandTimeout.Text = "Foutstand timeout (5sec)"
		chkFoutstandTimeout.Enabled = False
		Me.Controls.Add(chkFoutstandTimeout)

		butStuurOpen = New Button
		butStuurOpen.Text = "Stuur open"
		Me.Controls.Add(butStuurOpen)
		butStuurDicht = New Button
		butStuurDicht.Text = "Stuur dicht"
		Me.Controls.Add(butStuurDicht)

		' Controls onder elkaar plaatsen
		Dim top As Integer = 20, left As Integer = 20
		For Each Control As Control In Me.Controls
			Control.Size = New Size(400, 40)
			Control.Top = top
			Control.Left = left
			top = Control.Bottom
		Next

	End Sub

	Private Sub butStuurOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butStuurOpen.Click
		' Wanneer gebruiker op "Stuur open" klikt de klep opensturen
		klep1.StuurOpen()
	End Sub

	Private Sub butStuurDicht_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butStuurDicht.Click
		' Wanneer gebruiker op "Stuur dicht" klikt de klep dichtsturen
		klep1.StuurDicht()
	End Sub

	Private Sub klep1_onchange_KlepstandTimeout() Handles klep1.onchange_KlepstandTimeout
		' Wanneer de klepstandtimeout veranderd de checkbox aanpassen aan de nieuwe waarde
		chkFoutstandTimeout.Checked = klep1.KlepstandTimeout
	End Sub

	Private Sub klep1_onchange_O_Open() Handles klep1.onchange_O_Open
		' Wanneer de klep opensturing output wijzigt de checkbox aanpassen aan de nieuwe waarde
		chkO_Open.Checked = klep1.O_Open
	End Sub

	Private Sub chkI_Open_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkI_Open.CheckedChanged
		' Wanneer de gebruiker op de checkbox klikt, de terugmelding simuleren in de klep
		klep1.I_Open = chkI_Open.Checked
	End Sub
	Private Sub chkI_Dicht_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkI_Dicht.CheckedChanged
		' Wanneer de gebruiker op de checkbox klikt, de terugmelding simuleren in de klep
		klep1.I_Dicht = chkI_Dicht.Checked
	End Sub

End Class


Het voordeel van de klasse is dat bepaalde properties van de klep beschermd zijn; ze kunnen niet van buitenaf worden aangepast. Bijvoorbeeld de KlepstandTimeout.

Een onhandige programmeur zou misschien zijn 'probleem op willen lossen' door:

Visual Basic Code:
Klep.KlepstandTimeout = False

te schrijven. Maar dat mag nu dus niet.

In het voorbeeld gebruiken we maar 1 klep, maar door een array te generen, bijv:

dim klep(100) as klepsturing

heb je meteen 100 klepsturingen tot je beschikking.

#30 Swets

Swets

    Professional Developer

  • Leden
  • PipPipPipPip
  • 367 berichten
    Laatst bezocht 22 feb 2018 16:36
  • LocatieKrimpen a/d IJssel

Geplaatst op 13 november 2010 - 23:33

zo begon ik het ook al te zien, ik gebruik in mijn PLC programma's ook diverse zelfgemaakte function blokken...

inderdaad eentje voor het bewaken van klepstanden....   blokje heeft inderdaad als inputjes  de output naar de klep, en 2 eindschakelaar open en dicht... en een tijd...   en uit het blokje komt een fout als het te lang duurt... dus precies zo als je voorbeeld....   en heb ook een blokje om bijvoorbeeld vlotters in te lezen....

dus ja het idee snap ik nu wel,  heb alleen nog wat moeite met de syntax... als ik jouw voorbeelden door kijk,  dan snap ik ze...(echt)... maar nu zelf iets maken... tja dan weet ik ff niet hoe ik beginnen moet...

Ik heb vroeger wel eens OCX gebouwd... en led-uitlezing  dus zo rood getal...(8 die ingekleurd wordt)...
en ik het wel eens een wijzer meter gemaakt....  

dus die dingen zo je tegen woordig bouwen als een klasse...  dan kan je hem daarna tig keer gebruiken?

zelfs via array vullen met data...  iets van  

dim gauge(10) as wijzermeter  ( kan dim gauge.value(10)  ?)

for tel=1 to 10
gauge(tel)=tel*10
next tel

zoiets kan dan?





Ook met taq Led, VB.Net, RS232 voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


Untitled 1

Met dank aan J├╝rgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)