Arduino numericupdown led

  • VB.NET

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von Der Laie.

    So, habe ein wenig vorbereitet.

    Erstmal ein kleines Briefing. Du musst die Magneten bekannt machen, das machst du wie ich es in den Zeilen 10 bis 15 getan habe. Es gibt aber Regeln dafür, wird der Magnet vom Master gesteuert, muss Magnetdata.client_id == -1 sein, wird er von einem I2C clienten gesteuert, nimmst du die zugewiesene Client_ID.

    Wenn das VB-Programm startet, hohlt es einmal die daten der Magneten und du hast eine Auswahl via NumericUpDown, dazu zwei Buttons, einen zum LOW schalten, einen zum HIGH schalten. Im void loop habe ich dir Kommentare hinterlassen, damit du weist was dort zu tun ist.

    Es ist nun noch ein bisschen was zu machen, ich sagte ja ich mach das nicht komplett mache, als erste würde ich den Code für den master fertigstellen und dort rumschalten, danach den 2. arduino ins spiel bringen und den Slave
    code machen wie auch i2c einbauen. Also ist das soweit gemacht, das die Messages zum magnet schalten beim Master ankommen, schalten bzw. weiterleiten und dann schalten noch offen. So jetzt bist du an der Reihe.

    Vergiss nicht den Code hier zu teilen, wenn du fertig bist!!!!!
    "arduino.ino"

    C-Quellcode

    1. //#include <Wire.h> // for i2c
    2. #include "Magnets.h"
    3. const int CLIENT_ID = 8; // der i2c slave
    4. MagnetData magnets[2];
    5. void setup()
    6. {
    7. magnets[0] = MagnetData();
    8. magnets[0].client_id = -1; // -1 wenn der magnet an diesem master arduino ist, sonst die client id des slave
    9. magnets[0].pin_at_client = 6;
    10. magnets[0].state = LOW;
    11. magnets[1] = {CLIENT_ID, 6, LOW};
    12. magnets[1] = {CLIENT_ID, 7, HIGH};
    13. Serial.begin(9600);
    14. Serial.setTimeout(250);
    15. }
    16. void loop()
    17. {
    18. if(Serial.available() > 0)
    19. {
    20. byte buffer[13] = {0};
    21. int readed = Serial.readBytes(buffer, 13);
    22. if(buffer[0] == Commands::GetMagnetData)
    23. {
    24. int magnetsCount = sizeof(magnets) / sizeof(MagnetData);
    25. int sizeTotal = magnetsCount * sizeof(MagnetData);
    26. byte data[sizeTotal + sizeof(int) + sizeof(byte)];
    27. data[0] = Commands::GetMagnetData;
    28. memcpy(&data[1], &magnetsCount, sizeof(int));
    29. memcpy(&data[3], magnets, sizeTotal);
    30. Serial.write(data, sizeTotal + sizeof(int) + sizeof(byte));
    31. }
    32. if(buffer[0] == Commands::UpdateMagnet)
    33. {
    34. UpdateMagnetMessage msg = UpdateMagnetMessage();
    35. memcpy(&msg, buffer, sizeof(UpdateMagnetMessage));
    36. magnets[msg.index].state = msg.newState;
    37. //an die pin-nummer kommst du via magnets[msg.index].pin_at_client egal
    38. //an den neuen Zustand kommst du via magnets[msg.index].newState
    39. // die client_id sieht in der nächsten zeile
    40. if(magnets[msg.index].client_id == -1)
    41. {
    42. //hier am master schalten
    43. char* text = "hier sollst du am master schalten!";
    44. Serial.write(text);
    45. }
    46. else
    47. {
    48. //via i2c zum slave senden und dort schalten , also mit
    49. Wire.write senden, aber in Byteform und auf der gegenseite die bytes
    50. wieder zum struct
    51. char* text = "hier sollst du via i2c zum slave senden und dort schalten!";
    52. Serial.write(text);
    53. }
    54. }
    55. }
    56. }


    "Magnets.h

    C-Quellcode

    1. struct MagnetData
    2. {
    3. int client_id;
    4. int pin_at_client;
    5. int state;
    6. };
    7. struct UpdateMagnetMessage
    8. {
    9. byte command;
    10. int index;
    11. int newState;
    12. };
    13. enum Commands : byte
    14. {
    15. GetMagnetData = 0,
    16. UpdateMagnet = 1
    17. };

    und die VB.net-App
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Runtime.InteropServices
    3. Public Class Form1
    4. Private Magnets As New List(Of MagnetData)
    5. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. SerialPort1.Open()
    7. SendGetMagnetData()
    8. End Sub
    9. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    10. If SerialPort1.IsOpen Then
    11. SerialPort1.Close()
    12. End If
    13. SerialPort1.Dispose()
    14. End Sub
    15. Private Sub SerialPort1_DataReceived(sender As Object, e As
    16. IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    17. If SerialPort1.BaseStream.CanRead Then
    18. Dim buffer(SerialPort1.BytesToRead - 1) As Byte
    19. SerialPort1.Read(buffer, 0, SerialPort1.BytesToRead)
    20. Select Case buffer(0)
    21. Case Commands.GetMagnetData
    22. Magnets.Clear()
    23. Dim magnetsCount = BitConverter.ToInt16(buffer, 1)
    24. For i = 0 To magnetsCount - 1
    25. Dim ptr As IntPtr = Marshal.AllocHGlobal(6)
    26. Marshal.Copy(buffer, 3 + (i * Marshal.SizeOf(Of MagnetData)), ptr, Marshal.SizeOf(Of MagnetData))
    27. Dim data As MagnetData = DirectCast(Marshal.PtrToStructure(ptr, GetType(MagnetData)), MagnetData)
    28. Marshal.FreeHGlobal(ptr)
    29. Magnets.Add(data)
    30. Next
    31. BeginInvoke(Sub()
    32. NudMagnets.Enabled = Magnets.Count > 0
    33. BtnSetMagnetHigh.Enabled = Magnets.Count > 0
    34. BtnSetMagnetLow.Enabled = Magnets.Count > 0
    35. NudMagnets.Maximum = Magnets.Count - 1
    36. LblMagnetInfo.Text = Magnets(Convert.ToInt32(NudMagnets.Value)).ToString()
    37. End Sub)
    38. Case Else
    39. Debug.WriteLine(System.Text.Encoding.ASCII.GetString(buffer, 0, buffer.Length))
    40. End Select
    41. End If
    42. End Sub
    43. Private Sub SendUpdateMagnet(high As Boolean)
    44. If SerialPort1.IsOpen Then
    45. Dim msg As New MagnetMessage
    46. msg.Command = 1
    47. msg.Index = Convert.ToInt16(NudMagnets.Value)
    48. msg.NewState = If(high, Convert.ToInt16(1), Convert.ToInt16(0))
    49. Dim ptr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(Of MagnetMessage))
    50. Marshal.StructureToPtr(msg, ptr, True)
    51. Dim buffer(Marshal.SizeOf(Of MagnetMessage)) As Byte
    52. Marshal.Copy(ptr, buffer, 0, Marshal.SizeOf(Of MagnetMessage))
    53. Marshal.FreeHGlobal(ptr)
    54. SerialPort1.Write(buffer, 0, buffer.Length)
    55. Dim data As MagnetData = Magnets(msg.Index)
    56. data.state = If(high, Convert.ToInt16(1), Convert.ToInt16(0))
    57. Magnets(msg.Index) = data
    58. End If
    59. End Sub
    60. Private Sub SendGetMagnetData()
    61. If SerialPort1.IsOpen Then
    62. SerialPort1.Write({Commands.GetMagnetData}, 0, 1) 'als bytes senden daher unbedingt diese überladung nehmen
    63. End If
    64. End Sub
    65. Private Sub BtnSetMagnetHigh_Click(sender As Object, e As EventArgs) Handles BtnSetMagnetHigh.Click
    66. SendUpdateMagnet(True)
    67. End Sub
    68. Private Sub BtnSetMagnetLow_Click(sender As Object, e As EventArgs) Handles BtnSetMagnetLow.Click
    69. SendUpdateMagnet(False)
    70. End Sub
    71. Private Sub NudMagnets_ValueChanged(sender As Object, e As EventArgs) Handles NudMagnets.ValueChanged
    72. LblMagnetInfo.Text = Magnets(Convert.ToInt32(NudMagnets.Value)).ToString()
    73. End Sub
    74. End Class
    75. Enum Commands As Byte
    76. GetMagnetData = 0
    77. UpdateMagnet = 1
    78. End Enum
    79. Structure MagnetMessage
    80. Dim Command As Byte
    81. Dim Index As Short
    82. Dim NewState As Short
    83. End Structure
    84. Structure MagnetData
    85. Dim client_id As Short
    86. Dim pin_at_client As Short
    87. Dim state As Short
    88. Public Shadows Function ToString() As String
    89. Return
    90. String.Format("Client_ID:{1}{0}Pin_At_Client{2}{0}State{3}",
    91. Environment.NewLine, client_id, pin_at_client, state)
    92. End Function
    93. End Structure


    Bilder
    • Unbenannt.png

      11,21 kB, 620×329, 42 mal angesehen

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Takafusa“ ()

    Danke erstmal für die schnelle Hilfe, ich wollte diese Software Idee 1:1 übernehmen und dann im Hintergrund die ganzen Befehle einfügen also für den Anwender so einfach wie möglich machen.

    SO siehst meine Vorlage aus
    Bilder
    • Screenshot_20200422-233627_YouTube.jpg

      905,38 kB, 2.220×1.080, 30 mal angesehen
    @Der Laie Takafusa hat dir da doch eine großartige Vorlage geschrieben, du musst nur noch das UI nach deiner Vorlage anpassen und eigene Befehle einfügen.
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Webseite geupdatet schaut nun vorbei ;)
    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    Du hast eine denke ich brauchbare Basis. Ich habe das schon sehr einfach gemacht, gut ich habe die Magneten in der INO Datei definiert und das Array befüllt. Um's den User so einfach wie möglich zu machen, kannst du in der VB.Net Anwendung einen Dialog(Form) anlegen zum hinzufügen von Magneten(in einer Datei speichern, beim laden einlesen), alles dann zum Master senden und verarbeiten.

    Hast du den Code schon erweitert?
    Wenn du das getan hast sollte dir aufgefallen sein, das Daten von der VB-App gelesen wie auch gesendet werden, auf beiden Seiten ist zu sehen wie ich aus dem Bytestrom wieder Strukturen gemacht hab und auch umgekehrt. Das bedeutet, dort sind die absoluten Grundlagen für dein Projekt schon vorhanden(in Form von BeispielCode). Ausnahme ist die I2C übertragung, wenn du da hilfe brauchst, kannst du sie bekommen, aber von mir kommt die erst wenn du dich dafür qualifiziert hast, indem du den Code ausbaust. Ob du nun die Magneten(Die Daten dafür in den Programmen) in der ino Datei oder in deiner VB-Net Anwendung erstellst ist egal, du hast eine Basis, eine m.M.n. gute Kommunikation zwischen Master und VB-App.

    Wo liegt jetzt dein Problem?
    Hast du den Code denn auch zum laufen bekommen?
    Wie ist dein jetziger Stand?

    Noch eine Frage, ist dir klar warum ich in der VB-Net anwendung Short genommen hab und auf'm Arduino int?

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

    Ihr macht euch hier die Mühe und liefert dem TE Code, dabei habe ich noch keine Eigenleistung von ihm gesehen. Außer unverständliche Beschreibungen und dubiose Bilder aus dem Netz kommt von seiner Seite nichts. Ich wette das er den Code überhaupt nicht versteht, geschweige denn irgendwelche Grundlagen.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Na wie dem auch sei. Ich glaube dir nicht, ist nicht dein erster Beitrag der so verläuft. Bei mir jedenfalls bist du nun auf der Liste der ignorierten Leute. Viel Erfolg noch.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Die ursprüngliche Frage scheint nun wieder in den Hintergrund gerückt zu sein.
    Könntest du dich nicht mal auf deine eigentliche Frage konzentrieren? :|
    Wie siehts denn nun aus mit deiner Software? Was wurde aus dem Code von Takafusa?
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Webseite geupdatet schaut nun vorbei ;)
    Für VB.NET Entwickler: Option Strict On nicht vergessen!