Ich möchte gern mehrere Sensoren über die Virtuellen Pins auslesen, mit einem Sensor Funktioniert es ab 2 Stück nicht mehr

Ich habe gestern alles probiert, bei Delfine die Werte dahinter gesetzt und dann in die if bedingung und und und, ich hatte vergessen im void setup pinMode
Lässt sich aber immer noch nicht kompilieren…
Fehler im void loop
a function-definition is not allowed here befördert ‘{’ token

@Tom1: In deinem Code fehlen auch noch Klammern bei der if-Abfrage - wie der Compiler im Prinzip richtig anmerkt :wink:

Das habe ich in dem Code aus meinem letzten Post auch korregiert. Der lässt sich bei mir definitv auch ohne Fehler übersetzen.

Tipps wie ich sowas auch mal hin bekomme???
Bücher Empfehlung etc.
Das gehört auch nicht zu blynk🙈

@Tom1: Ganz einfach würde ich erstmal immer drei Sachen beachten:

  • Wenn man einen Stand hat, der geht: nur genau eine Änderung machen und dann den Compiler anwerfen. Und dann die nächste … etc.
  • Wenn man bei den Kontrollstruturen festhängt, dann hilft nur eins: Zählen. Jede Klammer die geöffnet wird, muss auch (an der richtigen Stelle) geschlossen werden.
  • Und: kein “Spaghetti-Code”, sondern das Programm in Funktionen aufteilen, die man ggf. auch einzel testen kann (Modultest).

Ok, ich werde es versuchen umzusetzen :grimacing:
Eine Frage hätte ich noch und diese hat auch was mit Blynk zu tun😉
Momentan ist es ja so, das wenn ein Sensor ausfällt man das gar nicht merkt und die anderen Sensoren senden dann auch keine Werte mehr, bzw. sie werden in der Blynk App nicht aktualisiert…
Wäre es möglich, das in der App dann der nicht arbeitende Sensor eine Null,Striche oder ähnliches sendet oder das die anderen 2 weiter ihre Werte in der App aktualisieren?

@Tom1: Sicher geht das.
Einfach die “return;” rausnehmen (die brechen die Ausführung von “sendSensor()” bei einem Fehler ab) und die Werte auf “0” setzen.

void sendSensor()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature(); 

  float h2 = dht2.readHumidity();  
  float t2 = dht2.readTemperature();
  
  float h3 = dht3.readHumidity();    
  float t3 = dht3.readTemperature();

  if (isnan(h) || isnan(t)) // isnan (x) returns 1 if "not a number" i.e. reading failed
  {
    Serial.println("Fehler beim auslesen des Sensors #1"); //
    digitalWrite(RelaisH,LOW);
    //return;
    h0 = 0; //
    t0 = 0; //
  }
  else
  {
    if(h > hMax) 
    {
      digitalWrite(RelaisH,HIGH);
    }  
    if(h < hMin) 
    {
      digitalWrite(RelaisH,LOW);
    }
  }
 
  if (isnan(h2) || isnan(t2)) 
  {       
     Serial.println("Fehler beim auslesen des Sensors #2"); //
    //return;
    h2 = 0; //
    t2 = 0; //
  }

  if (isnan(h3) || isnan(t3)) 
  {       
     Serial.println("Fehler beim auslesen des Sensors #3"); //
    //return;
    h3 = 0;
    t3 = 0;
  }

  Blynk.virtualWrite( V5, h);
  Blynk.virtualWrite( V6, t);
  Blynk.virtualWrite( V7, h2);
  Blynk.virtualWrite( V8, t2);
  Blynk.virtualWrite( V9, h3);
  Blynk.virtualWrite(V10, t3);
}

Wenn alternativ statt “0” eine Fehlermeldung kommen soll, dann würde ich das irgendwie so machen
(Hängt davon ab, welche Art von Widgets Du in der App für die Anzeige benutzt):

