Werte in eigenem Programm anzeigen

Hallo liebe Arduino-Gemeinde,

ich frage mich ob es eine Möglichkeit gibt Werte des Arduino (zb die Temperatur oder ein Signal eines Bewegungssensors) an den PC zu übergeben und diese dort in ein zb selbst geschriebenes C++ oder JavaProgramm zur Weiterverwendung zu implementieren…. Und wenn ja wie? :wink:

Wie Du es erwartest.
Du kannst z.B. auf der seriellen Schnittstelle etwas ausgeben und dann auf dem PC auswerten.

Zum Beispiel:

const byte led = LED_BUILTIN;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(led, OUTPUT);
}

void loop()
{
  heartbeat(500);
}

void heartbeat(uint32_t switchTime)
{
  static uint32_t lastSwitch = 0;
  if (millis() - switchTime >= lastSwitch)
  {
    lastSwitch += switchTime;
    digitalWrite(led, !digitalRead(led));
    Serial.println(digitalRead(led));
  }
}

Du bekommst jetzt auf der seriellen Schnittstelle bei jedem umschalten des blinken eine Meldung.

Baue Dir eine C/C++-Anwendung, die auf dem Seriellen Port horcht.
Dann bekommst ein blinken raus :wink:
(Hinweis: der Serielle Monitor darf nicht mitlaufen)

Ja, gibt es.
Für mehr Infos von uns brauchen wir mehr Input von Dir, was Du genau willst.
Welche Programmiersprache auf dem PC und welche Kenntnisse hast Du darin?

Gruß Tommy

Natürlich kann man mit Java die serielle Schnittstelle auslesen. Dafür gibt es viele Anleitungen im Netz. Gerade im Zusammenhang mit Arduino gibt es auch noch Processing, das auf Java basiert und auf Visualisierung spezialisiert ist.

Ansonsten würde ich eher C# als C++ empfehlen. Aber das hängt auch von den Kenntnissen ab. Sich erst mal in .NET einzuarbeiten ist auch nicht trivial.

Was ist das Haupt-/Nebenziel?

  • Die Nutzung von Kenntnissen in C++ auf dem PC und dem Controller?
  • Das Erlernen einer neuen Programmiersprache auf dem PC?
  • Schnell ein Ergebnis zu erzielen?
  • Eher eine einmalige/seltene Anwendung?

U.U. bietet sich auch Node Red an:

https://nodered.org/docs/getting-started/windows

oder "Processing"

https://processing.org/de/

Ich selbst nutze dafür (von Turbo Pascal kommend über Delphi 1.0 bei FreePascal/Lazarus gelandet) die Lazarus-IDE. Pascal ist zwar nicht en vogue, Lazarus bietet aber sehr viele visuelle und nichtvisuelle Komponenten an, die sich gut einbinden lassen (direkten Datenaustausch mit /Ansteuerung von Office-Anwendungen, Datenbanken, grafische Anzeigen, Textausgaben, Serielle Schnittstellen, TCP/UDP, ...). Alles aber auch bei C++ zu haben ... Das Codieren ist z.T. leicht unterschiedlich, aber der grundsätzliche Weg zum Ziel ist in Sprachen wie objektorientiertem Pascal und C++ weitgehend gleich.

Dass das möglich ist freut mich zu lesen und jetzt hab ich schonmal einpaar Begriffe nach denen ich googeln kann.
Da in euren Antworten die Fragen aufkamen:

1.Meine Kenntnisse im Bereich Java,C++ und der Arduino-Umgebung sind eher die eines „guten Anfängers“

  1. Meine Idee war folgende:
    Auf einem Computer läuft ein Programm in einer beliebigen Programmiersprache welches zb ein Männchen zeigt. Am Computer sind Arduinos angeschlossen welche Daten von verschiedenen Sensoren(Bewegung, Temperatur Helligkeit, Geräusche) an mein Hauptprogramm auf dem PC senden/empfangen. Das Männchen auf dem PC kann nun aufgrund der „Sensordaten“ reagieren zb sich über Helligkeit und Temperatur beschweren, in die Richtung einer detektierten Bewegung schauen uvm

Die Idee einen normalen PC als „Master“ zu nutzen kam mir da eine objektorientierte Programmiersprache eher geeignet scheint mehrere Prozesse zeitgleich abzuarbeiten und auch deutlich mehr Rechenleistung und Speicher mit sich bringt.

