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]