Problem mit float Vergleich in if Abfrage

Hallo Leute,

ich bin noch blutiger Anfänger mit dem Arduino und stehe gerade voll auf dem Schlauch. In folgendem Sketch:

#include <HX711_ADC.h> // https://github.com/olkal/HX711_ADC
#include <Wire.h>
#include <LiquidCrystal_I2C_Hangul.h>


LiquidCrystal_I2C_Hangul lcd(0x27,16,2); //LCD 클래스 초기화

HX711_ADC LoadCell(4, 5); // parameters: dt pin, sck pin
const float gewicht0 = 150; //Startwägung
const float gewicht1 = 200; //untere Grenze
const float gewicht2 = 500; //obere grenze
const int dauer = 5000; // Relaisanzugsdauer

byte teil = 0; //Schaltzustand 0 kein Gewicht, 1 Beginn Wägung, 2 Gutteil 1, 3 Ausschuss, 4 Gutteil 2
//byte rueckgabe = 0;

float gewicht = 0;

void setup() {
  //start serial connection
  Serial.begin(9600);
  //configure pin 6 & 7 as an input and enable the internal pull-up resistor
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);  
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);  

  LoadCell.begin(); // start connection to HX711
  LoadCell.start(2000); // load cells gets 2000ms of time to stabilize
  LoadCell.setCalFactor(1059.75); // calibration factor for load cell => strongly dependent on your individual setup

  lcd.init();
  lcd.begin(16,2);
  lcd.backlight();

}


float wiegen ()
{
  LoadCell.update();
  float g = LoadCell.getData();
  return g;  
}

byte gewichtauswerten(float check){
  byte rueckgabe;
  if (check >> gewicht0 && check << gewicht1) {
    rueckgabe = 2; // Gutteil 1
    }
  else if (check >> gewicht1 && check << gewicht2) {
    rueckgabe = 3; // Ausschuss
  }
  else if (check >> gewicht2) {
    rueckgabe = 4; // Gutteil 2
  }
  else if (check >> 2 && check << (gewicht0 - 3)) {
    rueckgabe = 1; // Beginn Wägung
  }
  else {
    rueckgabe = 0; // kein Gewicht
  }
  return rueckgabe; 
  
}

void loop() {
//  read the pushbutton value into a variable
/*  int sensorVal1 = digitalRead(6);
  int sensorVal2 = digitalRead(7);
  //print out the value of the pushbutton
  Serial.println(sensorVal1);
  Serial.println(sensorVal2); */

    gewicht = wiegen();
    teil = gewichtauswerten(gewicht);
    Serial.println(teil);
    lcd.setCursor(4,0);
    lcd.print(F("            "));
    lcd.setCursor(0,0);
    lcd.print("Gew. ");
    lcd.print(gewicht);
    lcd.print(" g");
    
    Serial.print("Momentan liegen auf der Waage ");
    Serial.print(gewicht);
    Serial.println(" g");

    delay(13);

  /* // Keep in mind the pull-up means the pushbutton's logic is inverted. It goes
  // HIGH when it's open, and LOW when it's pressed. Turn on pin 13 when the
  // button's pressed, and off when it's not:
  if (sensorVal1 == LOW) {
    digitalWrite(8, LOW);
  } else {
    digitalWrite(8, HIGH);
  }
  if (sensorVal2 == LOW) {
    digitalWrite(9, LOW);
  } else {
    digitalWrite(9, HIGH);
  }*/

/*
// gewichtsabhängiges Relaisschalten
  if (gewicht >= 10 && gewicht <=100){
  for (int i=0; i<50; i++){
    gewicht = wiegen();
    delay(13);
}
  }
  if (gewicht >= gewicht0 && gewicht <= gewicht1) {
    digitalWrite(8, LOW);
    lcd.setCursor(0,1);
    lcd.print("Gutteil 1");
    delay(dauer);
    for (int i=0; i<50; i++){
    gewicht = wiegen();
    delay(13);
    }
    LoadCell.start(2000); // load cells gets 2000ms of time to stabilize
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
  } else {
    if (gewicht >= gewicht2) {
    digitalWrite(9, LOW);
    lcd.setCursor(0,1);
    lcd.print("Gutteil 2");
    delay(dauer);
    for (int i=0; i<50; i++){
    gewicht = wiegen();
    delay(13);
    }
    LoadCell.start(2000); // load cells gets 2000ms of time to stabilize
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
    
  } else{
    if (gewicht >= gewicht1 && gewicht <= gewicht2) {
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    lcd.setCursor(0,1);
    lcd.print("Ausschuss");
    delay(dauer);
    for (int i=0; i<50; i++){
    gewicht = wiegen();
    delay(13);
    }
    LoadCell.start(2000); // load cells gets 2000ms of time to stabilize
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
   
    } else {
    lcd.setCursor(0,1);
    lcd.print("kein Teil");
      if (sensorVal1 == LOW || sensorVal2 == LOW){
    
    if (sensorVal1 == LOW) {
    digitalWrite(8, LOW);
  } else {
    digitalWrite(8, HIGH);
  }
  if (sensorVal2 == LOW) {
    digitalWrite(9, LOW);
  } else {
    digitalWrite(9, HIGH);
  }}
    else {
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
    }
  }
}}*/
}

bekomme ich beim compilieren immer einige Fehler in dem Unterprogramm “gewichtauswerten” der Art:
error: invalid operands of types ‘float’ and ‘const float’ to binary ‘operator>>’

  • if (check >> gewicht0 && check << gewicht1)*
    Ich wollte Unterprogramme (ich glaube es heißt Methoden bei der Arduino Programmierung) ausprobieren und habe daher “wiegen” und “gewichtauswerten” aus dem Loop versucht rauszunehmen. Ich wollte dann eine Zahl von 1 bis 4 zurück geben, die ich dann über ein switch Kommando in verschiedene Relaisschaltzustände umwandle.
    Wenn ich den Bereich “gewichtsabhängiges Schalten” im Loop wieder aktiviere und das Unterprogramm “gewichtauswerten” deaktiviere, kommt keine Fehlermeldung, obwohl ich im loop doch eigentlich dieselben Vergleiche mit der if Struktur durchziehe.
    Wie kann ich in der Methode gewichtauswerten float für das gemessene Gewicht beibehalten und trotzdem den Vergleich mit if hinbekommen?

Leonhard75:
if (check >> gewicht0 && check << gewicht1) {

void loop() {

if (gewicht >= gewicht0 && gewicht <= gewicht1) {

“<<” ist nicht das selbe wie “<=”

C+±Programmierung: Liste der Operatoren

Gruß Fips

Hey vielen Dank für die schnelle Hilfe!