Forum: Mikrocontroller und Digitale Elektronik Arduino Waage auslesen mit ASCII Code


von Constantin D. (specials)


Angehängte Dateien:

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!

: Verschoben durch Moderator
von Thilo R. (harfner)


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?"

: Bearbeitet durch User
von Sebastian W. (wangnick)


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

: Bearbeitet durch User
von Constantin D. (specials)


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
}

: Bearbeitet durch Moderator
von Mattus (mattus123)


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
}

: Bearbeitet durch Moderator
von Roland F. (rhf)


Lesenswert?

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

von Mattus (mattus123)


Lesenswert?

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

von J. R. (yoc)


Lesenswert?

9600 ist nur die Voreinstellung.
Möglich sind wohl auch 1200 2400 und 4800.

Ist ja schnell getestet.

von Axel R. (axlr)


Lesenswert?

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?

von Roland F. (rhf)


Lesenswert?

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

von Rainer W. (rawi)


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.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.