If Abfrage in if Abfrage?

Hallo, ich verstehe mal wieder etwas nicht und komme mit Google und den Beispielsketchen nicht vorran.

Hintergrund:
Ich möchte im PKW einen Arduino mit dem Öffnen der ZV laufen lassen, der verhindert, dass der nachgerüstete Regensensor nach dem Anlassen erstmal schön sinnlos für 2 Sek wischt. Dafür unterbreche ich die Zuleitung zum Wischer mit einem bistabilen Relais und nach 2 Sek verbinde sie dann wieder.
Und dann möchte ich noch weitere Fehler eines nachgerüsteten Universal Keyless Entry System ausmerzen.

Arduino Nano Setup mit sleep Bibliothek
schreibt digitalWrite(INT_PIN, LOW);
geht schlafen mittels enter_sleep(); und wartet auf HIGH Interupt an Pin 3

Dummerweise reagiert der Int_pin auf low. Mit CHANGE werde ich morgen mal weiter experimentieren.
Läuft der Motor ists 0 LOW , Motor aus = 1 HIGH.

Programmablauf:
hoch fahren und schlafen gehen,
if PIN 3 = LOW;
dann warte 3 Sek
if PIN 3 immernoch = LOW ( else = wieder zurück)
dann schalte alle Relais und gehe anschließend wieder schlafen. Warte dann erneut auf
if Interupt PIN3 = HIGH;
dann schalte Relais zurück und starte Arduino neu

Der jetzige Code nach 5 Stunden funktioniert gar nicht mehr, vorhin ging alles zumindest noch in einer loop aber jetzt nix mehr.
Hier ist der Katastrophencode. Das mit dem delay bitte mal schön ignorieren.

#include <avr/sleep.h>                      // Sleep Anleitung von : http://www.netzmafia.de/skripten/hardware/Arduino/Sleep/index.html

#define INT_PIN 3                           // Pin 3 als Interrupt-Pin, Pullup einschalten. "Motor läuft nicht mehr" erkennen... mit CNY17 Optokoppler und 4,7k Ohm an 5V als PullUp
const int Wischer4  = 4;                    // Leitung zum Scheibenwischer verbinden oder nicht, um Fehler im Regensensor zu unterdrücken
const int Wischer5  = 5;
const int Traktion   = 6;                   // Leitung zum Traktionskontrollschalter kurz verbinden um Tastendruck zu simulieren
const int Ignorelock7 = 7;                  // Leitung zum LockRelais verbinden oder nicht
const int Ignorelock8 = 8;
const int IgnoreUNlock9 = 9;                // Leitung zum UNlockRelais verbinden oder nicht
const int IgnoreUNlock10 = 10;
const int Sitzvor11 = 11;                   // Sitz nach vorne, nach 5 Sekunden 
const int Sitzback12 = 12;                  // Sitz nach hinten, wenn Motor aus

void INT_PINisr(void)
  {
  detachInterrupt(0);                            /* detach Interrupt, damit er nur einmal auftritt */
  }

void enter_sleep(void)
  {
  attachInterrupt(digitalPinToInterrupt(3), INT_PINisr, LOW);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);           /* Arduino schlafen legen */
  sleep_enable();
  sleep_mode();
  sleep_disable(); 
  }

  
void setup() {
Serial.begin(9600);
  pinMode(INT_PIN, INPUT);
  digitalWrite(INT_PIN, HIGH);
  pinMode(Wischer4, OUTPUT);
  pinMode(Wischer5, OUTPUT);
  pinMode(Traktion, OUTPUT);
  pinMode(Ignorelock7, OUTPUT);
  pinMode(Ignorelock8, OUTPUT);
  pinMode(IgnoreUNlock9, OUTPUT);
  pinMode(IgnoreUNlock10, OUTPUT);
  pinMode(Sitzvor11, OUTPUT);                      //grüne Leitung vor
  pinMode(Sitzback12, OUTPUT);                     //rote Leitung back

Serial.println("Start"); delay(200);               //delay von 200ms nach jedem serial.println weil sonst die Meldung abgehackt wird!

}          


