VB-Proggi steuert 2 Arduino-LED's

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    VB-Proggi steuert 2 Arduino-LED's

    Liebe Forenmitglieder!

    Möchte mich kurz vorstellen:
    Lennart(schwedisch), 53J, Elektronikbastler seit Philips Baukästen 1972,
    Modellbahner, früher PIC Programmierer über Parsic, Platinenfräser mit
    eigener CNC....., Eagle cad...
    Grundsätzlich ist ja "learning by
    doing" mein ewiges erfolgreiches Motto, jetzt häng ich aber fest und
    möchte um eure Hilfe bitten.

    Ich sitze nun schon seit Tagen und versuche folgendes zu realisieren:
    Kleines VB-Proggi mit 1 Button und 2 kleinen Bildern (Led in rot, Led in grün).
    Klicke ich einmal kurz auf den Button soll das Bild mit der roten Led zu sehen sein, klicke ich
    ein weiteres mal auf den GLEICHEN Button soll das Bild mit der grünen Led sichtbar sein.
    Die Bilder liegen einfach nebeneinander. Soweit funktioniert das alles bereits,ausser das ich 2 Buttons brauche . Code dazu in rot unten...

    Paralell dazu soll am Arduino die rote oder grüne Led leuchten.
    Das Arduino-Proggi habe ich schon: LED 11-rot, Led 12-grün, funktioniert perfekt.
    //Arduino Code:
    // Lennart's1
    void setup() {
    pinMode (11,OUTPUT);
    pinMode (12,OUTPUT);
    Serial.begin(9600);
    }
    void loop() { int val;
    if(Serial.available()){
    while(Serial.available() >0){
    val=Serial.read();
    if(val=='1'){digitalWrite(11,HIGH);digitalWrite (12,LOW);}
    else if (val=='0') {digitalWrite (11,LOW);digitalWrite (12,HIGH);}
    }
    }
    }


    aber nur mehr ein Problem:

    Ich kann nur mit 2 Buttons hin und her schalten, möchte aber nur EINEN Button
    Dazu der VB-CODE:

    'Lennart's1
    Imports System.IO
    Imports System.IO.Ports
    Imports System.Threading

    Public Class Gleisstellpult

    Shared _continue As Boolean
    Shared _serialPort As SerialPort

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    SerialPort1.Close()
    SerialPort1.PortName = "com3" 'change com port to match your Arduino port
    SerialPort1.BaudRate = 9600
    SerialPort1.DataBits = 8
    SerialPort1.Parity = Parity.None
    SerialPort1.StopBits = StopBits.One
    SerialPort1.Handshake = Handshake.None
    SerialPort1.Encoding = System.Text.Encoding.Default
    End Sub

    Private Sub W0001ein_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles W0001ein.Click
    RW1.Visible = True
    GW1.Visible = False
    SerialPort1.Open()
    SerialPort1.Write("1")
    SerialPort1.Close()
    End Sub

    Private Sub W0001aus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles W0001aus.Click
    RW1.Visible = False
    GW1.Visible = True
    SerialPort1.Open()
    SerialPort1.Write("0")
    SerialPort1.Close()
    End Sub
    End Class


    leider eben mit 2 Buttons statt mit 1'em
    Was muss ich verändern, um nur mit einem Butten zurecht zu kommen?

    Hätt ich nicht schon Kopfschmerzen würde ich nicht um Hilfe bitten :cursing:

    Danke für Eure Unterstützung
    Lennart
    @Lennart Willkommen im Forum. :thumbup:
    Zunächst: Die Farbe Rot ist den Moderatoren vorbehalten.
    Es gibt oberhalb des Post-Editors eine Reihe von Button, mit denen Du den selektierten Text im Post formatieren kannst, probier das mal aus.
    Nun zu Deinem Problem:
    Du brauchst ein Flag, das den jeweiligen Zustand speichert:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Flag As Boolean = False
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Button1_Click(Nothing, e) ' Initialzustand herstellen
    5. End Sub
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. Flag = Not Flag
    8. If Flag Then
    9. Label1.Text = "grün"
    10. Label2.Text = ""
    11. Else
    12. Label1.Text = ""
    13. Label2.Text = "rot"
    14. End If
    15. End Sub
    16. 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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo Lennart

    In den beiden Sub's Ein() und Aus() kannst Du Deine Steuerbefehle eintragen.
    Hoffe es hilft Dir.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim umschalter As Boolean
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Aus()
    5. End Sub
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. If umschalter = True Then
    8. Aus()
    9. Else
    10. Ein()
    11. End If
    12. End Sub
    13. Sub Ein()
    14. umschalter = True
    15. Label1.Visible = True
    16. Label2.Visible = False
    17. End Sub
    18. Sub Aus()
    19. umschalter = False
    20. Label1.Visible = False
    21. Label2.Visible = True
    22. End Sub
    23. End Class


    Gruss
    Murmeli81

    So, jetzt fast 2 Wochen später möchte ich kurz berichten.
    Ich bin mit BEIDEN Vorschlägen gut zu Recht gekommen (Habs verstanden und gelernt), mein Programm wächst erfolgreich.
    2 Arduino Mega (COM8+9), viele viele LED's , Relais,........
    Jetzt hab ich noch eine Frage: mit diesem Code (Ausschnitt)

    Quellcode

    1. Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
    2. If umschalterW5 = True Then
    3. ROTW5()
    4. Else
    5. GRUENW5()
    6. End If
    7. End Sub
    8. Sub GRUENW5()
    9. System.Threading.Thread.Sleep(150)
    10. umschalterW5 = True
    11. RW5.Visible = True
    12. GW5.Visible = False
    13. SerialPort2.Open()
    14. SerialPort2.Write("9")
    15. SerialPort2.Close()
    16. End Sub
    17. Sub ROTW5()
    18. System.Threading.Thread.Sleep(150)
    19. umschalterW5 = False
    20. RW5.Visible = False
    21. GW5.Visible = True
    22. SerialPort2.Open()
    23. SerialPort2.Write("A")
    24. SerialPort2.Close()
    25. End Sub


    sende ich einerseits die "9" oder "A" an den Mega zum ansteuern der LED's
    zum Anderen blende ich in meiner Form1.vb die dazupassenden Bildchen ein oder aus. Funktioniert perfekt , Dank EURER Hilfe.
    Ich habe an dem "Pysikalischen" Stellpult ( da sind die LED's eingebaut) auch ein paar Taster, wo ich einen davon wie den z.B. "Button5" verwenden möchte.
    Also egal ob ich in der VB-Anwendung klicke oder am HARDWARE-Taster (Pin z.B. 8) sollen in der VB-Anwendung eben die Bildchen durch True oder False mitarbeiten.

    Wie muss ich das SENDEN von "9" oder "A" retour an die VB-Anwendung organisieren ?
    lG Lennart
    Du musst in erster Linie die Funktion am arduino Programmieren, den hier ist das VB Programm nur zum Empfang der Daten da.
    Als erstes müsstest du schauen was der Arduino per SerialPort sendet, wenn du den Dazugehörigen Button am Terminal drückst. Kommt da ASCII, Bytes oder was auch immer aus dem Arduino heraus.
    Dazu hier einmal einlesen, denn da steht alles drin.
    martyncurrey.com/arduino-and-v…ng-data-from-the-arduino/

    Lennart schrieb:

    VB.NET-Quellcode

    1. SerialPort2.Open()
    2. SerialPort2.Write("9")
    3. SerialPort2.Close()
    Das SerialPort bleibt während der Laufzeit des Programms geöffnet :!:
    Sonst könnte in der zwischenzeit ein anderes Programm das Port claimen.
    ===
    Wieviele Zustände hast Du?
    Mach Dir ein Enum und dort für jeden Zustand ein Item, für den Nicht-Zustand einen extra.
    Du kannst im Hauptprogramm eine Variable dieses Typs anlegen und weist dann immer, was zuletzt passiert ist.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    VIELEN DANK FÜR EURE UNTERSTÜTZUNG!!!!
    Gute Nachricht: Bald alle Wünsche erfüllt, nur noch eins fehlt mir : (und Google hat wohl die Antwort, aber ich steh am Draht)
    Ich habe jetzt weitergearbeitet, und das sieht jetzt so aus: ARDUINO code(Ausschnitt)

    Brainfuck-Quellcode

    1. char str1[] = "rot"; //Text für Taste1 ROT an Software
    2. char str2[] = "gruen"; //Text für Taste1 GRÜN an Software
    3. void loop()
    4. {
    5. //----------------------------------
    6. //HANDSCHALTUNG START---------------
    7. Taste1STATUS = digitalRead(Taste1);
    8. if ((Taste1STATUS == HIGH) && (merker1 == 0))
    9. {
    10. digitalWrite(9, HIGH); digitalWrite(10, LOW); digitalWrite(17, HIGH);
    11. delay(500);
    12. digitalWrite(17, LOW);
    13. merker1 = 1;
    14. delay(Zeit1);
    15. }
    16. if ((Taste1STATUS == LOW) && (merker1 == 1))
    17. {
    18. merker1 = 2;
    19. Serial.println(str1);
    20. delay(Zeit1);
    21. }
    22. if ((Taste1STATUS == HIGH) && (merker1 == 2))
    23. {
    24. digitalWrite(9, LOW); digitalWrite(10, HIGH); digitalWrite(18, HIGH);
    25. delay(500);
    26. digitalWrite(18, LOW);
    27. merker1 = 3;
    28. delay(Zeit1);
    29. }
    30. if ((Taste1STATUS == LOW) && (merker1 == 3))
    31. {
    32. merker1 = 0;
    33. Serial.println(str2);
    34. delay(Zeit1);
    35. }
    36. //HANDSCHALTUNG STOP-----------------------------------
    37. //-----------------------------------------------------


    Das sendet an den PC (kontrolle über den SerialMONITOR) jeweils das Wort "rot" oder "gruen", abwechselnd , immer wenn ich den gleichen Taster betätige.
    Das passt so. Meine Led's machen auch mit.

    jetzt zu VB:
    In meiner "FORM1.vb" liegen 2 Bildchen übereinander, deren Ansicht (Welches ist sichtbar) ich mit True oder False steuere.
    sieht derzeit so aus:

    Brainfuck-Quellcode

    1. 'Lennart's1
    2. Imports System.IO
    3. Imports System.IO.Ports
    4. Imports System.Threading
    5. Public Class Gleisstellpult
    6. Dim umschalterW1 As Boolean
    7. Shared _continue As Boolean
    8. Shared _serialPort As SerialPort
    9. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    10. SerialPort1.Close()
    11. SerialPort1.PortName = "com8" 'an welchem Port ist der 1.Arduino Mega 2560 angeschlossen ?
    12. SerialPort1.BaudRate = 9600
    13. SerialPort1.DataBits = 8
    14. SerialPort1.Parity = Parity.None
    15. SerialPort1.StopBits = StopBits.One
    16. SerialPort1.Handshake = Handshake.None
    17. SerialPort1.Encoding = System.Text.Encoding.Default
    18. End Sub
    19. '-------------------------------------------------------------------------------------
    20. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    21. If umschalterW1 = True Then
    22. ROTW1()
    23. Else
    24. GRUENW1()
    25. End If
    26. End Sub
    27. Sub GRUENW1()
    28. System.Threading.Thread.Sleep(150)
    29. umschalterW1 = True
    30. RW1.Visible = True
    31. GW1.Visible = False
    32. SerialPort1.Open()
    33. SerialPort1.Write("1")
    34. SerialPort1.Close()
    35. End Sub
    36. Sub ROTW1()
    37. System.Threading.Thread.Sleep(150)
    38. umschalterW1 = False
    39. RW1.Visible = False
    40. GW1.Visible = True
    41. SerialPort1.Open()
    42. SerialPort1.Write("2")
    43. SerialPort1.Close()
    44. End Sub
    45. End Class


    Meine Frage nun: Wie muss ich es angehen, das der Terminal-Tastendruck ("rot" oder "gruen" am SerialMonitor)
    die Steuerung der Bildchen übernimmt. Also genau so wie in der .NET?
    DANKE (wie immer)
    Soweit ich mich erinnere hat der SerialPort mehrere *.Read Methoden (MSDN oder IntelliSense helfen weiter)
    Dort wartest du auf das eingehende Signal vom Kontrollpult und handelst dementsprechend.

    Visual Basic-Quellcode

    1. SerialPort1.Open
    2. SerialPort1.Read..(Byte, String was auch immer du brauchst)
    3. If 'Empfangender String = 1 then Picturebox 1.Visible


    Das sollte dir eigentlich einen Denkanstoß geben
    @Lennart Wir arbeiten nicht mit Brainfuck-Quellcode, sondern mit VB.NET-, C#-, C-, C++-Quellcode.
    Formatiere Deinen Code entsprechend.
    Du musst per SerialPort das Signal empfangen, dafür gibt es das SerialPort.ReceivedData-Event.
    Voraussetzung ist natürlich, dass das Port während der gesamtem Programmlaufzeit geöffnet ist.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!