Ablaufsteuerung Nr. X ;-) (Feinschliff)

Hallo in die Runde,

ich hänge grad etwas an einer Ablaufsteuerung… bzw. ich bin mir nicht ganz sicher, ob das so laufen kann…

die Steuerung soll von 3 Sensoren “Sensor1*” (min. 1) getriggert werden, mit der Bedingung, dass ein Wert “Auto1” auch “1” ist.*
Die Trigger kommen per Funk- in der Loop wird dann “void switchlamps()” nur aufgerufen, wenn ein Trigger aktiv ist.
Relevant ist nur die positive Flanke- die negative ist nicht definert- daher habe ich den Weg gewählt im Sketch den Trigger direkt wieder auf 0 zu setzen- damit wird das nächste 1 sofort wieder gewertet (hoffe ich).
Mit jedem neuen Trigger soll der Ablauf von vorn gestartet werden, egal wie weit er aktuell ist.
Nach dem Trigger sollen dann einzelne Aktionen zeitlich versetzt gestartet werden.
Ich bin mir nicht sicher, ob es so korrekt umgesetzt ist und hoffe auf konstruktive Kritik.
* *void switchlamps() {   int Zeitzaehler1;         if ((Sensor1[3] == 1 || Sensor1[4] == 1 || Sensor1[5] == 1) && Auto1 == 1)   {  display121a();   for (int i = 0; i < 5; i++)     { Status1[i+1] = AutoProg1[i];       EreigniszaehlerFlur++;Ereigniszaehleralles++;       Zeitzaehler1 = millis();       Sensor1[3] = 0; Sensor1[4] = 0; Sensor1[5] = 0; display121b();     }}              if ( millis() - Zeitzaehler1 > VerzoegerungBad)         {  for (int i = 0; i < 5; i++)             { Status2[i+1] = auswarm[i];}}             if ( millis() - Zeitzaehler1 > VerzoegerungKueche)         {  for (int i = 0; i < 5; i++)             { Status3[i+1] = auswarm[i];}}                   if ( millis() - Zeitzaehler1 > VerzoegerungWohnzimmer)         {  for (int i = 0; i < 5; i++)             { Status4[i+1] = auswarm[i];}}                    if ( millis() - Zeitzaehler1 > VerzoegerungWohnzimmer + 76)         {  for (int i = 0; i < 5; i++)             { Status8[i+1] = 0;}}                    if ( millis() - Zeitzaehler1 > VerzoegerungKueche + 100)         {  for (int i = 0; i < 5; i++)             { Status7[i+1] = 0;}}                      if ( millis() - Zeitzaehler1 > Flurwarten)         {  for (int i = 0; i < 5; i++)             { Status1[i+1] = 0;}}    }* *

Ich bin mir nicht sicher, ob es so korrekt umgesetzt ist und hoffe auf konstruktive Kritik.

  int Zeitzaehler1; ist entweder =millis() oder undefiniert.
Du willst ihn sicher als
** ** static** **
deklarieren.

Der Rest und deine Beschreibung war mir zu kompliziert zu verstehen. Auch wenn ich berücksichtige, dass in deiner Beschreibung irgendwo ein [ i ] verloren gegangen ist.

Zu einer Funktion, die reichlich globale Variablen verwendet, solltest du zumindest diese Variablendefinitionen mitliefern. Wenn du uns nicht damit belästigen willst, wann die Funktion aufgerufen wird.
(Hoffe, das geht noch als konstruktiv durch)

danke für die Rückmeldung. Der gesamte Sketch ist sehr lang... das will ich euch ersparen... ;-)

Alles was mit "SensorX*" benannt ist sind PIR- Sensoren die ihren Status via Funk liefern- da gibt es nur "1" und "0".* Und alle anderen Variablen, die irgendwas mit "warten" oder "verzögerung" etc. im Namen haben sind Zeiten zwischen 100ms und 1.800.000ms. Ich hoffe das hilft soweit... Letztendlich soll in einem Zimmer beim Betreten das Licht eingeschaltet werden und in allen Nachbarräumen leicht verzögert aus geschaltet werden. Wird über einen längeren Zeitraum keine Bewegung registriert soll das Licht wieder aus gemacht werden... Ich schreibe es mal in Klartext: ``` *void switchlamps() if ((PIR1 = aktiv oder PIR2 = aktiv oder PIR3 = aktiv) und das Automatikprogramm = aktiv)   { registriere den Start des Ablaufs;

    mache das Licht im Flur an;

    20s nach start: mache das Licht im Bad aus;     25s nach start: mache das Licht in der Küche aus;     30s nach start: mache das Licht im Wohnzimmer aus;

    30min nach start: mache das Licht im Flur wieder aus;   }* ``` die "void switchlamps()" wird nur aufgerufen, wenn eine Bewegung erkannt wurde.... darum bin ich mir nicht sicher, ob ich die zeitlichen Abläufe überhaupt da rein packen kann..... * mache*