void loop() {
  int Motorlaeuft = digitalRead(INT_PIN);
  Serial.println(Motorlaeuft);
Serial.println("gehe schlafen und warte darauf dass der Motor gestartet wird..."); delay(200);
  enter_sleep();                                   // schlafen gehen, nachdem das Setup durchlaufen wurde, nur ein Interupt an DPin3 kann ihn nun noch aufwecken
                                                  // Motor an=0/LOW ......... Motor aus=1/HIGH
if( digitalRead(INT_PIN) == LOW) {                //Motor aus = HIGH wegen INPUT_PULLUP, Motor an = LOW   .....     pull-up means it goes HIGH when it's open, and LOW when it's pressed
  delay(3000);        //delay umd as erste Zündung an Signal an Kraftstoffpumpe zu ignorieren, erst wenn diese länger als 3 Sek läuft soll die zweite if folgen.
  if( digitalRead(INT_PIN) == LOW){ 
    //Motor läuft jetzt
    digitalWrite(Wischer4, HIGH); delay(200);        // Zur Sicherheit nochmal Strom der Wischer weg nehmen  ... delay von 200ms zum Umschalten des Bistabilen Relais warten      
  digitalWrite(Wischer4, LOW);
Serial.println("Regensensor ist jetzt deaktiviert, warte 2 Sekunden...");
  delay(2000);           
  digitalWrite(Wischer5, HIGH); delay(200);
  digitalWrite(Wischer5, LOW);
Serial.println("Regensensor wird wieder aktiviert Schlüsselmodul wird deaktiviert"); delay(200);  //delay von 200ms nach jedem serial.println weil sonst die Meldung abgehackt wird!
  digitalWrite(Ignorelock7, HIGH); delay(200);     // Der Motor läuft, also soll das Passive Keyless System -NICHT- mehr bestimmen dürfen, ob das Auto verriegelt wird oder nicht (sonst funktioniert der Türtaster nicht mehr!)
  digitalWrite(Ignorelock7, LOW);
  digitalWrite(IgnoreUNlock9, HIGH); delay(200);   // Der Motor läuft, also soll das Passive Keyless System -NICHT- mehr bestimmen dürfen, ob das Auto ENTriegelt wird oder nicht (sonst funktioniert der Türtaster nicht mehr!)
  digitalWrite(IgnoreUNlock9, LOW);
  digitalWrite(Sitzvor11, HIGH); delay(500);       //Fahrersitz fährt nach vorne (ruft Fahrersitzspeicherplatz #1 ab)
  digitalWrite(Sitzvor11, LOW);
Serial.println("Fahrersitz fährt nach vorn"); delay(200);  
  digitalWrite(Traktion, HIGH); delay(300);        // Traktionskontrolle wegen dem Passive Keyless entry einmal aktivieren (Tastendruck von 0,5 Sek emulieren)
  digitalWrite(Traktion, LOW);
Serial.println("Traktionskontrolle wurde wieder aktiviert. Gehe jetzt schlafen und warte dann auf Interupt an DPin3, dass der Motor ausgeschaltet wird"); delay(200);  
} else {
} 
   // Serial.println(Motorlaeuft);
  
  //if( digitalRead(INT_PIN) == LOW) {               //Wird ERST NACHDEM der Motor schonmal lief, der Motor wieder gestoppt, wird alles zurückgesetzt und der Arduino NEUGESTARTET, wartend auf einen neuen Motorstart
}
  digitalWrite(Sitzback12, HIGH); delay(200);     //Fahrersitz fährt nun nach hinten (gespeicherte Fahrersitzposition #2 abrufen)
  digitalWrite(Sitzback12, LOW);
  digitalWrite(Wischer4, HIGH); delay(100);       //Pin4 Strom ...  Wenn der Motor ausgeschaltet wird, soll dank Ausschaltverzögerung vorm Arduino die Verbindung zum Wischer schonmal deaktiviert werden
  digitalWrite(Wischer4, LOW);
  digitalWrite(Ignorelock8, HIGH); delay(100);    //Passive Keyless System darf nun wieder das Auto VERSCHLIESSEN, denn der Motor ist aus
  digitalWrite(Ignorelock8, LOW);                 
  digitalWrite(IgnoreUNlock10, HIGH); delay(100); //Passive Keyless System darf nun wieder das Auto ÖFFNEN, denn der Motor ist aus
  digitalWrite(IgnoreUNlock10, LOW);                                      
Serial.println("Motor ist aus, Wischer für den nächsten Start deaktivieren.");  delay(200);
Serial.println("Das Passive Keyless Entry System darf nun auch wieder das Auto verschließen");  delay(200);
Serial.println("Fahrersitz fährt nach hinten. ENDE");  delay(200);
 Serial.println(Motorlaeuft);
  enter_sleep();                                   // schlafen gehen, nachdem das Setup durchlaufen wurde, nur ein Interupt an DPin3 kann ihn nun noch aufwecken
  // asm volatile ("jmp 0");
}
[code\] [/mcode]

