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:
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.