Programm/Sketchfehler? Kann jemand helfen?

Hallo liebe Gemeinde, ich bin ein relativer Neuling in sachen Arduino und Elektronik. Dennoch habe ich ein mehr oder weniger kleines Projekt welches ich mit dem Arduiono versuche zu bewerkstelligen. Ich möchte eine art Nivaueregulierung für einen CNC-Kühlmitteltank programmieren. Nun habe ich zwei Induktive Hallsensoren welche mittels Schwimmer ausgelöst werden. Das untere Nivaue ist solange HIGH wie es nicht unter das minimum fällt. Das obere Nivaue wird erst HIGH gesetzt wenn das Maximum erreicht wird. Soweit funktioniert das ganze auch aber die while Schleife scheint nicht richtig zu funktionieren. Das Relais bleibt HIGH und dann kurz LOW. Es soll aber HIGH bleiben bis das Maximum erreicht wird. Ich find den Fehler nicht kann mir jemand helfen.

anbei einen Auszug aus dem Sketch vielleicht hat auch jemand eine ander Lösung? ich komm nicht weiter.....

Gruss Mike

 schalterstatus = digitalRead(schalter);
  niveauhoch = digitalRead(whoch);
  niveauniedrig = digitalRead(wniedrig);
  if(niveauniedrig == LOW){
    lcd.setCursor(0, 0);
    lcd.print(" Wasser ");
    lcd.setCursor(0, 1);
    lcd.print("fuellen");   
    digitalWrite(Ventil, HIGH);
    while(niveauhoch == LOW);
    {
     niveauhoch = digitalRead(whoch);
    }
    digitalWrite(Ventil, LOW);

Warum eine While Schleife?

if(levelLow == true && levelHigh == false) {
digitalWrite(valve, HIGH);
}
else if(levelLow == true && levelHigh == true {
digitalWrite(valve,LOW);
}
else {
Serial.println("ERROR"); // Tritt ein, wenn levelLow nicht aktiv ist, aber levelHigh schon (sprich Sensor defekt)
}

Sehe ja nicht den ganzen Code, aber ich denke, deine While Schleife hast du eingebaut, weil du Zeitverzögerungen eingebaut hast im anderen Sketch. Stelle, wenn ja, delay nach millis() Methode um (Tutorial : Blink without Delay).

Also hier mal der ganze Sketch. Nicht erschrecken…bin Anfänger.

SKETCH***

#include <LiquidCrystal.h> //LCD 2Zeilen 8Zeichen
#include <OneWire.h> //Themp Dallas
OneWire  ds(10);

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int whoch = 8;
int wniedrig = 7;
int schalter = 6;
int Pumpe = 13;
int Ventil = 9;
int schalterstatus = 0;
int niveauhoch = 0;
int niveauniedrig = 0;

void setup() {
  
  pinMode(whoch, INPUT);
  pinMode(wniedrig, INPUT);
  pinMode(schalter, INPUT);
  pinMode(Pumpe, OUTPUT);
  pinMode(Ventil, OUTPUT);
  
  // set up the LCD's number of columns and rows: 
  lcd.begin(8, 2);
  
  Serial.begin(9600);
}
void loop () {
  //**** Wasserwechsel ****
  schalterstatus = digitalRead(schalter);
  niveauhoch = digitalRead(whoch);
  niveauniedrig = digitalRead(wniedrig);
  if(schalterstatus == HIGH){
    lcd.setCursor(0, 0);
    lcd.print(" Wasser- ");
    lcd.setCursor(0, 1);
    lcd.print(" wechsel ");
    digitalWrite(Pumpe, HIGH);
    while(niveauniedrig == LOW);
     {
    niveauniedrig = digitalRead(wniedrig);
    }
    digitalWrite(Pumpe, LOW);
    delay(100);
    digitalWrite(Ventil, HIGH);
    while(niveauhoch == HIGH);
     {
      niveauhoch = digitalRead(whoch);
    }
    digitalWrite(Ventil, LOW);
    delay(100);
    digitalWrite(Pumpe, HIGH);
    while(niveauniedrig == LOW);
    {
    niveauniedrig = digitalRead(wniedrig);
    }
    digitalWrite(Pumpe, LOW);
    delay(100);
    digitalWrite(Ventil, HIGH);
    while(niveauhoch == HIGH);
     {
      niveauhoch = digitalRead(whoch);
    }
    digitalWrite(Ventil, LOW);
    lcd.clear();
  }
    
  else {
    digitalWrite(Pumpe, LOW);
    digitalWrite(Ventil, LOW);
  }
  //**** Wasser abpumpen ****
  schalterstatus = digitalRead(schalter);
  niveauhoch = digitalRead(whoch);
  niveauniedrig = digitalRead(wniedrig);
  if(niveauhoch == HIGH){
    lcd.setCursor(0, 0);
    lcd.print(" Wasser ");
    lcd.setCursor(0, 1);
    lcd.print("abpumpen");
    digitalWrite(Pumpe, HIGH);
    while(niveauhoch == LOW);
    {
      niveauhoch = digitalRead(whoch);
      delay(1000);
    }
    digitalWrite(Pumpe, LOW);
    lcd.clear();
  }
   else {
    digitalWrite(Pumpe, LOW);
    digitalWrite(Ventil, LOW);
  }
  //**** Wasser aufüllen ****
  schalterstatus = digitalRead(schalter);
  niveauhoch = digitalRead(whoch);
  niveauniedrig = digitalRead(wniedrig);
  if(niveauniedrig == LOW){
    lcd.setCursor(0, 0);
    lcd.print(" Wasser ");
    lcd.setCursor(0, 1);
    lcd.print("fuellen");
    digitalWrite(Ventil, HIGH);
    while(niveauniedrig == HIGH);
    {
    niveauniedrig = digitalRead(wniedrig);
    delay(1000);
    }
    digitalWrite(Ventil, LOW);
    lcd.clear();
  }
   else {
    digitalWrite(Pumpe, LOW);
    digitalWrite(Ventil, LOW);
  }
  
  
   //Themperatur messen
   byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  lcd.setCursor(0, 0);
  lcd.print("W.Temp. = ");
  Serial.print("  Temperature = ");
  lcd.setCursor(0,1); 
  lcd.print(celsius);
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
  
  
  //**** Wasserwechsel Themp ****
  schalterstatus = digitalRead(schalter);
  niveauhoch = digitalRead(whoch);
  niveauniedrig = digitalRead(wniedrig);
  if(celsius > 26.){
    lcd.setCursor(0, 0);
    lcd.print(" Wasser- ");
    lcd.setCursor(0, 1);
    lcd.print(" wechsel ");
    digitalWrite(Pumpe, HIGH);
   
    while(niveauniedrig == LOW);
    {
       niveauniedrig = digitalRead(wniedrig);
    }
    digitalWrite(Pumpe, LOW);
    delay(100);
    digitalWrite(Ventil, HIGH);
    while(niveauhoch == HIGH);
    {
      niveauhoch = digitalRead(whoch);
    }
    digitalWrite(Ventil, LOW);
    lcd.clear();
  }
   else {
    digitalWrite(Pumpe, LOW);
    digitalWrite(Ventil, LOW);
  } 
}

Bevor unfreundlichere Hinweise kommen, bitte setze Deinen Scetch in Codeblocks, damit es für andere Lesbarer wird. Einfach Deinen Beitrag editieren, den kompletten Code markieren, und dann oben in der Leiste über dem Eingabe feld auf die # Schaltfläche drücken. Ober beim kopieren aus der Arduino Software heraus im Menü "Bearbeiten" direkt auf "Code für Forum kopieren" klicken.

Grüße,

Sven

danke ;)

Minimiere zuerst einmal deinen Sketch auf das grundlegendste (Niveaschalter) und teste. Ich glaube nicht, dass du ansatzweise die Hälfte des Sketches verstanden hast.

Delay solltest du bei deiner Variante dringend umgehen mit millis (Blink without Delay).

Es hilft nie, alles auf einmal zu versuchen. Schritt für Schritt geht immer besser XD

Nach kurzem Überfliegen Deines Codes muss ich meinem Vorredner rechtgeben. Beginne langsam, und arbeite Dich Stück für Stück vor. Das Display kann angesprochen werden, wenn der Rest geht. Zuerst nur mit den Schaltern beginnen, und die Zustände über die serielle Schnittstelle am Rechner anzeigen lassen. Und ganz wichtig das delay vermeiden. In dieser Zeit verharrt das Programm an dieser Stelle, und es wird nichts anderes gemacht, noch werden Eingaben erkannt. Desalb wirklich den Sketch "Blink without delay" anschauen und versuchen zu verstehen. Ist nicht so schwer, habe sogar ich irgendwann geschafft.

Hast Du externe Pullup oder Pulldown-Widerstände verwendet? Grüße Uwe

while(niveauniedrig == LOW); { niveauniedrig = digitalRead(wniedrig); }

Na, wer sieht das falsche Semikolon ?