Arduino Taster steuert Bildchen in VB.net

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Lennart.

    Arduino Taster steuert Bildchen in VB.net

    Hallo am SonntagAbend!
    Ich kämpfe noch immer seit 2 Wochen (jeden Abend mehrere Stunden) mit folgendem Problem:
    Mein Ardu Progi sendet mir bei Tastendruck eine 1, drücke ich nochmals den gleichen Taster, sendet er eine 2, dann wieder 1,wieder2,1,2,1,2. Immer so fort..
    Sieht so aus: (auszugsweise)

    C-Quellcode

    1. char str1[] = "1"; //Text für Taste1 bei 1.Druck
    2. char str2[] = "2"; //Text für Taste1 bei 2.Druck
    3. // die Übertragung dann :
    4. Serial.println(str1);
    5. // oder
    6. Serial.println(str2);

    Am Serial-Monitor kommt 1,2,1,2 eben immer wenn die Taste gedrückt wird.


    Ich möchte in meinem VB-Prog 2 Bilder korrespondierend zum Tastendruck per z.B.

    beim 1 Tastendruck (wenn "1" gesendet wird)

    VB.NET-Quellcode

    1. Bild1.Visible = True
    2. Bild2.Visible = False


    darstellen, beim erneuten Tastendruck (wenn "2" gesendet wird) dann umgekehrt

    VB.NET-Quellcode

    1. Bild1.Visible = False
    2. Bild2.Visible = True

    darstellen.
    Drücke ich die Taste zum 3 mal ist es so wie beim 1 mal usw...

    Ich bekomms einfach nicht geregelt, deshalb die BITTE an Euch mir zu helfen.

    Danke!!!!
    Lennart, aus dem winterlichen NiederÖsterreich

    Code-Tags eingefügt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Viele Wege führen zum Brom:

    VB.NET-Quellcode

    1. Private Sub ChangePictures(IncomingSign As Integer) 'muss immer dann aufgerufen werden, wenn am Serial-Monitor was ankommt
    2. Bild1.visible = (IncomingSign = 1)
    3. Bild2.visible = (IncomingSign = 2)
    4. End Sub

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Lennart schrieb:

    einen regelmäßigen Aufruf
    Da ziehst Du Dir nen Timer auf das GUI, gibst ihm ein sinnvollen Intervall (in Millisekunden), sendest im Takt Deine Anfrage und / oder holst den Zustand und feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @Lennart
    Ich schleime mich auch mal ein:

    Du könntest, wenn ich jetzt nicht alles falsch verstehe. Und du die die Interruptpins noch frei hast, einfach am Arduino einen Interrupt anlegen.
    Sprich du hängst einfach einen Interrupt mit attachInterrupt(xy, (void-pointer), RISING)( an und in deinem Programm reagiertst du auf das SerialPort.DataReceived Event.
    So kannst du dir den Timer sparen und (genaugenommen) effizienter arbeiten, denn der Interrupt am Arduino wird auch dann ausgelößt während in der loop() irgendetwas von statten geht.

    Sollte das zu kompliziert klingen, es ist relativ einfach, einfacher als Socketprogrammierung jedenfalls *hust*.
    Du kannst natürlich auch das machen was @RodFromGermany sagt.

    Lennart schrieb:

    char str1[] = "1"; //Text für Taste1 bei 1.Druck
    char str2[] = "2"; //Text für Taste1 bei 2.Druck


    Mhh, warum legst du für einen einzelnen Char ein Array an? Du kannst einfach ein char oder direkt ein byte verschicken!

    Grüße aus dem schönen SchwabeLändle
    Falsdudichfragstwarumdudaslesenkannstobwohlalleszusammenstehtdannwirstdumerkendasdu
    eingehirnbesizt.
    Achja, eine MsgBox macht man mit MessageBox.show(....) und nicht MsgBox(....)
    @Lennart
    Solltest du dich für den Interrupt entscheiden, baue aber eine delay() von mindestens 200ms ein, sonst könnte es probleme mit dem "Bouncing" geben.

    LG
    Falsdudichfragstwarumdudaslesenkannstobwohlalleszusammenstehtdannwirstdumerkendasdu
    eingehirnbesizt.
    Achja, eine MsgBox macht man mit MessageBox.show(....) und nicht MsgBox(....)
    Danke für Eure Hilfe, leider bin ich nicht weitergekommen.
    Nach wie vor ist die Sache so, dass ich bei Tastendruck im "Serial Monitor" von
    Visual Studio bei jedem Tastendruck 1 dann 2 dann 1 dann 2... erhalte.
    Leider sind meine Kenntnisse so gering, das ich meine 2 Bildchen (1 für einen roten Kreis)
    bzw (2 für einen grünen Kreis) in der Form1.vb nicht paralell zum Tastendruck am Arduino umschalten kann.
    Seit Wochen setzte ich mich nun mit den von Euch gut gemeinten
    Tips und Tricks wie "SerialPort.DataReceived" und anderem auseinander, erfolglos.
    Gerlernt habe ich wohl einiges, Tutorials durchwühlt und mitgearbeitet, erfolglos.
    Irgendwie hab ich nun die Freude verloren, und das so knapp vor dem Ziel, dank Euch trotzdem...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Lennart“ ()

    @Lennart Poste mal Deinen Code. Ohne Binaries als ZIP.
    Erweiterte Antwort -> Dateianhänge -> Hochladen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @Lennart Das Projekt war etwas korrupt, aber die Hauptsache war da.
    Probier es mal so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Lennart's1
    2. Imports System.IO
    3. Imports System.IO.Ports
    4. Imports System.Threading
    5. Public Class Gleisstellpult
    6. Dim b As String = ""
    7. Dim umschalterW1 As Boolean
    8. Shared _continue As Boolean
    9. Shared _serialPort As SerialPort
    10. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    11. SerialPort1.Close()
    12. SerialPort1.PortName = "com8"
    13. SerialPort1.BaudRate = 9600
    14. SerialPort1.DataBits = 8
    15. SerialPort1.Parity = Parity.None
    16. SerialPort1.StopBits = StopBits.One
    17. SerialPort1.Handshake = Handshake.None
    18. SerialPort1.Encoding = System.Text.Encoding.Default
    19. SerialPort1.Open()
    20. 'Timer1.Enabled = True
    21. End Sub
    22. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    23. If umschalterW1 = True Then
    24. ROTW1()
    25. Else
    26. GRUENW1()
    27. End If
    28. End Sub
    29. Sub GRUENW1()
    30. System.Threading.Thread.Sleep(150)
    31. umschalterW1 = True
    32. RW1.Visible = True
    33. GW1.Visible = False
    34. 'SerialPort1.Open()
    35. SerialPort1.Write(1)
    36. End Sub
    37. Sub ROTW1()
    38. System.Threading.Thread.Sleep(150)
    39. umschalterW1 = False
    40. RW1.Visible = False
    41. GW1.Visible = True
    42. SerialPort1.Write(2)
    43. 'SerialPort1.Close()
    44. End Sub
    45. 'Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    46. ' Me.b = ReceiveSerialData()
    47. ' RichTextBox1.Text &= Me.b
    48. ' Dim b As String
    49. ' Me.b = b
    50. 'End Sub
    51. 'Function ReceiveSerialData() As String
    52. ' Dim Incoming As String
    53. ' Try
    54. ' Incoming = SerialPort1.ReadExisting()
    55. ' If Incoming Is Nothing Then
    56. ' Return "nothing" & vbCrLf
    57. ' Else
    58. ' Return Incoming
    59. ' End If
    60. ' Catch ex As TimeoutException
    61. ' Return "Error: Serial Port read timed out."
    62. ' End Try
    63. 'End Function
    64. Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    65. Me.AppendText(Me.SerialPort1.ReadExisting())
    66. End Sub
    67. Private Sub AppendText(txt As String)
    68. If Me.InvokeRequired Then
    69. Dim ac = New Action(Of String)(AddressOf AppendText)
    70. Me.Invoke(ac, txt)
    71. Return
    72. End If
    73. Me.b = txt
    74. RichTextBox1.AppendText(txt)
    75. RichTextBox1.AppendText(vbLf)
    76. End Sub
    77. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Schönen Ostermontag Morgen!
    DANKE für Deine Hilfe.
    Ich sehe jetzt in der RichTextBox1 zwar meine
    geliebten 1 und 2en, aber die Ansteuerung der
    beiden PictureBox'en RW1 und GW1 klappen leider nicht.
    Also über den VB Buttun schon, nicht über den Arduino Taster.
    Was habe ich da noch zu tun?

    Lennart schrieb:

    Also über den VB Buttun schon, nicht über den Arduino Taster.
    Was ganz genau soll denn passieren?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Also wenn ich in meiner Form1.vb den Button klicke, geschehen 2 Dinge:
    1: das Bild RW1 wird durch das Bild GW1 ersetzt. Beide Bilder liegen übereinander, funkioniert perfekt.
    2: ich sende dadurch an den Arduino eine 1 und die rote LED leuchtet. bei erneutem Button-Klick
    sende ich eine 2 an den Arduino, die rote LED erlischt, dafür leuchtet eine grüne LED auf.
    Immer so im Wechsel, also das Bild in der Form1.vb ist synchron einer LED am Arduino. Funktioniert perfekt.

    Es soll aber auch umgekehrt funktionieren. Drücke ich am Arduino einen angeschlossenen Taster, so sollen die LED's
    im Wechsel umschalten, funktioniert auch bereits, ABER DAS BILD IN DER FORM1.VB MUSS AUCH UMSCHALTEN.
    Und das gelingt mir nicht. Ich kann aber in der RichTextBox sehen, das mein HardwareTastendruck die 1 oder 2 an VB sendet.
    Diese dort angezeigten 1 oder 2 kommen ja vom Arduino.
    Nur wie setze ich diese 1 oder 2 in den Bilderwechsel um ?
    Bilder
    • IMG_20180402_104437.jpg

      1,28 MB, 4.160×3.120, 21 mal angesehen
    • IMG_20180402_104810.jpg

      1,2 MB, 4.160×3.120, 17 mal angesehen
    • IMG_20180402_104554.jpg

      713,93 kB, 4.160×3.120, 19 mal angesehen

    Lennart schrieb:

    ABER DAS BILD IN DER FORM1.VB MUSS AUCH UMSCHALTEN.
    Dann musst Du den empfangenen Text daraufhin untersuchen und an der GUI die gewünschten Änderungen vornehmen.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub AppendText(txt As String)
    2. If Me.InvokeRequired Then
    3. Dim ac = New Action(Of String)(AddressOf AppendText)
    4. Me.Invoke(ac, txt)
    5. Return
    6. End If
    7. Me.b = txt
    8. RichTextBox1.AppendText(txt)
    9. RichTextBox1.AppendText(vbLf)
    10. If txt.Contains("GRÜN") Then
    11. RW1.Visible = True
    12. GW1.Visible = False
    13. ElseIf txt.Contains("ROT") Then
    14. RW1.Visible = False
    15. GW1.Visible = True
    16. End If
    17. End Sub
    Ersetze "GRÜN" und "ROT" durch die entsprechenden vom Arduino gesendeten Strings.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    ES FUNKTIONIERT :thumbsup:
    Mein Gott, 1000 Dank für Deine Hilfe, jetzt hab ich wieder Power mein Projekt doch fertig zu stellen.
    Ich wollt's im Frust schon begraben und mir fertige Software für mein
    Modelleisenbahn-Projekt kaufen. Schlimm ist nur wenn du ergeizig bist,
    Geduld hast, deine Stärken aber grade nicht dort liegen wo es notwendig ist.
    Danke nochmal, und noch schöne Ostern

    aus dem sonnigen Niederösterreich
    Lennart