Arduino Waage auslesen mit ASCII Code

OP #6647353
Lesenswert?

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!
Angehängte Dateien:
#6647599
Lesenswert?

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?"
#6647883
Lesenswert?

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
OP #6648136
Lesenswert?

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
}
#7576232
Lesenswert?

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
}
#7576274
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren