Anfänger braucht Hilfe: Serielle Daten auslesen und weiterverarbeiten

Hallo.

Ich habe folgendes Problem:

Ich hab einen Aquariencomputer, der Daten seriell ausgibt. Hierbei handelt es sich um Live Daten der aktuellen Messwerte (Temperatur, Ph usw...)

Es gibt für diesen Computer ein Interfacekabel, das ich in einen PC stecken kann (RS232) und mit dem vom Hersteller (inzwischen völlig veraltetem) Programm auslesen kann.

Diese Daten möchte ich gerne abgreifen und auf einem Display darstellen. Plan ist folgender:

In die Beckenabdeckung wird ein Display integriert, der Arduino ließt permanent die ausgegebenen Seriellen Daten über die aktuellen Werte mit und projeziert mir diese auf das am Arduino angeschlossenen Display.

Mein Arbeitskollege ist Elektroingenieur, der sagte, mittels Arduino sollte dies ganz einfach lösbar sein, er selbst hat aber keine Zeit, sich momentan damit zu befassen.

Das gab mir den Anreiz, das Ganze selbst in die Hand zu nehmen, da ich eh gerne experimentiere und dies vielleicht ein guter Einstieg in die Arduino Welt ist.

Da ich momentan mit der Hardware da stehe und nicht so recht weiß, wie ich anfangen soll, stelle ich hier nun die Frage, wie so etwas lösbar ist.

Es gab mal einen privaten Anbieter, dier hat genau ein solches Teil fertig betrieben, allerdings nicht mit einem Arduino, sondern mit einer simplen Schaltung und einen Atmel 2313.

Wenn dies möglich ist, diese Daten auszuwerten und ich mich eingearbeitet habe, kann ich das ganze vielleicht noch verfeinern, damit Verlaufskurven o.ä. auf Abruf am Display angezeigt werden. Aber nun will ich erst mal langsam anfangen und

bin für jeden Tipp dankbar, wie ich so etwas angehen kann.

Vielen Dank schon mal

Mit freundlichen Grüßen
Thomas

Achtung:
Bei RS232 brauchst du einen Interface Chip wie den MAX232 oder MAX3232. Du kannst das nicht direkt an den Arduino anschließen!

Am besten du gehst erst mal so vor:
1.) SoftSerial oder vielleicht gleich AltSoftSerial (das ist wesentlich besser!) für die Verbindung zum Gerät nehmen. Oder wenn du einen Mega hast eine dessen anderer Hardware-Schnittstellen
2.) Die Daten die ankommen 1:1 auf das normale Serial umleiten und auf dem seriellen Monitor ansehen. Damit sieht man schon mal was man auswerten muss.

Hier ist eine Funktion um einen String einzulesen, der mit einem CR oder LF abgeschlossen ist
http://forum.arduino.cc/index.php?topic=329469.msg2273780#msg2273780
Ich weiß nicht ob man das bei dir verwenden kann. Es ist sehr wohl möglich, dass das schön Zeilenweise ausgegeben wird. Aber es muss nicht sein.

Wie gesagt erst mal sowas in der Art machen:

if(softSerial.available())
{
   Serial.write(softSerial.read());
}

Dann sieht man weiter.

Sich einen Parser zu schreiben um die ankommenden Daten in Zahlen zu konvertieren ist kein Problem. Das hängt aber vom Format ab.

Nachtrag:
Du kannst das Gerät aber auch erst mal so an den PC anschließen und mit einem Terminal Programm (z.B. HTerm) auslesen um zu sehen was es sagt

hi,

Du kannst das Gerät aber auch erst mal so an den PC anschließen und mit einem Terminal Programm (z.B. HTerm) auslesen um zu sehen was es sagt

würde ich auf jeden fall zuerst machen. Du kannst inHTerm (kostenlos) mit den einstellungen (baudrate, parität, stopbits) herumprobieren, bis Du lesbare daten bekommst.

gruß stefan

Eisebaer:
hi,

würde ich auf jeden fall zuerst machen. Du kannst inHTerm (kostenlos) mit den einstellungen (baudrate, parität, stopbits) herumprobieren, bis Du lesbare daten bekommst.

gruß stefan

Das ist eine gute Idee, das werde ich probieren, ich bin in dieser Hinsicht totaler Noob, also alles Neuland für mich.

Danke schon mal :slight_smile:

hi,

ich bin in dieser Hinsicht totaler Noob, also alles Neuland für mich.

hab' ich garnicht gesehen. also herzlich willkommen im forum.

gruß stefan

Aaaaalso. Ich habe mit hTerm nun etwas rum experimentiert, dabei habe ich meinen Com Anschluss konfiguriert, mit der Baudrate experimentiert. Wenn ich ASCII auswähle, bekomme ich auch meine Messdaten in Reinschrift angezeigt.

