Problem mit if...else Schleifen

Hallo zusammen,

in meinem Projekt geht es darum, Tennisbälle mit Hilfe einer hx711 Wägezelle zu wiegen und dann das Gewicht auszuwerten. Das Programm tut, dass was es eigentlich hauptsächlich tun soll, sprich das Wiegen, Auswerten, funktioniert so weit.

Nun wollte ich noch einbauen, dass erkannt wird, ob die Wägezelle in den ersten 5 Sekunden auch 0 Gramm(was häufig nicht der Fall ist), bzw. mit geringer Abweichung, misst. Falls dies nicht der Fall ist, soll es auf einem LCD angezeigt werden.

Das Problem daran ist, dass egal was ich versuche, zum Beispiel durch Drücken auf die Wägezelle zum Start, nie in die else Schleife reinkomme und das Programm einfach weiterläuft, als wäre alles super.

Könnte das an der if Bedingung liegen? Oder hat jemand sonstige Ideen woran das liegen könnte?

Habe mal das komplette Programm angehängt, die Stelle ist markiert.

Ich benutze einen Arduino UNO.

Grüße,
Sven

#include <HX711_ADC.h> 
#include <Wire.h>
#include <LiquidCrystal_I2C.h> 

HX711_ADC LoadCell(5, 6); // Kabelanschluss Wägezelle: grau: GND; schwarz:5; orange:6; gelb:5V 
LiquidCrystal_I2C lcd(0x27,16,2);  //Kabelanschluss LCD: weiß: GND; blau: 5V, lila:A4; grün: A5
int a;
int m;
int t;
float i;
void setup() {
  LoadCell.begin(); 
  LoadCell.start(2000); 
  LoadCell.setCalFactor(1850); 
  lcd.init(); 
  lcd.backlight();
  lcd.clear(); 
  lcd.setCursor(1,0);
  lcd.print("Bitte Warten");
  a==0;
  m==0;
  t=15;
}