also das deklarieren des Zeitzaehlers als static bringt nichts bzw. geht nicht :-/

MaHa76: die "void switchlamps()" wird nur aufgerufen, wenn eine Bewegung erkannt wurde.... darum bin ich mir nicht sicher, ob ich die zeitlichen Abläufe überhaupt da rein packen kann.....

Ich denke, nein. Die Abfrage der millis() müßte nach meiner Einschätzung ständig durchlaufen werden, sonst geht das Licht nicht zum richtigen Zeitpunkt aus.

Ich bastel mal noch etwas und rufe dann erstmal die voidswitchlamps direkt von der loop auf, damit da bei jedem loop-loop was passieren kann.... ganz schön kniffelig das ganze ;-)

MaHa76: rufe dann erstmal die voidswitchlamps direkt von der loop auf, damit da bei jedem loop-loop was passieren kann....

Das is mal eine gute Idee. Siehe Nachtwächter Beispiel

Ja, das hab ich mir angeschaut... der Unterschied ist aber dass der Nachtwächter seine Runden ohne Unterbrechung dreht... Bei mir fährt er mit den Fahrstuhl hoch und muss dann die Treppe Stufe für Stufe runter laufen... und wenn er wieder oben ist wartet er auf das Startsignal, und wenn er die Treppe runterläuft stellt er auf jeder Stufe, bei der sein Wecker klingelt eine Lampe ab....

MaHa76: Bei mir fährt er mit den Fahrstuhl hoch und muss dann die Treppe Stufe für Stufe runter laufen... und wenn er wieder oben ist wartet er auf das Startsignal, und wenn er die Treppe runterläuft stellt er auf jeder Stufe, bei der sein Wecker klingelt eine Lampe ab...

Das ist nur in deinem Kopf. Denke das ganze mal besser durch und strukuriere es. Einen PAP anzufertigen hilft einem selber manchmal ungemein auf die Sprünge

Aaaaalsooooo.... ich hole mal weiter aus....

hier die Variablen- ich hoffe ich habe keine vergessen- die meisten Werte ändern sich, abhängig von bestimmten Umgebungsbedingungen...

unsigned long letztesUpdate1;
unsigned long letztesUpdate2;
unsigned long EZFlur; //zaehlt den Ereigniszahler wieder runter
unsigned long EZFlurdelay = 6000;
unsigned long startFlurwarten;
long Flurwarten = 30000;
unsigned long EZBad;
unsigned long EZBaddelay = 30000;
unsigned long startBad;
long VerzoegerungBad = 10000;
unsigned long startBadwarten;
long Badwarten = 1800000; // 1.800.000 = 30min
unsigned long EZKueche;
unsigned long EZKuechedelay = 30000;
unsigned long startKueche;
long VerzoegerungKueche = 10000;
unsigned long startKuechewarten;
long Kuechewarten = 600000; // 1.800.000 = 30min
unsigned long EZWohnzimmer;
unsigned long EZWohnzimmerdelay = 12000;
unsigned long startWohnzimmer;
long VerzoegerungWohnzimmer = 10000;
unsigned long startWohnzimmerwarten;
long Wohnzimmerwarten = 1800000; // 1.800.000 = 30min
unsigned long EZSchlafzimmer;
unsigned long EZSchlafzimmerdelay = 30000;
unsigned long startSchlafzimmerwarten;
long Schlafzimmerwarten = 30000;
unsigned long EZalles;
unsigned long EZallesdelay = 120000;
unsigned long resetPIR;
unsigned long resetPIRdelay = 233;
unsigned long resetPIRFlur;
unsigned long resetPIRFlurdelay = 331;

So, wie ich es hier gestaltet habe, funktioniert es, allerdings hängt es manchmal, wenn sich Aktionen auf Grund der zeitlichen Abhängigkeit überschneiden. Außerdem wird das ein-und ausschalten der Lampen in unterschiedlichen Bereichen gesteuert, obwohl die selben Werte für das Schalten relevant sind.