Wie wäre es, wenn Du uns den kompletten Code gibst?

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.

Gruß Tommy

arduino_009:
Hallo, ich verstehe mal wieder etwas nicht und kommt mit Google und den Beispielsketchen nicht vorran.

Soll heißen, du findest deinen Sketch in Google nicht ?
Oder warum zeigst du uns den nicht ?

Und hier ein Code der sozusagen invertiert läuft.
Arduino läuft über Benzinpumpe und schaltet die Relais. Dann erkennt er irgendwann dass der Motor abgestellt wird und schaltet wieder, er läuft jetzt über den Kondensator und bleibt dann halt irgendwann stehen. Leider zu früh, selbst 10F reichen nicht aus. Daher der Umweg, der ja in der THEORIE MACHBAR SEIN SOLLTE grrr.

// benötigt einen Kondensator von rund 10Farad für den Arduino
// Der Arduino bekommt nur Strom wenn die Benzinpumpe läuft 
#include <avr/sleep.h>                      // Sleep Anleitung von : http://www.netzmafia.de/skripten/hardware/Arduino/Sleep/index.html

#define INT_PIN 3                           // Pin 3 als Interrupt-Pin, Pullup einschalten. "Motor läuft nicht mehr" erkennen... mit CNY17 Optokoppler und 4,7k Ohm an 5V als PullUp
const int Wischer4  = 4;                    // Leitung zum Scheibenwischer verbinden oder nicht, um Fehler im Regensensor zu unterdrücken
const int Wischer5  = 5;
const int Traktion   = 6;                   // Leitung zum Traktionskontrollschalter kurz verbinden um Tastendruck zu simulieren
const int Ignorelock7 = 7;                  // Leitung zum LockRelais verbinden oder nicht
const int Ignorelock8 = 8;
const int IgnoreUNlock9 = 9;                // Leitung zum UNlockRelais verbinden oder nicht
const int IgnoreUNlock10 = 10;
const int Sitzvor11 = 11;                   // Sitz nach vorne, nach 5 Sekunden 
const int Sitzback12 = 12;                  // Sitz nach hinten, wenn Motor aus

void INT_PINisr(void)
  {
  detachInterrupt(0);                            /* detach Interrupt, damit er nur einmal auftritt */
  }

void enter_sleep(void)
  {
  attachInterrupt(digitalPinToInterrupt(3), INT_PINisr, LOW);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);           /* Arduino schlafen legen */
  sleep_enable();
  sleep_mode();
  sleep_disable(); 
  }

  
void setup() {
Serial.begin(9600);
  pinMode(INT_PIN, INPUT);
  digitalWrite(INT_PIN, LOW);
  pinMode(Wischer4, OUTPUT);
  pinMode(Wischer5, OUTPUT);
  pinMode(Traktion, OUTPUT);
  pinMode(Ignorelock7, OUTPUT);
  pinMode(Ignorelock8, OUTPUT);
  pinMode(IgnoreUNlock9, OUTPUT);
  pinMode(IgnoreUNlock10, OUTPUT);
  pinMode(Sitzvor11, OUTPUT);                      //grüne Leitung vor
  pinMode(Sitzback12, OUTPUT);                     //rote Leitung back

Serial.println("Start"); delay(200);               //delay von 200ms nach jedem serial.println weil sonst die Meldung abgehackt wird!

  digitalWrite(Wischer4, HIGH); delay(200);        // Zur Sicherheit nochmal Strom der Wischer weg nehmen  ... delay von 200ms zum Umschalten des Bistabilen Relais warten      
  digitalWrite(Wischer4, LOW);
Serial.println("Regensensor ist jetzt deaktiviert, warte 2 Sekunden...");
  delay(2000);           
  digitalWrite(Wischer5, HIGH); delay(200);
  digitalWrite(Wischer5, LOW);
Serial.println("Regensensor wird wieder aktiviert, warte weitere 5 Sekunden als Annahme dass dann der Motor läuft. Schlüsselmodul wird deaktiviert"); delay(200);  //delay von 200ms nach jedem serial.println weil sonst die Meldung abgehackt wird!
  delay(5000);                                     // 5 Sekunden warten, als Annahme, dass dann der Motor läuft
  digitalWrite(Ignorelock7, HIGH); delay(200);     // Der Motor läuft, also soll das Passive Keyless System -NICHT- mehr bestimmen dürfen, ob das Auto verriegelt wird oder nicht (sonst funktioniert der Türtaster nicht mehr!)
  digitalWrite(Ignorelock7, LOW);
  digitalWrite(IgnoreUNlock9, HIGH); delay(200);   // Der Motor läuft, also soll das Passive Keyless System -NICHT- mehr bestimmen dürfen, ob das Auto ENTriegelt wird oder nicht (sonst funktioniert der Türtaster nicht mehr!)
  digitalWrite(IgnoreUNlock9, LOW);
  digitalWrite(Sitzvor11, HIGH); delay(500);       //Fahrersitz fährt nach vorne (ruft Fahrersitzspeicherplatz #1 ab)
  digitalWrite(Sitzvor11, LOW);
Serial.println("Fahrersitz fährt nach vorn"); delay(200);  
  digitalWrite(Traktion, HIGH); delay(300);        // Traktionskontrolle wegen dem Passive Keyless entry einmal aktivieren (Tastendruck von 0,5 Sek emulieren)
  digitalWrite(Traktion, LOW);
Serial.println("Traktionskontrolle wurde wieder aktiviert. Gehe jetzt schlafen und warte dann auf Interupt an DPin3. ENDE"); delay(200);  
  
  enter_sleep();                                   // schlafen gehen, nachdem das Setup durchlaufen wurde, nur ein Interupt an DPin3 kann ihn nun noch aufwecken
}          


