Berechnung funktioniert nicht (evt Überlauf)

Hallo zusammen

Ich berechne anhand des gemessenen Abstandes eines Laser-Abstandssenors die prozentuale Füllmenge eines Fasses. Jedoch gelingt die Berechnung nicht. Kann es sein dass ich ein Überlauf generiere? Ich habe mich mit einer float Variablen und einer int Variablen versucht. Leider klappt beides nicht. Hier ein Ausschnitt meines Codes:
:sweat_smile: Entschuldigt... bin noch am Anfang meiner Programmier-Künste

//___PINS__________________________________________________________________________________
int bewegungsm = 8;                         //Datapin Bewegungsmelder
int piezo = 10;                             //Summer
int taster = 9;                             //Knopf

//___VARIABELN_____________________________________________________________________________
int helligkeit = 255;                       //LED Helligkeit
int red = 0;                                //LED Farbe im Rot
int green = 0;                              //LED Frabe im Grün
int blue = 0;                               //LED Farbe im Blau

int Abstand_mm = 0;                         //Aktuelle Messung in mm
int hohe = 860;                             //Höhe des Fasses in mm
float voll = 160;                           //Abstand Sensor zum Lack bei einem vollen Fass in mm

float fuell = 100;                          //Aktueller Prozentsatz
int prozent = 100;                          //Aktueller Prozentsatz in Ganzzahl

int gewichtv = 125;                         //Gewicht vom vollen Fass (v=voll)
float gewichtg = 125;                       //Aktuelles Gewicht (wird durch den Prozentsatz berechnet)(g=gebrauch)

long runTime = 0;                           //Laufzeit seit der letzten Messung
long interval = 15000;                      //Anzahl Loop Durchläufe bis zur Messung

byte bewegung = 1;                          //Status ob Bewegung vorhanden ist
int tasters = 0;                            //Status ob der Knopf gedrück wird - 0 = nein, 1 = wird gedrückt
//__________________________________________________________________________________________


void setup()
{
  pinMode(bewegungsm, INPUT);
  pinMode(taster, INPUT);
  pinMode(piezo, OUTPUT);
  Serial.begin(115200);                     //Lasermessung
  Abstand.begin(115200);                    //Lasermessung
  lcd.init();                               //LCD Display
  startup ();                               //Startanimation
  messung ();                               //Erste Messung  
}


void loop(){
  runTime = ++runTime;
  delay(1);
  tasters = digitalRead(taster);
  if (runTime >= interval) {
    messung();
    delay(1);
  }

  if (tasters == HIGH) {
    lcd.backlight();
    messung();
  }
}

void messung() {
  abstand_messung();
  berechnung();
  delay(1);
  lcd_display();
  delay(1);
  ledlcd();
  lcd.noBacklight();
  runTime = 0;
}


void abstand_messung(){
  readData(Data);
  Abstand_mm = readD(Data);
  if (Abstand_mm >= 0) {
    Serial.print("prozent: ");
    Serial.println(prozent);
    Serial.print("Abstand_mm: ");
    Serial.println(Abstand_mm);
    Serial.print("hohe: ");
    Serial.println(hohe);
    Serial.print("voll: ");
    Serial.println(voll);
    Serial.print("gewichtg: ");
    Serial.println(gewichtg);
    Serial.print("gewichtv: ");
    Serial.println(gewichtv);
  } else {
    Serial.println("Invalid data");
    Serial.print("\n");
  }
  delay(2);
}
int readD(uint8_t *buf)
{
  int d;
  char *p = strstr(buf, "Range Valid");
  if (p != 0) {
    d = atoi(&Data[25]);
    return d;
  } else {
    return -1;
  }
}

void readData(uint8_t *buf)
{
  bool flag = 0;
  uint8_t ch;
  while (!flag) {
    if (readN(&ch, 1) == 1) {
      if (ch == 'S') {
        Data[0] = ch;
        if (readN(&ch, 1) == 1) {
          if (ch == 't') {
            Data[1] = ch;
            if (readN(&ch, 1) == 1) {
              if (ch == 'a') {
                Data[2] = ch;
                if (readN(&Data[3], 30) == 30 && Data[31] == 'm' && Data[32] == 'm') {
                  flag = 1;
                }
              }
            }
          }
        }
      }
    }
  }
}
int readN(uint8_t *buf, size_t len)
{
  size_t offset = 0, left = len;
  long curr = millis();
  while (left) {
    if (Abstand.available()) {
      buf[offset++] = Abstand.read();
      left--;
    }
    if (millis() - curr > 500) {
      break;
    }
  }
  return offset;
}

void berechnung() {
  //Abstandsmessung und Berechung
  bewegung = digitalRead(bewegungsm);

  //Berechnung
    gewichtg = (gewichtv * (Abstand_mm / (hohe - voll)));
    prozent = ((gewichtg / gewichtv)*100);
    fuell = ((gewichtg / gewichtv)*100);

  //LCD erneuern
  lcd.clear();

}

Vielleicht weiss jemand von euch weiter und kann mir sagen was ich falsch mache. Ich erhalte immer nach der zweiten Messung den Wert null.

Was für Daten liefert denn dieser ominöse Sensor?
Datenblatt?

Die wichtigste Variable Data ist undefiniert.

Da sollte man anfangen...

Ich verstehe das Programm nicht.

Sowas z.B.

Bei einer Berechnung erwarte ich eine Berechnung und nicht ein digitalRead, oder ein lcd.clear().
Welches lcd überhaupt?

Wenn ich mir da die If Kaskade anschaue, bin ich ganz raus.....
If kann ich nicht (gut), und schon gar nicht in dem Ausmaß.

Sollte das nicht unsigned long sein?

und diese const byte, oder gar constexpr?


Offensichtlich soll das wohl sowas wie ein Parser sein, aber was soll es parsen?
Dazu fehlt jegliche Information.


Leider ist das Programm nicht testbar, da wesentliche Bestandteile fehlen.
bis zur Untestbarkeit verstümmelt.

Muß ein Pointer nicht 16 Bit breit sein?

Da wird aus 25 Charakter eine Zahl gemacht und dann in 5 Zeichen (int) gepresst.

Berechnungen werden standartmäßig als signed int berechnet. In einem signed int können Zahlen von ca -32000 bis ca +32000 gespeichert werden und es gibt keine Nachkommastellen. Dadurch kann es leicht zu "Rechenfehlern" kommen.

Ich muß meinen Vorrednern Recht geben daß der gezeigte Sketch unvollständig ist, daß Informationen bezüglich Sensor, Arduino-Model, vom Sensor ausgegebenen Daten, verwendetes Dislay, verwendete Bibliotheken fehlen.

Ich weiß jetzt nicht welche Flüssigkeit sich im Faß befindet aber ich nehme mal an, daß es eine Flüssigkeit mit einem hohen Wasseranteil ist. Ich bezweifle daß der Laser-Abstandssenors wasserfest/wasserdicht ist, dh für eine Feuchtigkeitsgesättigte Umgebung mit zeitweise kondensierender Wasser geeigent ist.

Grüße Uwe

Data wird (geraten) ein Text sein, der ab dem 25. Zeichen Ziffern enthält?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.