Delay nur auf eine Funktion laufen lassen

Hallo,
ich habe folgendes Problem ich steuere Funksteckdose per arduino an und kann dies über ein Webinterface tun. Es soll aber auch möglich sein, dass eine Steckdose per Temperatur geschaltet wird, hierzu habe ich folgende Funktion unter loop eingefügt:

{{if (getTemp()<24){
  mySwitch.switchOff("00001", 2);  //-------Steckdose 2
    } 
    else 
    mySwitch.switchOn("00001", 2);  //-------Steckdose 2
   delay(3000);
   }}

Nur habe ich jetzt das Problem, dass ich auch 3 sekunden warten muss wenn ich im Webinterface schalten möchte, kann man das delay so eingrenzen, das es nur auf die eine Funktion läuft? und nicht auf den ganzen Sketch? Und bevor einer fragt es geht auch ohne Delay nur ich möchte rechenlast vom Prozessor nehmen oder macht das nichts aus wenn er ununterbrochen prüft?

das Delay nur für eine Funktion laufen lassen geht nicht da delay den Sketch für die angegebene Zeit aufhält. Du kannst es mit millis() machen siehe:

Du kontrollierst einfach die Temperatur nur alle 3 Sekunden. Ich würde Dir auch raten den Zustand der Steckdose zwischenzuspeichern zb in der Variablen “Steckdose2” und nur bei einer Zustandsänderung den Befehl an die Steckdose zu senden.

// Initialiation wie im Beispiel
...
 if(currentMillis - previousMillis > 3000)
   {
   previousMillis = currentMillis;  
   if (getTemp()<24 && Steckdose2==1)
      {
      mySwitch.switchOff("00001", 2);  //-------Steckdose 2
      Steckdose2==0;
      } 
   if (getTemp()>=24 && Steckdose2==0){   
      mySwitch.switchOn("00001", 2);  //-------Steckdose 2
      Steckdose2==1;
      }
   }

Die Kontrolle es Internerinterfaces gibst Du außerhalb der oben aufgeführten if-Bedingung.

Grüße Uwe

Ich habe folgendes nun implementiert, aber es schaltet nur immer ein aber nicht aus hat einer eine Idee warum?

   int previousMillis =0; 
  int Steckdose2; 
   if(currentMillis - previousMillis > 3000)
   {
     
   previousMillis = currentMillis;  
   
      if (getTemp()>=24 && Steckdose2==0){   
      mySwitch.switchOn("00001", 2);  //-------Steckdose 2
      Steckdose2==1;
    
  if (getTemp()<=24 && Steckdose2==1){   
      mySwitch.switchOff("00001", 2);  //-------Steckdose 2
      Steckdose2==0;
      }    
  
      } 
   }

du solltest natürlich auch currentMillis aktualisieren bei jedem durchlauf (mit millis())

ich bin irgendwie zu doof dafür währe einer so freundlich und würde das millis() bitte einmal in meinen kleinen Skript von oben einsetzten

unsigned lon previousMillis =0; 
int Steckdose2; 
   if(millis() - previousMillis > 3000)
   {
     
   previousMillis = millis();  
   
      if (getTemp()>=24 && Steckdose2==0){   
      mySwitch.switchOn("00001", 2);  //-------Steckdose 2
      Steckdose2==1;
    
  if (getTemp()<24 && Steckdose2==1){   
      mySwitch.switchOff("00000", 2);  //-------Steckdose 2
      Steckdose2==0;
      }    
  
      } 
   }

3 Bemerkungen

  1. millis() liefert unsigned long dementsprechend mussen die Variablen deklariert werden, sonnst kommt es schnell zu einem überlauf
  2. wenn du in deinen if einmal <=24 und einmal >=24 hast, was passier wenn du genau 24 hast?
  3. du hast im zweiten if mySwitch.switchOff(“00001”, 2) da muss sicher ein mySwitch.switchOff(“00000”, 2) hin damit es aus geht.

Ich möchte auch ein paar Steckdosen übers web steuern könntst du deinen Code für den Webserver mal einstellen? Mir ist noch nicht so ganz klar, wie ich von meiner http Seite die variablen in meinem Arduino ändere

... Und eine Zuweisung erfolgt im Gegensatz zu einem Vergleich nicht mit Steckdose2==0 sondern mit Steckdose2=0;

Außerdem solltest du mal den Code richtig einrücken (es gibt auch ein auto-format im der IDE), dann wird dir das nächste Problem klar :)