GUI-Graphic User Interface

Hallo zsm
Ist es möglich ein programm zu schreiben welches einen UNO seriell anspricht wenn ich mit der maus auf ein vorgegebenes Feld klicke (eins von 10) schickt der PC an den uno einen befehl?
Wahrsceinlich ist dies möglich ich bräuchte nur hilfe da ich mich da nicht so gut auskenne

Hallo,

Du mußt Dir nur ein passendes Protokoll ausdenken. Lies auch mal hier.

http://forum.arduino.cc/index.php?topic=327351.0

http://forum.arduino.cc/index.php?topic=287398.0

Kannst du irgendeine Programmiersprache und ein Framework mit dem ein GUI erstellen kann? Wenn nicht musst du erst mal da ansetzen.

Man muss ja nicht alles selbst machen, hier hast du auch einige Möglichkeiten:
http://www.serialcominstruments.com/

Hallo,

ist ja cool :slight_smile:

ich hatte eher an was einfaches gedacht!

wie

"LED 1"... -8 "Reset" und "ALL ON"

also insgesammt 10 Buttons und wenn ich mit der Maus drauf klicke sendet der eine zahlenkombination

Das alles im Prinzip kein Problem. Aber du bist schon zu weit. An welche Programmiersprache und Umgebung hast du gedacht? C#/.NET? C++/.NET? Java? Delphi? C++/Qt? Python? Visual Basic? Irgendwas musst du können oder lernen.

Processing ist vielleicht eine Möglichkeit. Das ist von der API her an den Arduino angelehnt. Daher wäre der Einstieg einfach, aber letztlich ist es Java mit einer eigenen API.

Dann sendet man einen String und parst ihn auf dem Arduino. Am einfachsten erst mal komplett einlesen. Und dann mit strcmp() vergleichen. Bei "LED" kann man erst mal die ersten 3 Zeichen mit strncmp() vergleichen und dann alles dahinter in einen Integer wandeln. So muss man die Abfrage nicht zig mal machen.

Wobei man hier auch einfach Zahlen von 0 bis n senden und jeder Zahl ein Kommando zuordnen kann. Macht das ganze einfacher.

Oder was schön ist wenn man relativ wenige Kommandos hat: nur einen Buchstaben für das Kommando an sich nehmen. Dann kann man nämlich einfach switch/case auf das erste Zeichen machen. z.B. "L1", "L2" für LEDs. Oder wenn man eine Temperatur übertragen möchte z.B. "T23.5".

Aber wie gesagt musst du erst mal wissen in was du dein GUI programmieren willst. Das hängt von deinen vorhanden Kenntnissen ab und ist auch etwas Geschmackssache.

ich besitze geringe java und c kentnisse
aber processing hört sich für den anfang leichter an kannst du mir seiten o.ä. empfehlen?

Google hat dazu sehr sehr viele Seiten.
zB. Connecting Arduino to Processing - SparkFun Learn

Ob es einfacher ist, Processing zu nutzen, kann ich nicht sagen. Wenn du von keiner der Sprachen eine gewissen Ahnung hast, würde ich mir überlegen, das gance mit C# zu lösen (Visual Studio). Da haste auch gleich eine IDE zur Verfügung, die GUI Bausteine zur Verfügung stellt. Lediglich der Code dahinter muss dann doch noch etwas selber angepasst/geschrieben werden.

Ohne längere Einarbeitungszeit wird aber keine Sprache einfach sein.

ok danke für die tipps und antworten

Zu C#/.NET gibt es auch von Microsoft jede Menge Beispiel Code auf MSDN. Zwar für Konsolen Anwendungen und nicht für GUIs, aber das lässt sich leicht übertragen. Das ist wirklich sehr gut dokumentiert. Und auch sonst gibt es im Netz viel Code. Aber wie auf dem Arduino bedeutet das nicht, dass du einfach nur Zeug kopieren kannst.

Das habe ich auf meinem "Notizzettel" unter "Arduino - Steuern, regeln, Werte grafisch darstellen".
Wenn du nicht (oder nur wenig) selbst programmieren willst, ist vielleicht was für dich dabei.

Arduino Graph
mit Processing oder Max/MSP (V5): arduino.cc/en/tutorial/Graph

Proview
Open Source Software unter Linux. Arbeitet auch mit Arduino zusammen.
proview.se

Windows Forms
Programmierschnittstelle zur Erstellung graphischer Benutzeroberflächen. Teil des Microsoft .NET Frameworks, bietet Zugriff auf Elemente zur Erstellung von Microsoft-Windows-Benutzeroberflächen.
Wikipedia: Windows Forms

KODA FromDesigner
A standalone application that was developed to help creating forms (GUIs) for AutoIt3 scripting language.
koda.darkhost.ru

SerialComInstruments
Daten von der seriellen Schnittstelle einfach visualisieren und einen µC steuern.
Sofort einsatzbereit ohne grossen Overhead und Einarbeitung.
serialcominstruments.com/instrument.php
Doku.pdf