void switchlamps()
{
  if (Sensor1[3] == 1 || Sensor1[4] == 1) 
  {Status1[1] = Tempoan;Status1[2] = AutoProg1[0];Status1[3] = AutoProg1[1];Status1[4] = AutoProg1[2];Status1[5] = AutoProg1[3];
   Sende1();EreigniszaehlerFlur++;Ereigniszaehleralles++;}
  
    if (Sensor2[3] == 1)
  { startBadwarten = millis();Status2[1] = Tempoan;Status2[2] = AutoProg2[0];Status2[3] = AutoProg2[1];Status2[4] = AutoProg2[2];Status2[5] = AutoProg2[3];
   Sende2();
        int delay8;
        if (millis() - delay8 > 44)
        {delay8 = millis();
   Status8[1] = Tempoan;Status8[2] = AutoProg8[0];Status8[3] = AutoProg8[1];Status8[4] = AutoProg8[2];Status8[5] = AutoProg8[3];
   Sende8();EreigniszaehlerBad++;Ereigniszaehleralles++;}}
  
    if (Sensor3[3] == 1)
  { startKuechewarten = millis();Status3[1] = Tempoan;Status3[2] = AutoProg3[0];Status3[3] = AutoProg3[1];Status3[4] = AutoProg3[2];Status3[5] = AutoProg3[3];
   Sende3();
        int delay7;
        if (millis() - delay7 > 47)
        {delay7 = millis();
   Status7[1] = Tempoan;Status7[2] = AutoProg7[0];Status7[3] = AutoProg7[1];Status7[4] = AutoProg7[2];Status7[5] = AutoProg7[3];
   Sende7();EreigniszaehlerKueche++;Ereigniszaehleralles++;}}
  
    if (Sensor4[3] == 1 || Sensor4[4] == 1 || Sensor4[5] == 1)
  {startWohnzimmerwarten = millis();Status4[1] = Tempoan;Status4[2] = AutoProg4[0];Status4[3] = AutoProg4[1];Status4[4] = AutoProg4[2];Status4[5] = AutoProg4[3];
   Sende4();EreigniszaehlerWohnzimmer++;Ereigniszaehleralles++;
   Sende11();}
  
    if (Sensor5[3] == 1 || Sensor5[4] == 1 || Sensor5[5] == 1)
  {startSchlafzimmerwarten = millis();Status5[1] = Tempoan;Status5[2] = AutoProg5[0];Status5[3] = AutoProg5[1];Status5[4] = AutoProg5[2];Status5[5] = AutoProg5[3];
   Sende5();
        int delay9;
        if (millis() - delay9 > 47)
        {delay9 = millis();
   Status9[1] = Tempoan;Status9[2] = AutoProg9[0];Status9[3] = AutoProg9[1];
   Sende9();}
        int delay10;
        if (millis() - delay10 > 42)
        {delay10 = millis();
   Status10[1] = Tempoan;Status10[2] = AutoProg10[0];Status10[3] = AutoProg10[1];
   Sende10();EreigniszaehlerSchlafzimmer++;Ereigniszaehleralles++;}}
     
    if (Sensor5[5] == 1)
  {Status9[1] = Tempoan;Status9[2] = AutoProg9[0];Status9[3] = AutoProg9[1];
   Sende9();} 
  
   if (Sensor5[4] == 1)
  {Status10[1] = Tempoan;Status10[2] = AutoProg10[0];Status10[3] = AutoProg10[1];
   Sende10();}
   
  if (Sensor2[3] == 1 || Sensor3[3] == 1 || Sensor4[3] == 1 || Sensor4[5] == 1 || Sensor5[3] == 1 || Sensor6[3] == 1  || (millis() - startFlurwarten > Flurwarten)) // hier darf nicht der 2. PIR im Wohnzimmer abgefragt werden, da er den Übergang Wohnzimmer / Flur registriert um den Flur und das Wohnzimmer zu aktivieren
  { startFlurwarten = millis();Status1[1] = Tempoaus;Status1[2] = auswarm[0];Status1[3] = auswarm[1];Status1[4] = auswarm[2];Status1[5] = auswarm[3];
    Sende1();} 
  
  if (Sensor1[3] == 1 || Sensor1[4] == 1 || (millis() - startBadwarten > Badwarten))
  {  if (millis() - startBad > VerzoegerungBad) 
       {startBad = millis();
        Status2[1] = Tempoaus;Status2[2] = auswarm[0];Status2[3] = auswarm[1];Status2[4] = auswarm[2];Status2[5] = auswarm[3];
        Sende2();
        int delay8;
        if (millis() - delay8 > 31)
        {delay8 = millis();
        Status8[1] = Tempoaus;Status8[2] = aus[0];Status8[3] = aus[1];Status8[4] = aus[2];Status8[5] = aus[3];
        Sende8();}}
      }
  
   if (Sensor1[3] == 1  || Sensor1[4] == 1 || (millis() - startKuechewarten > Kuechewarten))
  {if (millis() - startKueche > VerzoegerungKueche) 
       {startKueche = millis();
        Status3[1] = Tempoaus;Status3[2] = auswarm[0];Status3[3] = auswarm[1];Status3[4] = auswarm[2];Status3[5] = auswarm[3];
        Sende3();
        int delay7;
        if (millis() - delay7 > 37)
        {delay7 = millis();Status7[1] = Tempoaus;Status7[2] = aus[0];Status7[3] = aus[1];Status7[4] = aus[2];Status7[5] = aus[3];
        Sende7();}}
      }
  
    if (Sensor1[3] == 1  || Sensor1[4] == 1 || Sensor5[3] == 1|| Sensor5[4] == 1|| Sensor5[5] == 1 || (millis() - startWohnzimmerwarten > Wohnzimmerwarten))
  {if (millis() - startWohnzimmer > VerzoegerungWohnzimmer) 
       {startWohnzimmer = millis();
        Status4[1] = Tempoaus;Status4[2] = auswarm[0];Status4[3] = auswarm[1];Status4[4] = auswarm[2];Status4[5] = auswarm[3];
        Sende4();} 
  }
    if (Sensor4[3] == 1 || Sensor4[4] == 1 || Sensor4[5] == 1 || (millis() - startSchlafzimmerwarten > Schlafzimmerwarten))
  { Status5[1] = Tempoaus;Status5[2] = auswarm[0];Status5[3] = auswarm[1];Status5[4] = auswarm[2];Status5[5] = auswarm[3];
    Sende5();
        int delay9;
        if (millis() - delay9 > 32)
        {delay9 = millis();
    Status9[1] = Tempoaus;Status9[2] = aus[0];Status9[3] = aus[3];
    Sende9();}
        int delay10;
        if (millis() - delay10 > 39)
        {delay10 = millis();
    Status10[1] = Tempoaus;Status10[2] = aus[0];Status10[3] = aus[3];
    Sende10();}}
  
    if (Sensor6[3] == 0 && (Sensor1[3] == 1  || Sensor1[4] == 1))
  { Status6[1] = Tempoaus;Status6[2] = auswarm[0];Status6[3] = auswarm[1];Status6[4] = auswarm[2];Status6[5] = auswarm[3];
    Sende6();} 
}

