if in if Schaltung

Hallo, ich habe ein Problem mit einem Sketch.
Ich möchte das wenn ein ir-Sensor (ScharpIR GP2Y0A21YK) eine bestimmte Entfernung misst,und eine bestimmte Temperatur (DHT22) herrscht,ein Relais geschalten wird.

Ich hab schon was in der art geschrieben aber es funktioniert noch nicht so recht

int maxTemp = 13;
int dis = 50;
.  .  .
if(dis < 20) {
    
  if(t > maxTemp) {
      digitalWrite(Relais, LOW);
  } else {
     digitalWrite(Relais, HIGH); 
  }
  
  } else {
     digitalWrite(Relais, LOW);
  }

Könnte mir vielleicht jemand sagen warum es nicht Funktioniert?

Gruß J.007

Beschreibe Deine Bedingung mal genauer. Wann soll das Relais anziehen und wann nicht. Zieht das Relais bei High oder Low?

Gruß Tommy

Du kannst Bedingungen verknüpfen, das macht's leichter.

Siehe Boolean Operators.

Weil es kein Setup und keine Loop gibt. Poste den kompletten Sketch, dann sehen wir evtl. auch einen Fehler.

Hier der komplete Sketch

#include "DHT.h"
#include <SharpIR.h>
 
#define DHTPIN A0     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
#define Relais 4

#define ir A1
#define model 20150
 
int maxTemp = 13;
int dis = 50;
 
DHT dht(DHTPIN, DHTTYPE);

SharpIR sharp(ir, 25, 93, model);
 
void setup() {
  pinMode(Relais, OUTPUT);
  pinMode (ir, INPUT);
  Serial.begin(9600); 
  dht.begin();
}
 
void loop() {
  {
  // Wait a few seconds between measurements.
  delay(3000);
 
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  // Read temperature as Celsius
  float t = dht.readTemperature();
  
  // Check if any reads failed and exit early (to try again).
  if (isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }


  if(dis < 20) {
    
  if(t > maxTemp) {
      digitalWrite(Relais, LOW);
  } else {
     digitalWrite(Relais, HIGH); 
  }
  
  } else {
     digitalWrite(Relais, LOW);
  }


  
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.println(" *C ");
 
}

{
  delay(2000);    // it gives you time to open the serial monitor after you upload the sketch
  
  

  unsigned long pepe1=millis();  // takes the time before the loop on the library begins
  
  

  int dis=sharp.distance();  // this returns the distance to the object you're measuring


  Serial.print("                       Mean distance: ");  // returns it to the serial monitor
  Serial.println(dis);
  
}

}

Das ist einfach nur Murks. Schlecht formatiert. Wirre und überflüssige Klammersetzung. Ein großer Fehler ist dass eine globale Variable “dis” durch lokale Versionen überdeckt wird.

Sieht sehr stark nach Copy/Paste aus und du hast Code der eigentlich an den Anfang gehört einfach mal irgendwo ans Ende kopiert. Siehe die Kommentare am Ende.

Wie schon geschrieben wurde, wenn Du es zusammenfaßt, wird es einfacher:

   if ((dis < 20) && (t > maxTemp)) {
      digitalWrite(Relais, HIGH);
    } else {
      digitalWrite(Relais, LOW);
    }

Wenn die Distanz zu klein und die Temperatur zu groß, dann geht der Ausgang auf HIGH, sonst auf LOW. Wenn Du eine andere Logik möchtest, mußt Du entweder die Relationen ändern oder HIGH und LOW tauschen.

Auch nicht gut, wenn auch ohne Folgen:

void loop () {{ ... }}

Serenifly: Sieht sehr stark nach Copy/Paste aus und du hast Code der eigentlich an den Anfang gehört einfach mal irgendwo ans Ende kopiert. Siehe die Kommentare am Ende.

Und dadurch wird der Wert des IR-Sensor niemals ausgewertet.

Und wie gesagt das hier:

 int dis=sharp.distance();

Das legt eine lokale Variable dis an und ist was anderes als die globale Version.

Überhaupt gehört das an den Anfang von loop(). Erst messen. Dann auswerten!