void loop() {
  for(int a=0; a<6; a=a+1){
  LoadCell.update(); 
  float i = LoadCell.getData(); 
  delay(1000);
  }

// hier beginnt die Stelle, die Probleme bereitet
  
  if(a=5){
    if(i>-0.05 && i<0.05){
    lcd.clear();
    lcd.setCursor(2,0);
    lcd.print("Bitte Ball");
    lcd.setCursor(4,1);
    lcd.print("auflegen");
    a=a+1;
   }
    else{
    lcd.clear();
    lcd.setCursor(5,0);
    lcd.print("Error");
    lcd.setCursor(1,1);
    lcd.print("Stabilisierung");
    delay(10000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Bitte Neustarten");
    delay(100000000);
   }
   }

// bis zu dieser else Abfrage, in die das Programm nie gelangt

  LoadCell.update(); 
  float i = LoadCell.getData();
  if(i>10){
  
    for(int m=0;m<16;m=m+1){ 
    delay(1000);
    LoadCell.update(); 
    float i = LoadCell.getData();
    t=t-1;
    lcd.clear();
    lcd.setCursor(2,0);
    lcd.print("verbleibende");
    lcd.setCursor(2,1);
    lcd.print("Zeit:");
    lcd.print(t);
    }
    LoadCell.update(); 
    float i = LoadCell.getData();
    lcd.clear();
    lcd.setCursor(5,0);
    lcd.print("Gewicht:");
    lcd.setCursor(7,1);
    lcd.print(i);
    delay(2000);
    lcd.clear();
    lcd.setCursor(2, 0);
    lcd.print("Spielbarkeit:");
     if(i<55.75 && i> 54.00){
      lcd.setCursor(8,1);
      lcd.print("--");
      delay(10000);
     }
     else if(i<56.25 && i> 55.75){
      lcd.setCursor(8,1);
      lcd.print("-");
      delay(10000);
     }
     else if(i<56.75 && i> 56.25){
      lcd.setCursor(8,1);
      lcd.print("o");
      delay(10000);
     }   
     else if(i<57.25 && i> 56.75){
      lcd.setCursor(8,1);
      lcd.print("+");
      delay(10000);
     } 
     else if(i<59.00 && i> 57.25){
      lcd.setCursor(8,1);
      lcd.print("++");
      delay(10000);
     }
     else{
      lcd.clear();
      lcd.setCursor(6,0);
      lcd.print("Error");
      lcd.setCursor(5,1);
      lcd.print("Gewicht");
      delay(10000);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Bitte Neustarten");
      delay(100000000);
     }
       lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Bitte Neustarten");
      delay(100000000);  
  }

}

Es gibt eine if-else "Schleifen"

Du verwechselst sehr oft = und ==

Serenifly:
Es gibt eine if-else "Schleifen"

Du hast bestimmt ein k vergessen. :wink:

@TO: Das a aus der for-Schleife gilt nur in dieser. Lass dort mal das int weg, dann wird die globale Variable benutzt.

Gruß Tommy

Hi

Was passiert, wenn die Wägezelle NICHT auf 0,0000....g runter geht?
Kannst Du von diesem Punkt aus wiegen?
(gehe ich jetzt von aus)
Was spricht dagegen, dieses Gewicht als Tara anzunehmen?

Also klar - zuerst muß das Gewicht 'nahe Null' sein, damit nicht irrtümlich noch ein Tennisball enthalten ist - dann wird 'genullt' und es kann befüllt werden.

Oder wie sieht der Ablauf aus?

MfG

PS: Dein delay(zweiundfünfzigmillionenundeins); ... willst Du nicht wirklich
PPS: Bei Deinen vergleichen - was passiert, wenn ein Ball GENAU 57.25g wiegt?
Genau - Nichts!
Du prüfst nämlich DRÜBER und DRUNTER, aber das genaue Gewicht prüfst Du nicht - Das bei jeder der IFs.

if(a=5)

...ist immer true. ( Und a hat danach den Wert 5 )

Die Warnung ist zugegebenermaßen kryptisch und kann leicht übersehen werden (oder gar ausgeblendet werden) aber es gibt sie:
warning: suggest parentheses around assignment used as truth value [-Wparentheses]

= ist verschieden von ==
Grüße Uwe

Vielen Dank für eure Vorschläge.

Hab das Programm verbessert und noch etwas angepasst, jetzt funktioniert alles.

Dann wäre es im Interesse der Nachwelt gut, wenn Du die Lösung hier vorstellst.

Gruß Tommy

Das stimmt natürlich.

Hier das funktionierende Programm, Stellen mit Veränderungen sind markiert

Grüße Sven

#include <HX711_ADC.h> 
#include <Wire.h>
#include <LiquidCrystal_I2C.h> 

HX711_ADC LoadCell(5, 6); // Kabelanschluss Wägezelle: grau: GND; schwarz:5; orange:6; gelb:5V 
LiquidCrystal_I2C lcd(0x27,16,2);  //Kabelanschluss LCD: weiß: GND; blau: 5V, lila:A4; grün: A5
int a;
int m;
int t;
int f;
float i;
void setup() {
  LoadCell.begin(); 
  LoadCell.start(2000); 
  LoadCell.setCalFactor(1850); 
  lcd.init(); 
  lcd.backlight();
  lcd.clear(); 
  lcd.setCursor(1,0);
  lcd.print("Bitte Warten");
  a=0;
  m=0;
  t=15;
  f=0;   //Veränderung
  delay(1000);
}

void loop() {
  for(a==0; a<5; a=a+1){   //Veränderung
  LoadCell.update(); 
  float i = LoadCell.getData(); 
  delay(1000);
  }
  LoadCell.update(); 
  float i = LoadCell.getData();
  for(f==0; f<1; f=f+1){   //Veränderung
    if(a==5 && i<0.05 && i>-0.05){ //Veränderung
    lcd.clear();
    lcd.setCursor(2,0);
    lcd.print("Bitte Ball");
    lcd.setCursor(4,1);
    lcd.print("auflegen");
   }
    else{
    lcd.clear();
    lcd.setCursor(5,0);
    lcd.print("Error");
    lcd.setCursor(1,1);
    lcd.print("Stabilisierung");
    delay(10000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Bitte Neustarten");
    delay(100000000);
   }
  }
  if(i>10){
  
    for(int m=0;m<16;m=m+1){ 
    delay(1000);
    LoadCell.update(); 
    float i = LoadCell.getData();
    t=t-1;
    lcd.clear();
    lcd.setCursor(2,0);
    lcd.print("verbleibende");
    lcd.setCursor(2,1);
    lcd.print("Zeit:");
    lcd.print(t);
    }
    LoadCell.update(); 
    float i = LoadCell.getData();
    lcd.clear();
    lcd.setCursor(5,0);
    lcd.print("Gewicht:");
    lcd.setCursor(7,1);
    lcd.print(i);
    delay(2000);
    lcd.clear();
    lcd.setCursor(2, 0);
    lcd.print("Spielbarkeit:");
     if(i<=55.75 && i> 54.00){
      lcd.setCursor(8,1);
      lcd.print("--");
      delay(10000);
     }
     else if(i<=56.25 && i> 55.75){
      lcd.setCursor(8,1);
      lcd.print("-");
      delay(10000);
     }
     else if(i<=56.75 && i> 56.25){
      lcd.setCursor(8,1);
      lcd.print("o");
      delay(10000);
     }   
     else if(i<=57.25 && i> 56.75){
      lcd.setCursor(8,1);
      lcd.print("+");
      delay(10000);
     } 
     else if(i<59.00 && i> 57.25){
      lcd.setCursor(8,1);
      lcd.print("++");
      delay(10000);
     }
     else{
      lcd.clear();
      lcd.setCursor(6,0);
      lcd.print("Error");
      lcd.setCursor(5,1);
      lcd.print("Gewicht");
      delay(10000);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Bitte Neustarten");
      delay(100000000);
     }
       lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Bitte Neustarten");
      delay(100000000);  
  }
}

Du verwechselst immer noch = und == in in den ersten paar der for-Schleifen

Hier willst Du for(a=0... schreiben:
for(a==0; a<5; a=a+1){ //Veränderung

== ist ein Vergleich
Die zwei For-Schleifen werfen die Warnung 'warning: statement has no effect'

Meine HX711-ADC Library wirft unzählige Warnungen und nutzt millis() falsch.

Der Progger hat auch in anderen Libs die Angewohnheit (millis()>Startzeit+Wartezeit) zu prüfen - ok, wird Einem erst nach 49,x Tagen auf die Füße fallen, aber finde einen Fehler, Der nur alle 1,5 Monate auftritt ...

MfG