Moin, ich möchte meine Kern PLE 420-3N Auslesen. Ich habe es auch hinbekommen, dass die Waage, die an das Arduino per RS232 angeschlossen ist, ihre Werte an den PC sendet. Mit Serial.write wird der ASCII Code sogar automatisch mit dem eingebauten Plotten in Klartext umgewandelt! Ich möchte die Werte im Arduino weiter verarbeiten und muss daher den ASCII Code selbst übersetzten. Die Waage gibt per Serial.println die nicht übersetzten Werte aus. Ich habe eine Excel Tabelle mit den Werten angehängt. Mir ist aufgefallen, dass vor jedem Ergebnis 4x die 32 vorkommt und jeweils mit 71 (G) und 78 (N) endet + zusätzlich ein 83 (S), wenn das die Waage stable ausgibt (die Einheit ist Grain = GN). Wie kann ich den "Mittelteil", d.H. alles nach 4x der 32 bis zum N oder S (wenn Stable) auslesen und übersetzen? Bin leider nicht so fit mit dem Arduino, aber brauche das um einen kleinen Motor anzusteuern, um automatisch ein bestimmtes Gewicht zu erreichen. Danke schon im Voraus!
:
Verschoben durch Moderator
Du hast mit Deinem Screenshot so ziemlich die ungünstigste Darstellung gewählt, die möglich ist. Wenn Du einfach die Zahlen gepostet hättest, oder besser den String, wäre es einfacher gewesen. Was da kommt ist "- 0.20 GNS\r\n". Du schreibst alle Zeichen in ein char[]-Array, und wenn dann "\r\n" vorbei kommt, wirst Du das dann atoi() zum Frass vor, sofern es 15 Zeichen sind. Bei jedem '\n' fängst Du im Puffer von vorne an und stellst den Zähler auf 0. Falls Du atoi() nicht benutzen willst (warum?), musst Du selbst die Dezimalzahl nach int wandeln. War das Deine Frage? Dann solltest Du fragen "Wie wandele ich eine Zahl in einem String in int um?"
:
Bearbeitet durch User
Hallo Constantin, Constantin D. schrieb: > Wie kann ich den "Mittelteil", d.H. alles nach 4x der 32 bis zum N oder S > (wenn Stable) auslesen und übersetzen? Thilo R. schrieb: > Was da kommt ist "- 0.20 GNS\r\n" Sobald du diese Zeichenkette (die der Anleitung in http://dok.kern-sohn.com/manuals/files/German/PLE_N-BA-d-1725.pdf Kapitel 10.5 entspricht) wie von Thilo beschrieben aus dem seriellen Zeichenstrom in einen char ple[16] extrahiert (und mit '\0' abgeschlossen) hast, kannst du zum Beispiel mit
1 | float pletof (char* ple) { |
2 | if (ple[0]=='-') { |
3 | while (ple[1]==' ') ple++; |
4 | *ple = '-'; |
5 | } |
6 | return atof(ple); |
7 | } |
den Messwert ermitteln. Die Einheit findest du in ple[9] bis ple[11], das 'S' für Stable in ple[12]. LG, Sebastian
:
Bearbeitet durch User
Vielen Dank für die Antworten! Hab beim rumprobieren festgestellt, dass readStringUntil das anscheinend schon selbst umwandelt! Funktioniert bei mir jetzt perfekt, aber vlt könnt ihr mir ja noch ein paar Tipps geben, was man besser machen kann ;)
1 | void loop() { |
2 | |
3 | //String von Waage empfangen
|
4 | |
5 | if (mySerial.available()) |
6 | scaleOutput = mySerial.readStringUntil('\n'); |
7 | Serial.println(scaleOutput); |
8 | |
9 | |
10 | //String von Waage prüfen und negativ prüfen
|
11 | |
12 | negative = false; //zurücksetzten, ansonsten Vorzeichenfehler |
13 | if (scaleOutput.indexOf('.') == 6){ |
14 | if (scaleOutput.indexOf('-') != -1) { |
15 | negative = true; |
16 | Serial.println("negativ"); |
17 | }
|
18 | }
|
19 | |
20 | //String kürzen und in Float umwandeln
|
21 | //Stabilität prüfen
|
22 | |
23 | wert = scaleOutput.substring(3,9).toFloat(); |
24 | if (negative == true) |
25 | wert = wert*-1; |
26 | Serial.println(wert); |
27 | if (scaleOutput.charAt(12) == 'S'){ |
28 | stable = true; |
29 | }else{ |
30 | stable = false; |
31 | }
|
32 | Serial.println(stable); |
33 | |
34 | Ausgeben(); //Ausgabe an OLED Display |
35 | |
36 | }
|
:
Bearbeitet durch Moderator
Hallo Zusammen, ich bin noch ganz grün hinter den Ohren ;) Ich habe eine Kern Waage mit defektem LCD und ich habe versucht über den TX Ausgang vom RS232 über ein TTL die Messwerte mit einem Arduino auszulesen und auf ein 20x4 LCD zu senden. Leider bis dato ohne Erfolg. Es kommt nur ...⸮⸮... im Serial Monitor wenn ich auf print drücke Könnte mir jemand helfen? hier mein Code.
1 | #include <Wire.h> |
2 | #include <LiquidCrystal_I2C.h> |
3 | #include <SoftwareSerial.h> |
4 | |
5 | // Define the RX and TX pins for SoftwareSerial
|
6 | const int rxPin = 10 |
7 | ; // Connect the RX pin of the SoftwareSerial to this pin |
8 | |
9 | // Define the LCD address and dimensions (20x4)
|
10 | const int lcdColumns = 20; |
11 | const int lcdRows = 4; |
12 | const int lcdAddress = 0x27; // Use i2c_scanner to find your LCD address |
13 | |
14 | // Create a SoftwareSerial object
|
15 | SoftwareSerial mySerial(rxPin); |
16 | |
17 | // Create an LCD object
|
18 | LiquidCrystal_I2C lcd(lcdAddress, lcdColumns, lcdRows); |
19 | |
20 | int currentColumn = 0; |
21 | int currentRow = 0; |
22 | |
23 | void setup() { |
24 | // Start the serial communication with a baud rate of 9600
|
25 | Serial.begin(9600); |
26 | |
27 | // Start the SoftwareSerial communication
|
28 | mySerial.begin(9600); |
29 | |
30 | // Initialize the LCD
|
31 | lcd.begin(lcdColumns, lcdRows); |
32 | lcd.backlight(); // Turn on the backlight |
33 | lcd.clear(); // Clear the LCD screen |
34 | }
|
35 | |
36 | void loop() { |
37 | if (mySerial.available()) { |
38 | // Read data from the SoftwareSerial
|
39 | char receivedChar = mySerial.read(); |
40 | |
41 | // Print the received character to the Serial Monitor
|
42 | Serial.print(receivedChar); |
43 | |
44 | // Display the received character on the LCD
|
45 | lcd.print(receivedChar); |
46 | |
47 | // Check if we need to move to the next line on the LCD
|
48 | currentColumn++; |
49 | |
50 | if (currentColumn == lcdColumns) { |
51 | currentColumn = 0; |
52 | currentRow++; |
53 | |
54 | if (currentRow == lcdRows) { |
55 | currentRow = 0; |
56 | lcd.clear(); |
57 | }
|
58 | |
59 | lcd.setCursor(currentColumn, currentRow); |
60 | }
|
61 | }
|
62 | }
|
:
Bearbeitet durch Moderator
Hallo, Mattus schrieb: > Es kommt nur ...⸮⸮... im Serial Monitor wenn ich auf print drücke Probiere mal hier statt 9600 andere Baud-Raten. > mySerial.begin(9600); rhf
Hallo Roland, danke für den Hinweis doch leider ist die Baudrate laut Handbuch auch 9600 https://corina-weighing.se/wp-content/uploads/2020/04/Communication.protocol.KCP-ZB-e-1712.pdf ggf. hilft das Handbuch weiter
9600 ist nur die Voreinstellung. Möglich sind wohl auch 1200 2400 und 4800. Ist ja schnell getestet.
Mattus schrieb: > habe versucht über den > TX Ausgang vom RS232 über ein TTL die Messwerte mit einem Arduino > auszulesen was sagt Hterm oder PuTTy? Die waage mal direkt mit dem PC verbunden?
Hallo, Mattus schrieb: > danke für den Hinweis doch leider ist die Baudrate laut Handbuch auch > 9600 Dann: Axel R. schrieb: > was sagt Hterm oder PuTTy? Die waage mal direkt mit dem PC verbunden? rhf
Mattus schrieb: > ich habe versucht über den TX Ausgang vom RS232 über ein TTL die > Messwerte mit einem Arduino auszulesen .... > Leider bis dato ohne Erfolg Kein Wunder. TTL ist nicht RS232. Die Signale unterscheiden sich in Pegel und Polarität. Du solltest erstmal klären, was bei dir Sache ist. Was hat das eigentlich mit dem Thema ASCII dieses drei Jahre alten Threads zu tun? Du hast ein ganz anderes Problem.
:
Bearbeitet durch User
Mattus schrieb: > hier mein Code. Bitte mal die Bedieunungsanleitung lesen und künftig die C-Tags selber einsetzen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.