Es sind zwar Zeichen und Hyroglyphen dabei, die da nicht hin gehören, aber ich denke, die kann man ausfiltern (?)

Gut finde ich, dass der Computer freiwillig alle 3 Sekunden den Nächsten Messwert ausspuckt, ohne ihn "auffordern" zu müssen. Z.b. erscheint:

Sensor 1: Temperatur: 25,3 º
3 Sekunden warten
Sensor 2: pH 8,12 pH
3 sekunden warten
Sensor 3 Rx 465

usw...

Bei manchen Werten fehlt das Präfix oder die EInheit, aber ich denke, das bekommt man hin, oder?

Im moment habe ich nur den Arduino Uno. Wie hier bereits gepostet wurde, benötige ich noch einen Interface Chip wie den MAX232 oder MAX3232. Benötige ich außer dem Display sonst noch etwas?

Als Display würde mir ein 16 zeichen Display reichen, ich dachte, der Übersicht halber sind 4 zeilen ok, mit 24 bzw.27 Zeichen pro Zeile wäre ich wohl flexibler, was meine Darstellung betrifft.

Worauf kommt es denn beim DIsplay an? Es gibt ja zig verschiedene, die Arduino kompatibel sind... Ich dachte an eins mit weißer Schrift auf blauem Hintergrund, beleuchtet.

Kann ich auch für dieses Vorhaben das Arduino TFT nehmen, oder ein Matrix Display, damit die Darstellung "runder" aussieht? Oder macht das mein Vorhaben gleich wesentlich komplizierter?

Ich frage nun einfach mal ganz frech, ob euch zumindest bezüglich der Einkaufskiste noch etwas einfällt... Netzteile, Kabel, Kleinzeug usw hab ich zu Hause.

Wäre auch super, wenn Ihr mir zum Thema display noch etwas sagen könntet, speziell auf die Frage, welches...

Vielen Dank schon mal

Ok, das sieht sehr gut aus. Das kann man einfach Parsen. Da könnte man mit strstr() nach "Temp" und "pH" suchen (oder "Sensor 1" und "Sensor 2"). Dann addiert man auf den erhaltenen Zeiger so viel dazu dass man beim Anfang der Zahl ist. Dann sollte man vielleicht noch den String beim Leerzeichen danach abschneiden.
Gibt da aber mehrere Optionen.

Nimm als Anfänger erst mal ein 16x2 oder 20x4 Display. TFTs und Grafik Displays sind komplizierter zu handhaben. Wenn du was anderes willst kannst du später immer noch aufrüsten.

Ich würde an deiner Stelle noch versuchen rauszufinden was diese "Hiroglyphen" sind.
Möglicherweise sind die ja doch wichtig um eine dauerhaft stabile Verbindung zu bekommen.

Mal alle Einstellungen für die serielle Schnittstelle durchprobieren und gucken ob diese verschwinden.

Vielleicht sinds irgendwelche Prüfsummen?

Ich werde noch einmal versuchen, an den Einstellungen zu spielen. Da mein Computersystem eigentlich dafür gedacht ist, an einen PC anzuschließen und es auch über den PC zu programmieren, kann es gut sein, dass es irgendwelche Prüfsummen sind, die aber für mich nicht wirklich relevant sind und die ich auch nicht auf dem Display sehen muss.

Besten Dank wuch schon mal.

Eiune Fragen noch zum display: Kann dies jedes beliebige 24X4 oder 27X4 display sein? Muss dies spezielle Eigenschaften haben, um an den Arduino angeschlossen werden zu können? Und wird das dirkt an den Arduino angestöpselt, oder muss hier noch ein Modul o.ö. dazwischen?

Vielen Dank

MfG
Thomas

Generell gibt es 16x2 und 20x4 bei diesen einfachen Displays. Mehr nicht (40x4 vielleicht noch, aber das ist exotisch). Was brauchst du denn mehr? Man kann auch abkürzen, z.B. "Temp: xx.xx". Wenn der Platz nicht reicht kann man Werte auch abwechselnd anzeigen.

Displays kann man entweder mit einem parallel Interface anschließen. Wenn du den UNO für sonst nichts brauchst reicht das. Wenn du Pins für andere Zwecke brauchst gibt es I2C Adapter (oder Displays auf denen schon einer aufgelötet ist). Da braucht man dann nur 2 Pins. Aber das ist nicht nötig wenn du damit nur dieses Gerät auslesen willst.

Ein weiteres noch nicht genanntes Problem. Da Du die Elektronik im Deckel des Aquariums einbauen willst möchte ich Dich warnen. Die erhöhte Luftfeuchtigkeit über dem Wasser bewikt ziemlich schnell die Korrosion der metallischen Teile der Platine/Stecker/Display. Eine Wassedichte Ausführung ist auch schwierig und anfällig gegenüber Kondenswasser das trotzdem irgendwie hineinkommt, aber dann nicht mehr rauskommt.