mit der neuen Version will ich etwas Struktur rein bringen, insbesondere was den zeitlichen Ablauf angeht…

void switchlamps()
{ 
      
if ((Sensor1[3] == 1 || Sensor1[4] == 1 || Sensor1[5] == 1) && Auto1 == 1)
  {   display121a();
      EreigniszaehlerFlur++;
      Ereigniszaehleralles++;
      Serial.println("Flur");
  
      for (int i = 0; i < 5; i++)
         { Status1[i+1] = AutoProg1[i];} 
            
      if ( millis() - startFlurwarten > Flurwarten)
         { startFlurwarten = millis(); 
           for (int i = 0; i < 5; i++)
         { Status1[i+1] = 0;display121b();}}  
  
      if ( millis() - resetPIRFlur > resetPIRFlurdelay)
         { resetPIRFlur = millis();
           Sensor1[3] = 0; Sensor1[4] = 0; Sensor1[5] = 0;}
  }       
         
if ((Sensor1[3] == 1 || Sensor1[4] == 1 || Sensor1[5] == 1) && Sensor2[3] == 0 && Sensor2[4] == 0 && Sensor2[5] == 0 && millis() - startBadVerzoegerung > VerzoegerungBad)
         { startBadVerzoegerung = millis(); 
           for (int i = 0; i < 5; i++)
         { Status2[i+1] = auswarm[i];}}
      
if ((Sensor1[3] == 1 || Sensor1[4] == 1 || Sensor1[5] == 1) && Sensor3[3] == 0 && Sensor3[4] == 0 && Sensor3[5] == 0 && millis() - startKuecheVerzoegerung > VerzoegerungKueche)
         { startKuecheVerzoegerung = millis(); 
          for (int i = 0; i < 5; i++)
         { Status3[i+1] = auswarm[i]; Status7[i+1] = 0;}}
            
if ((Sensor1[3] == 1 || Sensor1[4] == 1 || Sensor1[5] == 1) && Sensor4[3] == 0 && Sensor4[4] == 0 && Sensor4[5] == 0 && millis() - startWohnzimmerVerzoegerung > VerzoegerungWohnzimmer)
         { startWohnzimmerVerzoegerung = millis(); 
          for (int i = 0; i < 5; i++)
         { Status4[i+1] = auswarm[i]; Status8[i+1] = 0;}}  
         
           
  if ((Sensor2[3] == 1 || Sensor2[4] == 1 || Sensor2[5] == 1) && Auto2 == 1)
  {  display122a();
      EreigniszaehlerBad++;
      Ereigniszaehleralles++;
      Serial.println("Bad"); 
  
      for (int i = 0; i < 5; i++)
         { Status2[i+1] = AutoProg2[i];} 
            
      if ( millis() - startBadwarten > Badwarten)
         { startBadwarten = millis(); 
           for (int i = 0; i < 5; i++)
         { Status2[i+1] = auswarm[i];Status8[i+1] = AutoProg8[i];display122b();}}
  
      if ( millis() - resetPIR > resetPIRdelay)
         { resetPIR = millis();
           Sensor2[3] = 0; Sensor2[4] = 0; Sensor2[5] = 0; display122b();}
   }     
         
if ((Sensor2[3] == 1 || Sensor2[4] == 1 || Sensor2[5] == 1) && Sensor1[3] == 0 && Sensor1[4] == 0 && Sensor1[5] == 0 && millis() - startFlurVerzoegerung > VerzoegerungFlur)
         { startFlurVerzoegerung = millis(); 
           for (int i = 0; i < 5; i++)
         { Status1[i+1] = auswarm[i];}}
         

  if ((Sensor3[3] == 1 || Sensor3[4] == 1 || Sensor3[5] == 1) && Auto3 == 1)
  {  display123a();
      EreigniszaehlerKueche++;
      Ereigniszaehleralles++;
      Serial.println("Kueche");
      
      for (int i = 0; i < 5; i++)
         { Status3[i+1] = AutoProg3[i];Status7[i+1] = AutoProg7[i]; display123b();} 
      
      if ( millis() - startKuechewarten > Kuechewarten)
         { startKuechewarten = millis(); 
            for (int i = 0; i < 5; i++)
         { Status3[i+1] = auswarm[i];  Status7[i+1] = auswarm[i]; display123b();}}
  
      if ( millis() - resetPIR > resetPIRdelay)
         { resetPIR = millis();
           Sensor3[3] = 0; Sensor3[4] = 0; Sensor3[5] = 0; display123b();}
  }        
         
if ((Sensor3[3] == 1 || Sensor3[4] == 1 || Sensor3[5] == 1) && Sensor1[3] == 0 && Sensor1[4] == 0 && Sensor1[5] == 0 && millis() - startFlurVerzoegerung > VerzoegerungFlur)
         { startFlurVerzoegerung = millis(); 
           for (int i = 0; i < 5; i++)
         { Status1[i+1] = auswarm[i];}}
  

if ((Sensor4[3] == 1 || Sensor4[4] == 1 || Sensor4[5] == 1) && Auto4 == 1)
  {  display124a();
      EreigniszaehlerWohnzimmer++;
      Ereigniszaehleralles++;
      Serial.println("Wohnzimmer"); 
      
      for (int i = 0; i < 5; i++)
         { Status4[i+1] = AutoProg4[i];}
   
      if ( millis() - startWohnzimmerwarten > Wohnzimmerwarten)
         { startWohnzimmerwarten = millis(); 
            for (int i = 0; i < 5; i++)
         { Status4[i+1] = auswarm[i];display124b();}}
  
if ( millis() - resetPIR > resetPIRdelay)
         { resetPIR = millis();
           Sensor4[3] = 0; Sensor4[4] = 0; Sensor4[5] = 0; display124b();}
  }
  
if ((Sensor4[3] == 1 || Sensor4[4] == 1 || Sensor4[5] == 1) && Sensor1[3] == 0 && Sensor1[4] == 0 && Sensor1[5] == 0 && millis() - startFlurVerzoegerung > VerzoegerungFlur)
         { startFlurVerzoegerung = millis(); 
           for (int i = 0; i < 5; i++)
         { Status1[i+1] = auswarm[i];}}
          
if ((Sensor4[3] == 1 || Sensor4[4] == 1 || Sensor4[5] == 1) && Sensor5[3] == 0 && Sensor5[4] == 0 && Sensor5[5] == 0 && millis() - startSchlafzimmerVerzoegerung > VerzoegerungSchlafzimmer)
         { startSchlafzimmerVerzoegerung = millis(); 
           for (int i = 0; i < 5; i++)
         { Status5[i+1] = auswarm[i]; Status10[i+1] = auswarm[i]; Status9[i+1] = auswarm[i];}}
  
         
         
  if ((Sensor5[3] == 1 || Sensor5[4] == 1 || Sensor5[5] == 1) && Auto5 == 1 && enabelPIR51 == 1)
  {  display125a();
      EreigniszaehlerSchlafzimmer++;
      Ereigniszaehleralles++;
      Serial.println("Schlafzimmer"); 
  
      for (int i = 0; i < 5; i++)
         { Status5[i+1] = AutoProg5[i]; Status9[i+1] = AutoProg9[i]; Status10[i+1] = AutoProg10[i];}
   
      if ( millis() - startSchlafzimmerwarten > Schlafzimmerwarten)
         { startSchlafzimmerwarten = millis(); 
           for (int i = 0; i < 5; i++)
         { Status5[i+1] = auswarm[i]; Status9[i+1] = auswarm[i]; Status10[i+1] = auswarm[i]; display125a();}}

      if ( millis() - resetPIR > resetPIRdelay)
         {resetPIR = millis();
          Sensor5[3] = 0; Sensor5[4] = 0; Sensor5[5] = 0; display125b();}
  }
  
if ((Sensor5[3] == 1 || Sensor5[4] == 1 || Sensor5[5] == 1) && Sensor4[3] == 0 && Sensor4[4] == 0 && Sensor4[5] == 0 && millis() - startWohnzimmerVerzoegerung > VerzoegerungWohnzimmer)
         { startWohnzimmerVerzoegerung = millis(); 
           for (int i = 0; i < 5; i++)
         { Status4[i+1] = auswarm[i];}}
  
 
if (Sensor5[5] == 1)
  {  display125a();
  for (int i = 0; i < 5; i++)
    { Status9[i+1] = AutoProg9[i];}  
         
      if ( millis() - startSchlafzimmerwarten > Schlafzimmerwarten)
         {   startSchlafzimmerwarten = millis();
              for (int i = 0; i < 5; i++)
              { Status9[i+1] = 0;}}
         
      if ( millis() - startWohnzimmerVerzoegerung > VerzoegerungWohnzimmer)
         {  startWohnzimmerVerzoegerung = millis();
            for (int i = 0; i < 5; i++)
            { Status4[i+1] = auswarm[i];}}
  
      if ( millis() - resetPIR > resetPIRdelay)
         {resetPIR = millis();
          Sensor5[5] = 0; display125b();} 
  }        
     
if (Sensor5[4] == 1)
  {  display125a();
  for (int i = 0; i < 5; i++)
    { Status10[i+1] = AutoProg10[i];}         
            
      if ( millis() - startWohnzimmerVerzoegerung > VerzoegerungWohnzimmer)
         {  startWohnzimmerVerzoegerung = millis();
            for (int i = 0; i < 5; i++)
             { Status4[i+1] = auswarm[i];Status10[i+1] = 0;}}
  
      if ( millis() - resetPIR > resetPIRdelay)
         { resetPIR = millis();
         Sensor5[5] = 0; display125b();}
  }        

if (IRRaum == 1 || IRRaum == 6)
  { for (int i = 0; i < 5; i++)
    { Status1[i+1] = IRVorgaben[i];}}       
  
  
if (IRRaum == 2 || IRRaum == 6)
  { for (int i = 0; i < 5; i++)
    { Status2[i+1] = IRVorgaben[i];}
    for (int i = 0; i < 5; i++)
    { Status8[i+1] = IRVorgaben[i];}}      
  

if (IRRaum == 3 || IRRaum == 6)
  { for (int i = 0; i < 5; i++)
    { Status3[i+1] = IRVorgaben[i];}} 
       
  
if (IRRaum == 4 || IRRaum == 6)
  { for (int i = 0; i < 5; i++)
    { Status4[i+1] = IRVorgaben[i];}}     
       
  
if (IRRaum == 5 || IRRaum == 6)
  { for (int i = 0; i < 5; i++)
    { Status5[i+1] = IRVorgaben[i];}
    
    for (int i = 0; i < 5; i++)
    { Status9[i+1] = AutoProg9[i];}
            
    for (int i = 0; i < 5; i++)
    { Status10[i+1] = AutoProg10[i];} 
   }
}

