Hallo Arduino Member
Ich habe mir einen Arduino Due zugelegt und beabsichtige damit, einen Windmesser auszulesen. Die ermittelten Werte (-9.9 bis 9.9) möchte ich später dann auf einer Anzeige (2x7-Segmente + Vorzeichen) darstellen.
Das serielle Auslesen des Windmessers funktioniert schon mal (siehe Bild).
Nur komme ich nicht drauf, wie ich den Wert, in diesem Fall 0.0, verarbeiten kann.
Bin noch ein Neuling auf diesem Gebiet und mir würde schon ein Tip genügen, wie ich ein auftauchendes "-" vor diesem Wert verarbeiten kann.
Vielen Dank schon mal im voraus.
Markus
molli76:
Nur komme ich nicht drauf, wie ich den Wert, in diesem Fall 0.0, verarbeiten kann.
Das "Anzeigen der Daten auf dem seriellen Monitor" fällt bei Dir wohl nicht unter "verarbeiten", oder?
Dann erkläre doch mal: Was genau verstehst Du unter "verarbeiten", wenn es "anzeigen der Daten" nicht ist?
Und erkläre mal genau das serielle Datenformat, das Dein Sensor sendet!
Dein Sensor sendet offenbar Daten über eine serielle Schnittstelle an Deinen Arduino, und Du zeigst die Daten offenbar auch im seriellen Monitor an (mit welchem Sketch?), aber was genau sendet der Sensor (hat der eine Modellbezeichnung, Beschreibung, Datenblatt?) und wie möchtest Du es "verarbeiten"?
Bei Sensoren, die ein ASCII-Klartextformat mit einem Zeilenende-Zeichen senden, wäre das generelle Vorgehen so:
- Immer eine Zeile vom Sensor in ein char-Array einlesen
- die eingelesene Zeile in die verschiedenen Bestandteile zerlegen (Tokenisierung)
- die einzelnen Bestandteile zur weiteren Verarbeitung in numerischen Variablen abspeichern
Unter verarbeiten verstehe ich, das der Wert später auf eine Anzeigetafel gebracht wird.
Das auslesen der seriellen Schnittstelle mache ich mit folgendem Sketch:
const int led = 13; // Mit Pin 13 verbundene LED
float wind; // Windstärke steht in dieser Variable
void setup()
{
Serial.begin(9600); // Serieller Port sendet und empfängt mit 9600 Baud
pinMode(led, OUTPUT); // Diesen Pin als Ausgang verwenden
}
void loop(){
}
void serialEvent()
{
while(Serial.available())
{
float (wind) = Serial.read();
Serial.write(wind);
}
}
In welchem Format der Sensor(Windmesser) sendet kann ich leider nicht sagen, da ich an keinerlei Daten rankomme. Zum Auslesen nutze ich einen RS232 auf TTL Wandler und von dort gehe ich auf die Serielle Schnittstelle des DUE.
Das was der Sensor nun übermittelt, ist das, was auf dem Bild zu sehen war. Viele Leerzeichen und die wenigen Zeichen.
Ohne dem Windsensor zu kennen kann ich Dir mit Sicherheit sagen daß er keine 4 Byt Float Zahl sendet. Er wird die Zahlen und Zeichen als ashii-Werte senden. Versuch mal die Werte mit Serial.print auszugeben.
Grüße Uwe
molli76:
In welchem Format der Sensor(Windmesser) sendet kann ich leider nicht sagen, da ich an keinerlei Daten rankomme.
Dann wage ich mal die Prognose:
Deine Aussage "Das serielle Auslesen des Windmessers funktioniert schon mal (siehe Bild)." ist FALSCH!
Du liest mit Deinem Code zwar irgendwas, aber das ist nicht das, was der Sensor sendet.
molli76:
Zum Auslesen nutze ich einen RS232 auf TTL Wandler und von dort gehe ich auf die Serielle Schnittstelle des DUE.
Du Kurzschluß-Bastler! Du riskierst es gerade, Deinen Due und oder auch den Windmesser gleich mit zu zerstören!
Die serielle Schnittstelle "Serial" ist spätestens ab der Zeile "Serial.begin(9600)" mit Deinem PC verbunden!
Dieselbe Schnittstelle darfst Du nich nochmal woanders anschließen!
Eine serielle Schnittstelle stellt eine Point-to-Point-Verbindung dar und es darf immer nur EIN serielles Gerät mit EINEM anderen serielle Gerät verbunden werden!
Du hast gerade an der seriellen Schnittstelle Deines DUE ZWEI serielle Geräte angeschlossen:
- den PC mit dem "Seriellen Monitor"
- den Windmesser über den RS232-TTL Adapter
Ich würde als erstes mal diesen Kurzschluss in Deiner Schaltung beseitigen und den Windmesser über den RS232-TTL-Adapter an einem ANDEREN SERIELLEN ANSCHLUSS Deines DUE anschließen.
Also schließe den Windmesser an Pin 0 und 1 ab, und schließe ihn beispielsweise an Serial1 an. Ich habe zwar keinen DUE, aber ich lese in der Beschreibung:
The Arduino Due hat drei zusätzliche Serial Ports: Serial1 an den Pins 19 (RX) und 18 (TX),
Also den TTL-Adapter des Windmessers an 19 und 18 (Serial1) wäre möglich.
Achte auch auf die Pegel Deines Adapters: Der DUE verträgt nur 3.3 Volt!
Also keinen Adapter mit 5 Volt TTL-Pegeln verwenden!
Bzw. wenn Du nur Daten vom Windmesser auslesen möchtest, brauchst Du nur den TX-Sendepin des Windmessers mit dem RX-Pin 19 von Serial1 zu verbinden. (Empfangen braucht der Windmesser ja wohl nur, wenn er umprogrammiert werden soll, aber er sendet wohl vermutlich von alleine, ohne dazu einen Sendebefehl zu benötigen).
Und dann teste erstmal mit einem solchen Sketch:
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial1.begin(9600);
}
void loop() {
while (Serial1.available()) Serial.write(Serial1.read());
}
Vielen Dank für den Hinweis. Dem bin ich nun nachgegangen, das Ergebnis bleibt das gleiche ( siehe Bild ).
molli76:
Vielen Dank für den Hinweis. Dem bin ich nun nachgegangen, das Ergebnis bleibt das gleiche ( siehe Bild ).
???
Verstehe ich das richtig:
Dein Sketch aus Reply #2 mit kurzschlußträchtigem Sensoranschluß an Serial liefert dieselbe Ausgabe wie mein Sketch aus Reply #4 mit sauber getrenntem Sensoranschluss an Serial1?
Oder hast Du Deinen Sketch aus Reply #2 so abgeändert, dass er nun mit dem an Serial1 angeschlossenen Sensor läuft?
Und Du hast wirklich keinerlei Datenblatt? Hersteller? Typenbezeichnung vom Sensor?
Irgendein Herstellerlogo oder Aufdruck auf dem Sensor verfügbar?
So dass man vielleicht etwas mehr über den Sensor herausfinden kann?
Wenn Du keinerlei technische Angaben hast, weißt Du ja noch nicht einmal, was der Sensor sendet?
Windstärke in Meter pro Sekunde? Oder in Yard pro Sekunde? In Kilometer pro Stunde? Meilen Pro Stunde? Knoten? Beaufort?
Anyway, hier ein neuer Test-Sketch zum Ausknobeln des Sendeprotokolls:
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial1.begin(9600);
}
unsigned long receiveCount=0;
void loop() {
while (Serial1.available())
{
receiveCount++;
byte b=Serial1.read();
char c=b;
Serial.print(receiveCount);
Serial.print('\t');
Serial.print(b);
Serial.print('\t');
Serial.print(c);
Serial.println();
}
}
Lasse mal laufen und poste die serielle Ausgabe, und zwar NICHT als Screenshot, sondern indem Du die Ausgabe im seriellen Monitor markierst und per Copy-and-Paste hier einfügst, am besten innerhalb von Code-Tags.
Vielleicht den Sensor auch mal mit einem Fön in der Kaltluftstufe anblasen, damit er andere Werte als Null liefert.
Ich behaupte auch mal ganz kühn, dass hier die Hardware nicht zur Beschreibung passt.
Foto?
@jurs
ich habe Deinen Sketch hier rauskopiert und bei mir 1:1 eingefügt und das Ergebnis blieb das gleiche. Der Windmesser sendet den Wert in m/s.
http://www.alge-timing.com/alge/download/manual/ws2/Timy%20Windspeed%20WS2-BD.pdf
Hier mal ein Link zu dem Windmesser. Auseinanderbauen ist leider nicht möglich da dann die Garantie und die bescheinigte Kalibrierung nicht mehr anerkannt wird.
Werde Deinen Sketch erst morgen Nachmittag ausprobieren können, mit Werten ungleich 0.0. Werde mal mit positiven und negativen Werten.
Bin jetzt erst mal auf der Arbeit.
Vielen Dank bis hier her schon mal.
Laut dem Dokument ist das RS-485 und nicht RS-232. Da muss ein passender Pegelwandler/Konverter zwischen dem Gerät und den Arduino.
Von der Baudrate steht nichts dabei. Hast du mal andere Baudraten probiert?
molli76:
Werde Deinen Sketch erst morgen Nachmittag ausprobieren können, mit Werten ungleich 0.0. Werde mal mit positiven und negativen Werten.
Dein Gerät zeigt offenbar zwei Werte an: Eine "aktuelle Windgeschwindigkeit" und eine "durchschnittliche Windgeschwindigkeit", die auf unterschiedliche Art, je nach eingestellter Betriebsart, errechnet wird.
Als erstes mal müßtest Du herausfinden, welches die der "aktuelle" und welches der "durchschnittliche" Wert ist. Ich tippe mal drauf "--.-" steht für "aktuell" und "0.0" für "Durchschnitt der Messung".
Hast Du eigentlich nur den reinen Windsensor oder auch das "Windmessbedienpult Timy2 XE" bei Dir vorliegen?
Die RS485 Schnittstelle wird nur benutzt, um den Messwert vom Timy in das Programm der Zeitauswertung einfliessen zu lassen. Die Daten für die "Wind-GAZ" werden per RS232 ausgegeben.
Ich habe ein älteres Modell des Timy, der heißt einfach nur Timy.
Der Wert "--.-" kommt immer dann, wenn eine neue Messung gestartet wird, "0.0" steht für den ermittelten Durchschnittswert und soll später auf eine Anzeigetafel gebracht werden.
Bis morgen, dann habe ich den neuen Sketch getestet und das Ergebnis hier beigefügt.
Gute Nacht, ich muss schaffen
So ein Mist. Ich kann heute nichts testen
Irgendwie kann ich keinerlei Daten mehr seriell empfangen, egal welchen Port ich benutze. Und der MAX 232 auf dem Wandler wird glühend heiß, sobald ich ihn anschliesse. Ob der jetzt defekt ist? Gestern hat er noch funktioniert. Muss mir mal Ersatz besorgen.
Tut mir Leid, das ich euch heute nichts anderes berichten kann
Ich sags ja, da haperts auch an der Hardware. Aber wie so oft bei solchen Anfragen wird beharrlich behauptet dass alles fein ist.
An der Hardware hat es nicht gehapert sondern an meiner fehlenden Erfahrenheit.
So wie Jurs schon prophezeit hat, habe ich mir einen Kurzschluß eingebaut, da ich den Seriellen Eingang gleich 2mal belegt hatte. Dadurch habe ich mir den Max232 auf dem RS 232 Wandler zerschossen. Der DUE ist in Ordnung.
Besorge mir einen neuen und weiter geht, hoffentlich mit eurer Hilfe. Bitte.
So liebe Member
Ich habe soeben den von Jurs geschriebenen Sketch in meinen Arduino eingefügt und mal getestet und habe mal ein negatives Messergebnis produziert.
Hier das Ergebnis:
1 32
2 32
3 32
4 32
5 32
6 32
7 32
8 32
9 32
10 32
11 32
12 32
13 32
14 32
15 45 -
16 45 -
17 46 .
18 45 -
19 32
20 32
21 32
22 32
23 13
24 32
25 32
26 32
27 32
28 32
29 32
30 32
31 32
32 32
33 32
34 32
35 32
36 32
37 32
38 45 -
39 49 1
40 46 .
41 51 3
42 32
43 32
44 32
45 32
46 13
47 32
48 32
49 32
50 32
51 32
52 32
53 32
54 32
55 32
56 32
57 32
58 32
59 32
60 32
61 32
62 32
63 32
64 32
65 32
66 32
67 32
68 32
69 13
Zur Auswertung benötige ich die Werte in den Zeilen 15-18 und 38-41. Für jeden Tipp wäre ich sehr dankbar, versuche mich aber auch weiter selbst daran, die Werte zur Auswertung zu bringen.
Frohe Ostern an alle
Klaus_ww:
Ich sags ja, da haperts auch an der Hardware. Aber wie so oft bei solchen Anfragen wird beharrlich behauptet dass alles fein ist.
Hallo,
dem muss ich zustimmen, wenn der MAX232 auf dem Wandler glühend heiß wird, haperts an der Hardware.
Außerdem, der MAX232 liefert TTL-Pegel und der Due ist ein 3,3V-Gerät, das passt nicht zusammen. Da sollte ein Spannungsteiler (mindestens) in die Leseleitung, die Schreibleitung (falls hier überhaupt benötigt), könnte funktionieren.
Gruß,
Ralf
molli76:
Zur Auswertung benötige ich die Werte in den Zeilen 15-18 und 38-41. Für jeden Tipp wäre ich sehr dankbar, versuche mich aber auch weiter selbst daran, die Werte zur Auswertung zu bringen.
Sieht doch sehr gut aus!
Ein Datensatz besteht offenbar immer aus drei Zeilen gleicher Länge, die jeweils 22 Zeichen enthalten und mit dem Zeilenendezeichen ASCII-13 abgeschlossen werden.
Zeilenende ASCII-13 in den Bytes Nummer 23, 46 und 69.
Die ersten beiden Zeilen enthalten außer Leerzeichen (ASCII-32) nur die von Dir gesuchten Daten.
Die dritte Zeile ist (bis auf Leerzeichen) komplett leer.
Da läßt sich eine schöne Programmlogik drumherum bauen, die sich sogar selbständig synchronisieren kann: Immer nachdem eine leere Zeile empfangen wurde, beginnt (irgendwann) eine neue Messung.
Wenn man da noch ein Timeout drum herumbaut, so dass falls "Matschzeichen" auf der Leitung auftreten (z.B. jemand stolpert über das Kabel, Stecker reißt raus, Stecker wird wieder reingesteckt und erzeugt "falsche" Zeichen), eine Fehlmessung nach einer gewissen Zeit mit "Timeout" beendet und auf eine neue Messung gewartet wird, wird es nicht nur selbstsynchronisierend, sondern das Ganze auch "fail safe".
Brauchst Du Beispielcode?
Den ersten RS232-TTL Adapter hast Du durch Falschanschluss erfolgreich ruiniert und nun den zweiten in Gebrauch?
Hast Du auch darauf geachtet, ggf. mit dem Multimeter ausgemessen, dass dieser Adapter auch wirklich nur 3.3V Pegel auf der TTL-Seite ausgibt? Weil mit dem "DUE" hast Du Dir ja ein empfindliches 3.3V 32-Bit Board geholt, und nicht eines mit einem robusten 8-Bit 5V Controller. Nicht, dass Du Dir nach dem Adapter durch Falschanschluss nun als nächstes das DUE-Board durch zu Überspannungspegel an Serial1 ruinierst.
Hi Jurs
Ja, Dein Sketch hat mich auch schon ein wenig weiter gebracht, aber so richtig zum Auswerten der Daten komme ich irgendwie nicht.
Ein Beispiel-Code wäre total cool. Wenn Du das auf die Schnelle machen könntest, wäre ich Dir unsagbar dankbar. Als absoluter Neuling bin ich da echt ein bischen überfordert. Denke, das ist auch ein recht anspruchsvolles Projekt üfr einen Anfänger wie mich.
Ich hab mir einen einen neuen Wandler besorgt und der gibt 3.3 Volt raus. Somit durfte für die Zukunft nichts mehr passieren.
Wünsche Dir schon mal ein schönes Osterfest, auch an den Rest der Community
Ein Datensatz besteht offenbar immer aus drei Zeilen gleicher Länge, die jeweils 22 Zeichen enthalten und mit dem Zeilenendezeichen ASCII-13 abgeschlossen werden.
Mit dieser Information und dem Testcode von jurs kannst du doch schon mal selbst versuchen den Code soweit zu bringen einen Block einzuzulesen.
Ein 22 char großes Array solange zu befüllen bis das Zeichen 13 kommt, und dann den Indexzähler wieder auf 0 setzen.
So sehe ich das Prinzip.