Arduino Dashboard
Ein PC Frontend für den Arduino. Messwerte graphisch anzeigen und Pinstatus mit der Maus kontrollieren.
mathias-wilhelm.de: arduino-dashboard

Simplot
Ein einfaches Plotting-Tool für Windows. Es verarbeitet bis zu 4 Kanäle, mit 16bit Zahlen, über die serielle Schnittstelle.
www.negtronics.com/simplot

Auch mit JAVA kann natürlich auf die serielle Schnittstelle zugegriffen werden:
Serielle Schnittstelle unter Java
forum.arduino.cc: topic=316421

Python
Beispiel für ein Python-GUI-Programm
Python ohne GUI
Webserver mit Python (EzScrn)

Hier mal eine einfache Version wie man das in C# machen kann. Enthält Buttons für 4 LEDs, alle an und alle aus.
Die .exe ist in ...\ArduinoGUI\ArduinoGUI\bin\Debug. Dadurch kann man das auch ohne VS ausführen solange das .NET Framework installiert ist

Es sind zwei Parser vorhanden. MODE0 sendet längere Strings wie "allon" und "allof". MODE1 kürzt das ab und sendet nur "o" für "alle an" und "x" für "alle aus". Das macht die Verarbeitung etwas schöner.
Es ist auch eine Eingabe-Zeile vorhanden um die Kommandos per Hand einzutippen

Der Modus wird auf beiden Seiten mit einem #define im Code ausgewählt.

Der ganze Serial Kram ist einer eigenen Klasse die wiederverwendbar ist. Man muss nur eine Callback Funktion für die Anzeige schreiben (die unbedingt Invoke verwenden muss! Das geht analog auch mit allen anderen Komponenten).
Das ist wenn man überhaupt Rückmeldungen möchte. Man kann da auch beim Erstellen des Serial Objekts "null" als Parameter übergeben. Dann kann man trotzdem Daten vom PC an den Arduino senden. Es sind auch getrennte Callbacks für Daten und Fehlermeldungen möglich. Oder man nimmt nur die Daten und gibt keine Fehlermeldungen aus (d.h. null für den Error Callback).

Strings vom Arduino zum PC müssen mit CR + LF abgeschlossen werden! Also bei println() ist ein String zu Ende. Vom PC zum Arduino würde theoretisch eines von beiden reichen.

Die automatische Erkennung des Com Ports sollte mit allen Standard Arduinos funktionieren. Mit alternativen USB/seriell-Wandlern wird es allerdings nicht gehen, da sich diese nicht als "Arduino" ausgeben. Man kann es aber auch per Hand auswählen.

Die Baudrate steht beim Start immer auf 9600. Man kann das auch so machen, dass solche Einstellungen bei Programm-Ende abgespeichert werden und am Anfang wieder aufgerufen werden. Das habe ich aber mal weggelassen.

ArduinoGUI.zip (71.1 KB)

ArduinoProg.ino (2.21 KB)

Danke deine Beispiel hat mir sehr geholfen wie bekomme ich jedoch die funktion von hier "Channel 1 -4" auf "Channel 5-8 + buzzer/signal übertragen" (befehl senden/roter hintergrund)

Auf grund der überschreitung von 1Mb zum download aus meiner Dropbox

MrProgrammer:
Danke deine Beispiel hat mir sehr geholfen wie bekomme ich jedoch die funktion von hier "Channel 1 -4" auf "Channel 5-8 + buzzer/signal übertragen" (befehl senden/roter hintergrund)

Verstehst du was Event Handler sind und wie man die einer Komponente zuordnet? Normalerweise erstellt der GUI Editor für jede Komponente einen eigenen Click Event Handler wenn man darauf drückt. Das ist für völlig getrennte Sachen ok. Da kann man bei jedem Klick eine andere Funktion ausführen. Siehe "all on" oder "all off"

Bei den LEDs nehme ich aber für alle LEDs den gleichen Event Handler. Das vereinfacht den Code, da man nicht ständig das Gleiche machen muss.
Dazu habe ich am Anfang eine Liste mit den LED Buttons angelegt.

Das wird dann hier ausgewertet:

_serial.Write(led_buttons.IndexOf(button).ToString())

led_buttons ist die Liste. Dann übergibt man das Button Objekt das den Event auslöst an IndexOf(). Dadurch bekommt man den Index der LED in der Liste. Der Index entspricht hier der LED Nummer von 0 bis n.

Wenn du mehr LED Buttons hast musst du also nur die Buttons zur Liste hinzufügen und den Event Handler an den Button anhängen (das geht per Code, aber einfacher ist es über das Properties Menü des Buttons und dann auf die Event Handler (das Blitz Symbol) und dort den Click Event). Der Rest des Codes skaliert dann beliebig. Auch auf Arduino Seite.