Aber nachdem ich die “Treppe” mit den “Zeitzaehlern” wieder raus genommen habe und für alle Schritte separate zeitliche Abläufe eingefügt habe, ist es wieder etwas unübersichtlicher… :frowning:

mit dem Prozess Ablauf Plan hatte ich angefangen…

ich hab ja nur 5 Zimmer mit 3 PIRs…

Da wo Bewegung ist soll Licht sein, dann wo keine Bewegung ist soll das Licht beim Raumwechsel ausgehen- aber mit dynamischer Verzögerung… für heute höre ich mal auf… hab 4h dran gesessen- sehe den Wald vor Bäumen nicht mehr… :-/

danke schon mal für eure Hilfe

noch mal ganz zum Anfang- wie mein eigentlicher PAP aussah:

starteUnterprogramm()
{
if (Ereignis1 == HIGH)                      // Startbedingung ist erfüllt
   {jetzt = millis();                            // merke dir die aktuelle Zeit
     Ereignis == LOW;}                      /* setze das Ereignis aktiv zurück- sei sofort bereit für das    
                                                          Zurücksetzen durch ein neues HIGH*/

if ((millis() - jetzt) > Verzögerung1)   // ist seit dem Ereignis eine bestimmte Zeit abgelaufen?
   {starteAktion1;]                            // mache das was jetzt gewünscht ist

if ((millis() - jetzt) > Verzögerung2)   // ist seit dem Ereignis eine bestimmte Zeit abgelaufen?
   {starteAktion2;]                            // mache das was jetzt gewünscht ist

if ((millis() - jetzt) > Verzögerung2)   // ist seit dem Ereignis eine bestimmte Zeit abgelaufen?
   {starteAktion2;]                            // mache das was jetzt gewünscht ist
}