Viele Grüße Uwe

Also 20 Zeichen reichen auch aus, denke ich. Der rest wäre nur Luxus gewesen :slight_smile:

Den Uno brauche ich eigentlich nur für dieses Gerät. Ich will, wenn alles passt dann entweder den Uno für dieses Projekt belassen und mir zum experimentieren einen neuen kaufen.

Ich bekomme das im COM Protokoll übrigens leider nicht besser hin, ein paar komische Zeichen sind immer dabei.

Ich habe mal Fotos davon gemacht, quasi Screenshots.

Ich habe dabei eingestellt, dass der Übersicht halber alle 20 Zeichen eine neue Zeile benutzt wird.

Wie man am Datum sieht, verschiebt es sich durch die unbekannten Zeichen leider immer etwas.

Z.B. hätte ich auch gerne, dass Datum und Uhrzeit im Display immer oben stehen und darunter in den verbleibenden 3 Zeilen dann die Werte live aktualisiert werden, also datum und Zeit oben fixieren, dann untereinander die nächsten 3 Messwerte, wenn der 4. Messwert angezeigt werden soll, dann in die zeile 2 und den zuvor ersten Messwert überschreiben... Sollte hinzubekommen sein, oder?

Hier mal die bilder, ein Foto nach jeder Aktualisierung gemacht:

http://www.bilder-upload.eu/show.php?file=9f1813-1434576478.jpg
http://www.bilder-upload.eu/show.php?file=f9a3e2-1434576552.jpg
http://www.bilder-upload.eu/show.php?file=810036-1434576587.jpg
http://www.bilder-upload.eu/show.php?file=c1710a-1434576609.jpg
http://www.bilder-upload.eu/show.php?file=c7789e-1434576650.jpg
http://www.bilder-upload.eu/show.php?file=d3cc30-1434576675.jpg

E1 E2 E3 usw bedeutet übrigens: Eingang, welcher am Computer für den jeweiligen Sensor benutzt wurde. Das wäre auch eine Info, die ich auf dem DIsplay z.B. nicht brauchen würde, da würde es reichen, wenn z.B. Temp: xxx ºC stehen würde, Oder Redox: 477 mV.

Könnte mein erstes Projekt anhand dessen, was man auf den Screenshots sieht klappen? :slight_smile:

@Uwe:

Deine Bedenken diesbezüglich sind ansolut berechtigt. Aber diesbezüglich habe ich mir schon gedanken gemacht.

Das Becken hat keine richtige Abdeckung, sondern eher eine Umrandung aus 3mm dickem MDF Holz, was nach oben offen ist. Auf dem Becken selbst lieben Plexiglasabdeckungen.

Klar bleibt es nicht aus, dass Kondenzwasser entsteht, ich wollte das Display in den Holzrahmen integrieren, hierfür ein Loch ausschneiden, das Display einsetzen und das was vom DIsplay hinten heraussteht will ich mit einem Leergehäuse abdichten, welches ich mit Silikon von hinten dagegen kleben will. Oben vielleicht 1 oder 2 kleine Löcher rein bohren, damit die Luft nicht darin steht und ggf. ansammelnde Kondenzflüssigkeit wieder verdunsten kann.

am Abdeckungsbereich bringe ich nur das DIsplay selbst an und führe Kabel davon weg. Der Uno soll dann unter dem Becken im/am Schrank sitzen, ebenfalls in einem Gehäuse eingebaut.

MfG

Thomas

Das sieht aber anders als was du oben geschrieben hast.

Das Grad-Zeichen passt wohl nicht zum Zeichensatz. Nicht schlimm, das da im Display auch nicht ASCII ist. Muss man so oder so per Hand einfügen.

\r = Carriage Return. \n = Line Feed. Du musst HTerm so einstellen, dass der Zeilenumbruch korrekt angezeigt wird. Also "newline at CR+LF" und eventuell den Haken bei "show newline characters" entfernen. Letzteres ist aber Geschmackssache.

Das was ich vorhin geschrieben habe war aus dem Kopf heraus, da ich unterwegs war und es nicht ablesen konnte. Die Bilder sind aber korrekt.

Danke für den Tipp, das probiere ich morgen direkt mal aus. Ich hoffe, das klappt dann doch noch mit dem Umbruch.

Die Karte und Display werden morgen bestellt, dann kann es endlich los gehen :slight_smile:

Vielen Dank für die Hilfe bisher. Ich befürchte, ich brauche davon noch jede Menge :frowning:

