ich habe mithilfe eines Arduino Mega 2560 ein Projekt realisiert.
Leider funktioniert das auslesen meiner Waage und das darauf folgende Abspeichern des Messwertes nicht zuverlässig genug.
Hier der Sketch
void wiegen ()
{
Serial.println("Anforderung zum wiegen wird gesendet");
Serial3.print("s");
Serial.println("wurde gesendet");
while (Serial3.available()>0)
{
// erhalte Daten
char inChar = (char)Serial3.read();
// Füge zu inputString hinzu:
inputString += inChar;
// Wenn das eintreffende Zeichen eine neue Zeile ist, ist der empfange String komplett
if (inChar == '\n')
{
stringComplete = true;
Serial.print("String komplett");
}
}
delay(2000);
Datei = SD.open("Messung.txt", FILE_WRITE);
if (Datei)
{
Serial.print("Schreibe Messwert in Messwert.txt...");
Datei.println(inputString);
// close the file:
Datei.close();
Serial.println("done.");
}
else
{
// Fehlermeldung
Serial.println("error opening te.txt");
}
Serial.println(inputString);
delay(2000);
// clear the string:
inputString= "";
}
Leider wird der gewogene Wert erst beim zweiten mal wiegen übermittelt. Und die Messwerte werden nicht jedesmal auf die SD Karte geschrieben, sondern wirkürlich.
Ich weiß momentan nicht weiter und hoffe das mir hier jemand weiter helfen kann.
Blabla:
Leider funktioniert das auslesen meiner Waage und das darauf folgende Abspeichern des Messwertes nicht zuverlässig genug.
Leider sind String-Objekte in der Arduino-Software fehlerhaft implementiert und führen bei bestimmten Programmen nach kürzerer oder längerer Laufzeit zum Programmabsturz (Programm läuft überhaupt nicht mehr weiter), so dass es sich eigentlich nicht lohnt, String-Objekte in seinen Programmen zu benutzen. Die Programme sind wegen der fehlerhaften String-Objekte immer latent fehlerhaft.
Das Mittel der Wahl bei der C-Programmierung sind char-Arrays ("C-Strings"), die auch von allen Library-Funktionen verwendet werden.
Anyway, das nur nebenbei.
Dein Fehler dürfte sein, dass Du nach der Anforderung zum Wiegen nicht auf das Wiegeergebnis wartest.
Wie lange braucht die Waage, um nach der Anforderung ein Ergebnis zu liefern?
Eine Sekunde? Zwei Sekunden? Drei Sekunden?
Ich gehe mal von zwei Sekunden aus.
Code:
Serial3.print("s");
Serial.println("wurde gesendet");
delay(2000); // Warte auf das Wiegeergebnis
Serial.println("auf Ergebnis wurde gewartet");
while (Serial3.available()>0)
...
Eine saubere Programmierung ist das aber auch nicht. Normalerweise trennt man so etwas funktionell.
Eine Funktion zum Senden der Wiegeanforderung
Eine Funktion zum Einlesen von Antworten von der Waage
Und ohne Delays.
Ja klar, erstmal den Sketch zum Funktionieren bringen.
Kleiner Tipp: Im Gegensatz zum vergessenen Delay nach dem Senden den Wiegebefehls scheinen Deine beiden anderen delays vollkommen überflüssig zu sein und keine Funktion zu haben.
Falls Du also mehr als eine Wiegung in sechs Sekunden machen möchtest, ggf. die überflüssigen Delays weglassen und nur das eine delay() nach dem Absenden des Wiegebefehls drinlassen, um der Waage Zeit zum Empfang des Wiegebefehls, zum Wiegen und zum Senden des Gewichts als Rückantwort zu geben.