Ist das als Basis so korrekt? Inkl. der symbolisch gesetzten Klammern?

MaHa76: ich hab ja nur 5 Zimmer mit 3 PIRs....

So ganz verstehe ich es noch nicht.

Aber letztlich soll das doch grob in etwa so ablaufen: Bewegung erkannt: Licht an. Keine Bewegung: nach Verzögerung Licht wieder aus.

Oder soll das Licht ausschalten davon abhängen, ob im Nebenzimmer Bewegung erkannt wurde?

Was ist, wenn du im Zimmer still sitzt? Oder wenn 2 Personen in verschiedenen Zimmern sind?

Wenn in einem Zimmer Bewegung ist soll da das Licht angehen und in den direkt angrenzenden Räumen soll es ausgehen.

Da sich die Erfassungsbereiche der PIR- Sensoren leicht überschneiden, soll das ausschalten/dimmen mit einer kleinen Verzögerung erfolgen. Standardmäßig sind es einige Sekunden.

Jede Bewegung in einem Raum führt dazu, dass ein Ereigniszähler hochgezählt wird, der in bestimmten Zeit-Intervallen wieder runter gezählt wird. Je mehr Bewegungen in einem bestimmten Zeitraum erkannt werden, desto länger ist die Verzögerung fürs ausschalten- war also in einem Raum vor dem Raumwechsel viel los, wird vermutet, dass da mehrere Personen sind oder man zumindest sehr beschäftigt in der Wohnung hin und herläuft.

