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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Constantin D. (specials)


Angehängte Dateien:

Bewertung
lesenswert
nicht 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)


Bewertung
lesenswert
nicht 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)


Bewertung
lesenswert
nicht 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)


Bewertung
lesenswert
nicht 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 ;)


void loop() {

  //String von Waage empfangen

  if (mySerial.available())
  scaleOutput = mySerial.readStringUntil('\n');
  Serial.println(scaleOutput);


  //String von Waage prüfen und negativ prüfen

  negative = false; //zurücksetzten, ansonsten Vorzeichenfehler
  if (scaleOutput.indexOf('.') == 6){
  if (scaleOutput.indexOf('-') != -1) {
          negative = true;
          Serial.println("negativ");
        }
  }

  //String kürzen und in Float umwandeln
  //Stabilität prüfen

  wert = scaleOutput.substring(3,9).toFloat();
  if (negative == true)
  wert = wert*-1;
  Serial.println(wert);
  if (scaleOutput.charAt(12) == 'S'){
  stable = true;
  }else{
    stable = false;
  }
  Serial.println(stable);

  Ausgeben(); //Ausgabe an OLED Display

}

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.