Rein vom Code her ist das nicht schwer. Eine Ausleseroutine für die serielle Schnittstelle habe ich schon verlinkt. Das geht praktisch identisch mit AltSoftSerial:
https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html
Den Puffer machst du etwas größer als die maximale Zeilenlänge.

Das Parsen kann man dann so ähnlich machen:

char line1[] = "E1  (Te ) 25.3   Grad";
char line2[] = "E4  (pH )08.11  pH";
char line3[] = "E5  (Rx ) +473  mV";

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  parse(line1);
  parse(line2);
  parse(line3);
  Serial.println();
  delay(3000);
}

void parse(char* str)
{
  char* ptr = strstr(str, "(Te )");
  if (ptr != NULL)
  {
    printValue("Temp: ", ptr, " Grad", 1);
    return;
  }
 
  ptr = strstr(str, "(pH )");
  if (ptr != NULL)
  {
    printValue("pH: ", ptr, NULL, 0);
    return;
  }

  ptr = strstr(str, "(Rx )");
  if (ptr != NULL)
  {
    printValue("Rx: ", ptr, " mV", 1);
  }
}

//distance = Abstand zwischen schließender Klammer und Zahl
void printValue(const char* title, char* str, const char* unit, int distance)
{
  str += 5;	//Zeiger steht danach auf dem Zeichen nach der schließenden Klammer
  str += distance;
  *strchr(str, ' ') = '\0';
  Serial.print(title);
  Serial.print(str);

  if (unit != NULL)
    Serial.println(unit);
  else
    Serial.println();
}

Ob das mit dem Abstand nach der Klammer so genau passt weiß ich nicht. Das sieht so aus ob beim pH-Wert kein Leerzeichen zwischen '(' und dem Wert steht. Es ist vielleicht auch möglich, dass sich der Abstand ändert wenn der Wert mehr oder weniger Stellen hat.

Muss dann für ein LCD noch etwas angepasst werden (mit Koordinaten und ohne println()). Aber das ist keine große Sache.

Das kann man dann Schritt für Schritt machen:
1.) Gerät über seriellen Adapter an AltSoftSerial Schnittstelle hängen und die Daten erst mal auf Serial ausgeben (d.h die Hardwareschnittstelle die auf die USB Buchse geht).
2.) Display anschließen und erst mal ohne Gerät testen und ausprobieren wie man Text an bestimmte Stellen schreibt
3.) Programm so umschreiben, dass statt Serial das Display verwendet wird

Hey, super. Vielen Dank. Das sieht ja echt überschaubar aus, so dass ich das bestimmt hin bekomme :slight_smile:

Noch mal eine Frage zur Hardware, die ich am besten heute noch bestellen will...

Hier wäre meine Einkaufsliste:

Display:
http://www.conrad.de/ce/de/product/181657/LC-Display-Weiss-Blau-B-x-H-x-T-98-x-60-x-136-mm-Anag-Vision-AV2040BNBW-WJ?ref=list

Von den 232 bzw. 3232 Boards habe ich 2 gefunden. Ist das egal, welches ich für mein Projekt nehme?

http://www.conrad.de/ce/de/product/1221407/Entwicklungsboard-MikroElektronika-MIKROE-602?ref=searchDetail

http://www.conrad.de/ce/de/product/1221401/Entwicklungsboard-MikroElektronika-MIKROE-222/?ref=detview1&rt=detview1&rb=1

Muss ich sonst noch etwas dazu bestellen, oder könnte das so schon funktionieren? Den Uno habe ich übrigens bereits.

Kann ich das Display direkt mit dem Uno ansteuern?

Vielen Dank schon mal

Der Konverter wird egal sein. Der MAX3232 ist aber besser.

Schau mal auf eBay nach. Da gibt es das billiger.

*MAX3232:
**Aus GB:
http://www.ebay.de/itm/MAX3232-RS232-Serial-Port-To-TTL-Converter-Modul-DB9-Connector-Dupont-Cables-5V-/301443666063?pt=LH_DefaultDomain_77&hash=item462f71508f
**Aus DE:

*LCD

Aus China gibt es das ganz billig. Aber da wartest du dann Wochen auf die Lieferung.

Kann ich das Display direkt mit dem Uno ansteuern?

Ja

So ein LC-Display verbraucht, wenn ich richtig gezählt habe, 6 IO-Pins. Bei einem Mega schmerzt das nicht, sonst aber möglicherweise schon. Daher gibt es Displays mit I2C-Schnittstelle (VCC, GND, SDA, SCL), hier ein Beispiel, um die Anzahl der Anschlüsse zu reduzieren. Es gibt auch Nachrüstmöglichkeiten. Nur so als Anregung.

Er will sonst nichts mit dem UNO machen. Nur seriell auslesen und anzeigen.