Hilfe relays spielen verrückt

Hallo,

ich will mit einem Potentiometer 4 verschiedene Relays ansteuern. Bei Werten über 100 sollen die Relays anders geschaltet werden.
Leider habe ich ein Problem mit meinem Code. Sobald ich den Potentiometer auf unter 100 regel spielen die Relays verrückt und schalten kreuz und quer.
Anscheinend ließt mein Arduino jedes mal einen neuen Wert vom Potentiometer und schaltet daraufhin neu ohne mit dem 2. oder 3. If else statement weiter zu machen.
Weiß jemand wie ich das am besten behebe? Muss man dazu die Werte interpolieren?

Entschuldigt bitte, ich bin momentan noch im Beginn meiner coding phase.

der Code sieht wie folgt aus:

int sensorPin = A2; // select the input pin for the potentiometer
int sensorPin2 = A0; //lillypad light sensor
int ledPin = 13; // select the pin for the LED
int sensorValue = 0; // variable to store the value coming from the sensor
int sensorValue2 = 0;
int Relay = 3; //Relay_Motor
int Relay2 = 5; //Ventil_vor_Motor
int Relay3 = 6; //Ventil nach Pneu
int Relay4 = 9; //Ventil vor Pneu

void setup() {
// declare the ledPin as an OUTPUT:
pinMode(ledPin, OUTPUT);
pinMode(Relay, OUTPUT);
pinMode(Relay2, OUTPUT);
pinMode(Relay3, OUTPUT);
pinMode(Relay4, OUTPUT);
Serial.begin(9600);
}

void loop() {
int sensorValue = analogRead(A2);
int sensorValue2 = analogRead(A0);

Serial.println(sensorValue);

if (sensorValue >= 100) {
digitalWrite(Relay, HIGH);
digitalWrite(Relay2, LOW);
digitalWrite(Relay3, LOW);
digitalWrite(Relay4, HIGH);
} else {
if (sensorValue2 >=100) {
digitalWrite(Relay, HIGH);
digitalWrite(Relay2, HIGH);
digitalWrite(Relay3, LOW);
digitalWrite(Relay4, HIGH);
} else {
digitalWrite(Relay, LOW);
digitalWrite(Relay2, LOW);
digitalWrite(Relay3, HIGH);
digitalWrite(Relay4, HIGH);
}
}

// read the value from the sensor:
sensorValue = analogRead(sensorPin);
// turn the ledPin on
digitalWrite(ledPin, HIGH);
// stop the program for milliseconds:
delay(sensorValue);
// turn the ledPin off:
digitalWrite(ledPin, LOW);
// stop the program for for milliseconds:
delay(sensorValue);
}

Beste Grüße
und vielen Dank im vorraus

Noch eine kurze Ergänzung. Anscheinend bedingt das Potentiometer die Dauer der Schaltung. Heißt bei Werten knapp unter 100 dauert es länger bis es wieder umschaltet als bei geringen Werten. Das Potentiometer ist auf A2 im analog in geschaltet.

Tut mir leid ich seh hier den Code vor lauter bäumen nicht mehr.

hi,

nur so beim überfliegen bemerkt:

Du darfst nicht EINEN grenzwert festlegen, sondern mußt bereiche definieren. lies mal den wert aus, den der poti liefert, das wird immer ein bißchen hin- und herspringen. sag also besser: wenn ausgeschaltet, dann einschalten bei über 105. wenn eingeschaltet, dann ausschalten bei unter 95.

damit schafft Du einen puffer, der ungenauigkeiten bei der messung eliminiert.

gruß stefan

Was ich auf anhieb sehe ist das folgender Teil zu deinen Verzögerungen führt:

// read the value from the sensor:
  sensorValue = analogRead(sensorPin);    
  // turn the ledPin on
  digitalWrite(ledPin, HIGH);  
  // stop the program for <sensorValue> milliseconds:
  delay(sensorValue);          
  // turn the ledPin off:        
  digitalWrite(ledPin, LOW);  
  // stop the program for for <sensorValue> milliseconds:
  delay(sensorValue);

Die delays mit dem sensorValue als Parameter lassen dein Programm immer so lange stehen bis die Zeit in millisekunden vergangen ist die dein Poti als Wert angibt.
Also um so höher dein Potiwert um so länger die Pausen. Und das gleich 2 mal.
Lass dir den Wert doch mal ausgeben dann siehst du es bestimmt:

Ich vermute den Grund für das hin und her schalten darin:
Du kommst bei Poti unter 100 in die ELSE deiner ersten IF
Hier wird nochmal nach dem Analogwert von A0 abgefragt.
Hängt an A0 was dran?
Wenn der offen ist springen die Werte.
Lass dir den Wert doch mal ausgeben dann siehst du es bestimmt auch:

 if (sensorValue >= 100) {
  digitalWrite(Relay, HIGH);
  digitalWrite(Relay2, LOW);
  digitalWrite(Relay3, LOW);
  digitalWrite(Relay4, HIGH);
  } else { 
 Serial.println(sensorValue2);     // Diese Zeile hier mal dazu schreiben
    if (sensorValue2 >=100) {
    digitalWrite(Relay, HIGH);
    digitalWrite(Relay2, HIGH);
    digitalWrite(Relay3, LOW);
    digitalWrite(Relay4, HIGH);
    }  else  {
      digitalWrite(Relay, LOW);
      digitalWrite(Relay2, LOW);
      digitalWrite(Relay3, HIGH);
      digitalWrite(Relay4, HIGH);
    }
  }

Und was Eisbaer meint stimmt natürlich auch. Google mal nach Hysterese

Besten Dank! Die änderung im Code hat super geklappt. Jetzt läuft alles bestens