void sendSensor()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature(); 

  float h2 = dht2.readHumidity();  
  float t2 = dht2.readTemperature();
  
  float h3 = dht3.readHumidity();    
  float t3 = dht3.readTemperature();

  if (isnan(h) || isnan(t))  // isnan (x) returns 1 if "not a number" i.e. reading failed
  {
    Serial.println("Fehler beim auslesen des Sensors #1");
    digitalWrite(RelaisH,LOW);
    //return;    
    
    Blynk.virtualWrite( V5, "Error DHT1" ); //
    Blynk.virtualWrite( V6, "Error DHT1" ); //     
  }
  else
  {
    Blynk.virtualWrite( V5, h ); //
    Blynk.virtualWrite( V6, t ); //
    
    if(h > hMax) 
    {
      digitalWrite(RelaisH,HIGH);
    }  
    if(h < hMin) 
    {
      digitalWrite(RelaisH,LOW);
    }
  }
 
  if (isnan(h2) || isnan(t2)) 
  {       
    Serial.println("Fehler beim auslesen des Sensors #2");
    //return;
    
    Blynk.virtualWrite( V7, "Error DHT2" ); //
    Blynk.virtualWrite( V8, "Error DHT2" ); //         
  }
  else
  {
    Blynk.virtualWrite( V7, h2); //
    Blynk.virtualWrite( V8, t2); // 
  }

  if (isnan(h3) || isnan(t3)) 
  {       
    Serial.println("Fehler beim auslesen des Sensors #3");
    //return;
    Blynk.virtualWrite( V9, "Error DHT3" ); //
    Blynk.virtualWrite(V10, "Error DHT3" ); //             
  }
  else
  {
    Blynk.virtualWrite( V9, h3); //
    Blynk.virtualWrite(V10, t3); //
  }
}

Hallo @IBK , ich konnte jetzt einige Tage nicht basteln :roll_eyes:
Habe den Sketch mit der Relais Ansteuerung über den Feuchtigkeitswert am Wochenende probiert und habe folgende Situation, sobald der eingestellte Wert erreicht ist, schaltet das Relais , so wie es sein soll…
Dann aber geht es wieder aus und wieder an und das geht die ganze Zeit so meistes bleibt es für 25sec an und geht dan wieder aus.
Kann es sein, das wenn sich der esp die neuen Werte holt, das Relais wieder auf null setzt , wenn ja warum ist dann die Zeit des hin und her schaltens nicht bei fünf sec. wie die Abfrage der Sensoren?

Entschuldige bitte, das ich mich das letze mal nicht bedankt habe, ich dachte ich hätte es getan, aber gerade gesehen, das ich es nicht getan habe​:hear_no_evil::see_no_evil:

Könnte es ein Spannung/Strom Problem sein, das Relais wird mit vom esp gespeist + von Pin VU und - vom Ground angeschlossen ist der esp über Micro USB…

Es sollte natürlich “h” und “t” heissen und nicht “h0” und “t0”:

  if (isnan(h) || isnan(t)) // isnan (x) returns 1 if "not a number" i.e. reading failed
  {
    Serial.println("Fehler beim auslesen des Sensors #1"); //
    digitalWrite(RelaisH,LOW);
    //return;
    h = 0; //
    t = 0; //
  }

Möglich. Kommt auf die Relais an. Bei “kleinen” Relais und mit Freilaufdiode könnte das evtl. gerade noch so gehen.
Aber, ich würde das so nicht machen …

Das mit h0 hatte ich schon gemerkt und geändert :grimacing:
Probiere das morgen mal mit ner extra spannungsversorgung…

Guten Morgen, also mit externer Versorgung ist es das selbe Problem, habe auch ein Video gemacht, kann man das hier hochladen?

@Tom1: … und welche Ausgaben auf der seriellen Konsole und auf den Widgets gibt es im Fehlerfall?

Hallo, es zeigt in der App keinen Fehler an, die Werte aktualisieren sich auch wie eingestellt alle 5 sec.
Ich habe den Sketch auch noch nicht geändert, habe quasi immernoch diese Version ,

#define DHTPIN2 4          // Hier die Pin Nummer eintragen wo der Sensor angeschlossen ist
#define DHTPIN3 5
#define hMax    89
#define hMin    78
#define RelaisH 12



// Uncomment whatever type you're using!
//#define DHTTYPE DHT11     // DHT 11
#define DHTTYPE DHT22   // DHT 22, AM2302, AM2321
//#define DHTTYPE DHT21   // DHT 21, AM2301