Das nutze ich auch dafür wenn die Steuerung im Nachtprogramm ist- die LEDs eigentlich nur auf 2% Helligkeit gehen, ich oder jemand anderes aber spät nach Hause kommt - da wird mehr Bewegung in Flur und Bad erkannt - somit wird das Licht in Bad und Flur auf ca. 60% hoch geregelt- in den übrigen Räumen bleibt es im Nachtprogramm (somit werden die die schlafen nicht gestört).

Der Part läuft auch sehr gut.

Als letztes soll das Licht nach einer definierten Zeit ausgehen, wenn gar keine Bewegung erkannt wird, also auch kein Raumwechsel. Das dient zum einen dazu das Licht im Flur auszuschalten, wenn man die Wohnung verläßt, bzw. das Licht im Schlafzimmer zu deaktivieren wenn man ins Bett geht- das wird auch über Uhrzeit, Wochentag und Ereigniszähler angepaßt- also z.b. vor 22:00 wartet das Licht im Schlafzimmer 15min. nach 22:00 nur noch 2min (und dann wird die Deckenlampe komplett deaktiviert und nur die Fußraumbeleuchtung am Bett reagiert auf Bewegung direkt am Bett.)

Dieser Part läuft auch wie gewünscht.

Nur beim ersten Teil bekomme ich die Verzögerung nicht in den Griff- er schaltet beim Raumwechsel direkt den verlassenen Raum aus…