void loop() {

if( digitalRead(INT_PIN) == HIGH) {               //Motor aus = HIGH wegen INPUT_PULLUP, Motor an = LOW   .....     pull-up means it goes HIGH when it's open, and LOW when it's pressed
  digitalWrite(Sitzback12, HIGH); delay(200);     //Fahrersitz fährt nun nach hinten (gespeicherte Fahrersitzposition #2 abrufen)
  digitalWrite(Sitzback12, LOW);
  digitalWrite(Wischer4, HIGH); delay(100);       //Pin4 Strom ...  Wenn der Motor ausgeschaltet wird, soll dank Ausschaltverzögerung vorm Arduino die Verbindung zum Wischer schonmal deaktiviert werden
  digitalWrite(Wischer4, LOW);
  digitalWrite(Ignorelock8, HIGH); delay(100);    //Passive Keyless System darf nun wieder das Auto VERSCHLIESSEN, denn der Motor ist aus
  digitalWrite(Ignorelock8, LOW);                 
  digitalWrite(IgnoreUNlock10, HIGH); delay(100); //Passive Keyless System darf nun wieder das Auto ÖFFNEN, denn der Motor ist aus
  digitalWrite(IgnoreUNlock10, LOW);                                      
Serial.println("Motor ist aus, Wischer für den nächsten Start deaktivieren. \nDas Passive Keyless Entry System darf nun auch wieder das Auto verschließen.\n der Fahrersitz fährt nach hinten. ENDE");  delay(200);
  delay(15000);            //genug Zeit um auszugehen und die Loop nicht zu wiederholen
  }   
}
[\Code]

Ok Sketch nachgereicht.

arduino_009:
Und hier ein Code der sozusagen invertiert läuft.
Arduino läuft über Benzinpumpe und schaltet die Relais. Dann erkennt er irgendwann dass der Motor abgestellt wird und schaltet wieder, er läuft jetzt über den Kondensator und bleibt dann halt irgendwann stehen. Leider zu früh, selbst 10F reichen nicht aus. Daher der Umweg, der ja in der THEORIE MACHBAR SEIN SOLLTE

Gibt es den Text auch in verständlich ?

Dein Problem werden die zahlreichen delays sein.
Die solltest du durch die Funktion mit millis ersetzen.
Sieh dir dazu BlinkWithoutDelay in den Beispielen der IDE an.

Ähm, aha. Wenn ich den Sketch kürze und testweise vieles Rausnehme, funktionierts immer noch nicht.
Ich habe gesagt dass der Sketch Katastrophe ist. Seltsamerweise funktioniert der invertierte Sketch mit den unzähligen bösen delays ja auch.

Mein Problem ist, wie ich den Programmablauf in Codesprache umwandle.

Derzeit ist es ja in etwa so:

if passiertwas? {
delay 3 Sek
if passiert noch immer? {
make something....
go sleep
} else {
mach das Gegenteilige
go sleep
} }

soll aber so werden, und da weiß ich nicht, wie ich die dritte if Abfrage, wenn es denn if ist, hineinverschachtle:

hoch fahren und schlafen gehen bis:
if PIN 3 = LOW; {
delay 3 Sek
if PIN 3 immernoch = LOW { ( else = wieder zurück)
dann schalte Relais und
gehe anschließend wieder schlafen.
Warte NUR DANN dann erneut auf
if Interupt PIN3 = HIGH; {
dann schalte Relais zurück und
starte Arduino neu
}}}

(deleted)

Das habe ich doch schon......................

arduino_009:
Das habe ich doch schon......................

Dann wende es an und zeige es auch.
Dann verstehen wir evtl. dein Vorhaben.

(deleted)

ok dann nochmal:

hoch fahren und schlafen gehen bis:
if PIN 3 = LOW; {
delay 3 Sek
if PIN 3 immernoch = LOW { ( else = wieder zurück)
dann schalte Relais und
gehe anschließend wieder schlafen.
Warte NUR DANN dann erneut auf
if Interupt PIN3 = HIGH; {
dann schalte Relais zurück und
starte Arduino neu
}}}

arduino_009:
ok dann nochmal:

hoch fahren und schlafen gehen bis:
if PIN 3 = LOW; {
delay 3 Sek
if PIN 3 immernoch = LOW { ( else = wieder zurück)
dann schalte Relais und
gehe anschließend wieder schlafen.
Warte NUR DANN dann erneut auf
if Interupt PIN3 = HIGH; {
dann schalte Relais zurück und
starte Arduino neu
}}}

Dann hast du es nicht verstanden!

Ein PAP sieht anders aus und ist für alle verständlicher.

(deleted)

Programmablauf

(deleted)

Hallo, ja ich schalte bistabile Relais.

Den Arduino schicke ich mit Hilfe der sleep Bibiliothek in den SLEEP_MODE_PWR_DOWN Modus schlafen.
Aus diesem Modus kann ihn nur noch ein PIN CHANGE an INT0 oder INT1 aufwecken (läuft auch).

Dabei sind folgende Modi möglich:
Modus Beschreibung
LOW ein Low-Pegel
CHANGE eine Änderung des Pegels
RISING eine steigende Flanke am Trigger_Eingang
FALLING eine fallende Flanke am Trigger-Eingang

Naja, habe neu angefangen und mein Verständnisproblem lösen können.

void loop() {
	Serial.println("Start, schlafen"); delay(200);               //delay von 200ms nach jedem serial.println weil sonst die Meldung abgehackt wird!

	if ((digitalRead(Motor)==HIGH)&&(MotorAUS==false)){	// Motor aus=1/HIGH
		MotorAUS=true;
		digitalWrite(3, HIGH);
		Serial.println("Motor AUS"); delay(200);
	}

	if ((digitalRead(Motor)==LOW)&&(MotorAUS==true)){	// Motor an=0/LOW 
		delay(3000);
		if ((digitalRead(Motor)==LOW)&&(MotorAUS==true)){	// Motor immer noch an?
			MotorAUS=false;
			digitalWrite(3, LOW);
			Serial.println("Motor AN"); delay(200);
		}
	}
}

arduino_009:
vorhin ging alles zumindest noch in einer loop aber jetzt nix mehr.

Ich denke, Du tappst in eine Falle, die ich mir nicht erklären kann - da muss jemand ran, der mit den Datenblättern und den Bibliotheken umgehen kann.
Ich verzichte seither auf das schlafen gehen...

Bau Dir auf einem Steckbrett einen NANO auf, und mittels eines Kabels eine Brücke zwischen GND und - in meinem Fall - PIN 2; oder ändere den Code.

Dann spiel den folgenden Code auf:

#include <avr/sleep.h>

#define INT_PIN 2

void INT_PINisr(void)
  {
  detachInterrupt(0);
  }

void enter_sleep(void)
  {
  attachInterrupt(0, INT_PINisr, LOW);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_mode();
  sleep_disable();
  }

void setup()
  {
  pinMode(INT_PIN, INPUT);
  digitalWrite(INT_PIN, HIGH);
  Serial.begin(115200);
  Serial.println("Start ...");
  }

void loop()
  {
  Serial.println("Jetzt Stecker ziehen und wieder einstecken");
  while (digitalRead(INT_PIN) == LOW);
  enter_sleep();
  Serial.println("Bin aufgewacht ... - und Stecker ziehen");
  delay(100);
  if (!digitalRead(INT_PIN)) enter_sleep();
  Serial.println("das erreiche ich nie ...");
  }

Berichte.