DHT dht(DHTPIN, DHTTYPE);
DHT dht2(DHTPIN2, DHTTYPE);
DHT dht3(DHTPIN3, DHTTYPE);
BlynkTimer timer;

// This function sends Arduino's up time every second to Virtual Pin (5).
// In the app, Widget's reading frequency should be set to PUSH. This means
// that you define how often to send data to Blynk App.
void sendSensor()
{
  float h = dht.readHumidity();
  float t = dht.readTemperature(); // or dht.readTemperature(true) for Fahrenheit

  float h2 = dht2.readHumidity();    // Lesen der Luftfeuchtigkeit und speichern in die Variable h
  float t2 = dht2.readTemperature(); // Lesen der Temperatur in °C und speichern in die Variable t
  
  float h3 = dht3.readHumidity();    // Lesen der Luftfeuchtigkeit und speichern in die Variable h
  float t3 = dht3.readTemperature(); // Lesen der Temperatur in °C und speichern in die Variable t

  if (isnan(h) || isnan(t)) {
    Serial.println("Fehler beim Auslesen des 1 Sensors"); 
    digitalWrite(RelaisH,LOW);
    return;
  }
  else
  {
    if(h > hMax) 
    {
       digitalWrite(RelaisH,HIGH);
    }
    if(h < hMin) 
    { 
     digitalWrite(RelaisH,LOW);
    }
  }
  if (isnan(h2) || isnan(t2)) 
  {       
    Serial.println("Fehler beim auslesen des 2 Sensors!");
    return;
  }

   if (isnan(h3) || isnan(t3)) 
   {       
    Serial.println("Fehler beim auslesen des 3 Sensors!");
    return;
  }
  
  
  
  // You can send any value at any time.
  // Please don't send more that 10 values per second.
  Blynk.virtualWrite(V5, h);
  Blynk.virtualWrite(V6, t);
 Blynk.virtualWrite(V7, h2);
  Blynk.virtualWrite(V8, t2);
 Blynk.virtualWrite(V9, h3);
  Blynk.virtualWrite(V10, t3);

}

void setup()
{
  pinMode(RelaisH,OUTPUT);
  // Debug console
  Serial.begin(9600);

  Blynk.begin(auth, ssid, pass);
  // You can also specify server:
  //Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 8442);
  //Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8442);

  dht.begin();
  dht2.begin();
  dht3.begin();
 
  // Setup a function to be called every second
  timer.setInterval(5000L, sendSensor);
}

void loop()
{
  Blynk.run();
  timer.run();
}

Im seriellen Monitor zeigt es an.:

Fehler beim Auslesen des 1 Sensors
Fehler beim Auslesen des 1 Sensors
Fehler beim Auslesen des 1 Sensors
Fehler beim Auslesen des 1 Sensors
Fehler beim Auslesen des 1 Sensors
Fehler beim Auslesen des 1 Sensors
Fehler beim Auslesen des 1 Sensors
Fehler beim Auslesen des 1 Sensors
Fehler beim Auslesen des 1 Sensors

und das wenn die feuchtigkeit von 89%
aller drei Sensoren überschritten ist

Fehler beim auslesen des 3 Sensors!
Fehler beim auslesen des 3 Sensors!
Fehler beim auslesen des 2 Sensors!
Fehler beim Auslesen des 1 Sensors
Fehler beim auslesen des 3 Sensors!
Fehler beim auslesen des 2 Sensors!
Fehler beim Auslesen des 1 Sensors

ich habe den fehler gefunden,denke ich , das muss weg : ( !! digitalWrite(RelaisH,LOW);!!

@Tom1: Das ist irgendwie der falsche Ansatz. Du solltest zusehen, dass der Fehler nicht auftritt, anstatt die Fehlerbehandlung zu löschen.

Ggf. einfach 'mal einen Zähler einbauen und alle 5 Sekunden nur einen der 6 Werten auslesen.

Hallo, habe jetzt erst gesehen, das du geantwortet hast…
Warum ist es nicht richtig,das erste digital Write zu löschen?