Was denkt ihr Fachleute darüber (abgesehen davon dass es für einen Anfänger „to much“ sein könnte) ?

Wie willst Du die Daten von mehreren Arduinos zum PC bringen?
Seriell ist eine Punkt-zu-Punkt-Verbindung, kein Bus.

Evtl. wäre die Übertragung per WLAN mit ESP8266/ESP32 eine Überlegung wert.

Gruß Tommy

Das würde ich auf einen Arduino an einer Seriellen Schnittstelle beschränken.
Diese Serielle Schnittstelle würde dein PC-Programm öffnen und kontrollieren.

Im einfachsten Fall fragt das PC-Programm zyklisch, ob Daten angekommen sind und stellt das Ergebnis passend dar. Eleganter wäre, ereignisgesteuert auf eingehende Daten zu reagieren, aber das ist meist komplizierter zu realisieren und bringt eigentlich/erstmal nicht viel. Vor allem, wenn du dich eher auf die grafische Darstellung (das "Männchen") konzentrieren willst.

Zeichne ein Quadrat auf den Schirm, das schwarz ist, wenn du eine '0' auf dem SerialPort liest , weiß bei einer '1' und mach nichts bei allen anderen Zeichen.
Dann kannst du überlegen, ob du lieber die Nachrichten komplizierter machst (mehrere Zeichen, Zahlenwerte als Text, usw.) oder eher am PC nur das Männchen animierst und alles steuernde dazu auf dem Arduino passend aufbereitest. Oder beides.

Das kommt auf die Programmierumgebung an. In .NET kommt es in etwa auf das gleiche heraus. In beiden Fällen braucht man einen Event Handler. Der hat nur einen anderen Namen. Pollen ist sogar minimal aufwändiger da man noch das Timer Objekt braucht.

An ein ESP hab ich auch schon gedacht. Bisher hatte ich jedoch mit der ganz schlichten USB-Verbindung geblant und bei mehreren Arduinos eben mehrere USB-Ports?

1 Like

Na ja, mit einem Timer Objekt in Windows Forms hat man sowohl direkt Zugriff auf die anderen Forms-Elemente und braucht keinen EventHandler und Delegate. (So hab ich mir jedenfalls früher mal was auf die Schnelle zusammengeschustert)

Ich dachte du willst es einfach haben :wink:

Wenn du WLAN statt USB-Kabel willst, auf jeden Fall. Dann aber gleich eine Web-App, die du mit jedem Händy angucken kannst

Also wünschenswert wäre wenn ich beide Möglichkeiten nutzen könnte zb der PC kann jederzeit beim Arduino nach der Temperatur fragen wenn der Bedarf besteht. Jedoch soll er dagegen auf die Werte eines Bewegungssensort sofort etwas ausführen wenn dieser Werte sendet und nicht erst irgendwann auf Abfrage reagieren.

Wenn du Reaktionszeiten deutlich unter 1 sec willst, solltest du meinen Tip mit dem Timer-Objekt vergessen und dich um Event-Handler in deinem PC-Programm kümmern.

Ok ok das klingt interessant aber ich sollte nichts überstürzen :slight_smile:

Ich werde jetzt erstmal eine Programmiersprache suchen in der ich mein Hauptprogramm für den PC schreibe und dann ist das nächste Ziel einen Arduino über ESP sowie USB miteinander kommunizieren zu lassen. Und dann sehe ich weiter….

Der Timer löst auch nur einen Event aus (Timer.Elapsed)

Bis auf die Sache mit dem Thread-Kontext ist der Code fast identisch. Ich habe schon beides gemacht, weil ich mal Probleme damit hatte dass der Serial Event nicht zuverlässig ausgelöst hat.

Da hast du natürlich recht. Allerdings kann das Timer-Objekt und sein Eventhandler direkt mit den anderen Objekten der Form zusammenspielen, während für ein SerialEvent (jedenfalls in meiner Erinnerung) erst per delegate eine Hilfsfunktion zwischengeschaltet werden muss. Aber wenn man das einmal kapiert hat, ist es natürlich auch einfach.

Das geht auch. Wenn Dein PC aber unter Win läuft - das würfelt die virtuellen COM-Ports gern mal neu aus, was für ein Programm nicht prickelnd ist.
Außerdem hat es oft Probleme mit COMx und x > 9.

Gruß Tommy

Das ist nicht unlösbar.
Habe ich bewiesen.

Wo? Link bitte.

Gruß Tommy