Für einen Buzzer nimmt du dann einen eigenen Event Handler. Der wird auch automatisch erzeugt wenn du im Editor doppelt auf den Button klickst. Der Befehl kann dann "buzzer" oder "b" sein, je nachdem welche Variante du hast

EDIT:
Ok, sich sehe mir gerade den Code an. Die Liste ist nur für die LED Knöpfe. Der Buzzer gehört da nicht rein. Klick doppelt auf den Buzzer Button. Dann wird ein Event Handler für den erstellt.

Und bei den zusätzlichen LED Buttons fehlt die Zuordnung zum button_led_Click() Handler. Wie gesagt rechts-klick auf den Button -> Properties (oder einfacher ist es sowieso du dockst das Properties Fenster permanent rechts an, dann muss man nur die Komponente auswählen) -> Blitz Symbol -> Action -> Klick -> Namen des Event Handlers da rein kopieren oder bei Dropdown Menü auswählen

Eine Alternative zu der Liste wäre die LED Nummer aus dem Titel Text des Buttons zu extrahieren :slight_smile:

Du schaffst hier übrigens locker Baudraten von 250.000 oder 500.000. Muss hier natürlich nicht so schnell sein, bei den paar Bytes, aber du bist nicht auf das festgelegt was der normale Serial Monitor macht.

Auf der Arduino Seite würde es sich anbieten wenn du deine LED Pins in ein Array packst. Dann kannst du da über die Nummer die du vom Parser bekommst direkt auf die Pin Nummer zugreifen.

Hier mal deine Version ausgebessert

Den Code für das ändern der Farbe und ob "0" oder "1" für aus/an gesendet wird habe ich in eine eigene Funktion ausgelagert. Dadurch kann man das an mehreren Stellen verwenden.

Enthält auch Verbesserungen beim Öffnen der seriellen Verbindung. Da waren noch ein, zwei Bugs wenn keine Schnittstelle oder Baudrate ausgewählt war. Standardmäßig wird jetzt mal 9600 Baud genommen

Oder eine andere Option:
Man nimmt doch den gleichen Event Handler und fragt aber welcher Knopf gedrückt wurde (object sender ist das Objekt das den Event ausgelöst hat). Wie so oft gibt es da viele Möglichkeiten.

Wie hast du es eigentlich geschafft das plötzlich auf mehrere MB aufzublähen? :o

Auch mal den Code aufgeräumt. Wenn du Komponenten entfernst, solltest du auch den Code für die Event Handler entfernen

ArduinoProg.ino (1.6 KB)

ArduinoGUI.zip (80.8 KB)

Das wichtigste fehlt hier, openHAB!

Danke hab es jetzt verstanden gibt es die möglichkeit einen usb rs232 converter zu nutzen?

Sorry dass ich so viel frqage ich bin im bereich arduino zimlich fitt aber kann am/fürn pc nicht wirklich viel coden

Von der Übertragung her geht es. Aber es ist wahrscheinlich dass er mit der Variante nicht in der Com Port Liste auftaucht. Keine Ahnung wieso. Das ist etwas seltsam.

Es gibt aber eine einfache Alternative über die normale SerialPort Klasse:

GetPortNames() liefert dir ein String Array mit den Com Ports. Und zwar direkt das "COM1", "COM2", etc. das man auch an Open() übergeben muss. Das kannst du dann direkt in die ListBox eintragen

private void GetComPorts()
{
  string[] ports = SerialPort.GetPortNames();
  comPortSelect.Items.AddRange(ports);
}

Danach musst du halt den Port per Hand auswählen. Und es steht nicht dabei was es ist

Mann kann aber auch beides kombinieren (das hatte ich weggelassen um dich nicht noch mehr zu verwirren):

private void GetComPorts()
{
  string[] portnames = SerialPort.GetPortNames();
  var instances = new ManagementClass("Win32_SerialPort").GetInstances();

  foreach (string port in portnames)
  {
     string devicename = "";
     foreach (var instance in instances)
     {
       string description = instance["Description"].ToString();
       string id = instance["DeviceID"].ToString();

       if (description != "Communications Port" && id == port)
         devicename = " - " + description;
     } 
     comPortSelect.Items.Add(port + devicename);
  }

  Object selectedItem = null;
  foreach (var item in comPortSelect.Items)
  {
     if (item.ToString().Contains("Arduino"))
       selectedItem = item;
  }

  if (selectedItem != null)
     comPortSelect.SelectedItem = selectedItem;
}

Das macht beides und wenn ein Device nicht über ManagementClass gefunden werden kann, dann wird er doch über die Serial Klasse gefunden. Aber er wird dann auch nicht automatisch als Arduino erkannt.
Ich weiß aber nicht 100%ig ob das so mit allen Arduinos und Serial Adaptern geht. Aber es geht für das was ich habe. Es kann sein dass die Abfrage auf "!= Communications Port" nur bei mir so ist. Das habe ich unterdrückt, weil es nichtssagend ist. Du kannst du Abfrage mal testweise weglassen