Um da Übersicht rein zu bekommen (die Steuerung ist nach und nach gewachsen) wollte ich den Part komplett umstrukturieren und klarer gestalten… da hängts aber im Moment total.

Das riecht für mich weniger nach Ablaufsteuerung als eher nach einzelnen Funktionen die jeweils verschiedene Eintrittsbedingungen haben.

z.B.
LichtausRaum1:
IF (!BewegungRaum1 && Raum1Ereigniszähler < 0 && (BewegungRaum2 || BewegungRaum3 || BewegungRaum4)) Lichtaus;

Das könnte man bestimmt auch toll mit Wahrheitstabelle erledigen.

wie sieht denn eine Wahrheitstabelle aus?

Den Ablauf beziehe ich eher auch darauf, wie die zeitliche Abläufe der einzelnen Schritte bei einem erkannten "Raumwechsel" stattfindet.

also:

  • Raum gewechselt
  • mache sofort das Licht an
  • warte kurz bis das Licht im anderen Raum ausgemacht wird
  • warte lange bis du auch in diesem Raum das Licht ausmachst

dazwischen will ich irgendwann mal noch andere Aktion einhängen, wie z.b das ein- und ausblenden von Musik

So mal ins Unreine gesprochen:

Du hast einen Satz von Eingangsvariablen.

z.B.:
BewegungRaum1, BewegungRaum2, … // bewegt sich was in dem Raum?
EreigniszählerRaum1, EreigniszählerRaum2, … // Wie oft wurde Bewegung erkannt?

ggf auch einige Zeitstempel:
LetzteBewegungRaum1, LetzteBewegungRaum2, … // Wann wurde die letzte Bewegung erkannt?

Und einen Satz Ausgangsvariablen:
LichtRaum1, LichtRaum2, … // AN / AUS / PWM für die Lampen
Das kann auch prima als Arrays vereinbaren.

Dann gibt es in der loop einige Funktionen (vielleicht auch in Zeitscheiben), die diese Variablen füllen bzw. verarbeiten.

z.B.
BewegungsmelderAbfragen();
Ereigniszähler_dekremtieren();

Und dann eine Funktion Auswerten(), die die ganzen Eingangsvariablen auswertet und die Ausgangsvariablen beschreibt.
So wie ich dein System verstehe, kann man das alles logisch abbilden.

z.B. in einer Tabelle:
Zwischenablage01.jpg

Diese kann man dann händisch codieren:
if (BewegungRaum1) LichtRaum1 = AN;
if (!BewegungRaum1 && (millis()-Wartezeit < letzteBewegungRaum1) LichtRaum1 = AN;
if (!BewegungRaum1 && (millis()-Wartezeit > letzteBewegungRaum1) LichtRaum1 = AUS;

Man könnte das alles auch in einem ARRAY speichern und das automatisch vergleiche.

Am Ende der Funktion steht in Variablen LichtRaum1… der gewünschte LED_Zustand (an, aus, ZielPWM)

weiterhin steht in der loop Lichtschalten()
Hier werden die Variablen LichtraumX ausgewertet, Lichter geschalten, gedimmt, gefadet.

Mit diesem Konstrukt stecke die eigentliche Logik in der Tabelle, die entsprechend viel Arbeit macht.
Andererseits: über die ganzen Zusammenhänge müsstest du dir eh klar werden.

Ich weiß nicht ob das bei deinem System funktioniert, oder ob es sinnvollere Ansätze gibt.
aber es ist zumindest mal eine Idee, die durchzudenken sich lohnt.

Viel Erfolg

Gunther

hmmm... klingt sinnvoll und übersichtlich....

damit setz ich mich heute Abend mal hin.

vielen Dank schon mal.

soooo, ich habs gestern Abend noch hin bekommen... :-) es sieht zwar noch immer nicht übersichtlicher aus - ich habe die Abläufe zum einschalten und zum ausschalten getrennt (gelassen), damit es leichter zu ändern geht, wenn mal Lampen dazu kommen... die Funktion ist aber wie gewollt.... :-)