Hallo zusammen,
jetzt mache ich schon länger mit den Arduinos rum und habe plötzlich ein Anfängerproblem.
Was ich will:
An meinem Ford Transit Bauj. 2003 habe ich eine Rückfahrkamera mit Monitor nachgerüstet,
die funktioniert.
Um für die Passagiere, die seitlich an der Schiebetür ein- oder aussteigen bequem am Bordstein zu stehen habe ich mir eine 2. Kamera unter den rechten Außenspiegel gebaut.
Der Monitor hat 2 AV-Eingänge, wenn die Seitenkamera eingeschaltet wird zeigt er deren Bild, auch wenn der Rückwärtsgang einegelegt ist.
Mit einem einfachen Schalter, der die Seitenkamera einschaltet, funktioniert das.
Jetzt will ich es mit einem Nano V3 -Clone (ch340) und einem Relais-Modul (high active, geprüft) so steuern dass:
- Bei Tasterdruck die Seitenkamera eingeschaltet wird.
- Bei einem längeren Tasterdruck die Seitenkamera wieder ausgeschaltet wird.
- Und wenn nichts unternommen wird die Seitenkamera nach 60 Sekunden ausgeschaltet wird.
Das funktioniert auch alles, aber immer wenn der Nano bootet (Zündung an) schaltet er das Relais kurz ein, das ist einfach unschön. Das soll nicht sein.
Hat jemand eine Lösung?
Hier mein Code:
// Muss vor Spannungsspitzen geschützt werden
// deshalb Spannungsversorgung über USB mit Kfz-Lader (KfZ_Betrieb!!!)
// Ausgang Relais-Modul high active an D13 mit onboard LED
// Triggern mit Taster an D2, low active, also Taster gegen GND!!!!
// Abschalten über Timer nach 60s oder über Taster lang drücken
int Step; //Schrittkette
const int Trig = 2; // Taster als Trigger
const int Relais = 13; //Ausgang mit onboard LED
const long Laufzeit = 60000; //Einschaltdauer
const long Druckzeit = 300; //langer Tasterdruck Dauer
const long LosZeit = 150; //Taster losgelassen Dauer
unsigned long StartRelaisMillis =0; //millis beim Start des Ausgangs
unsigned long TasterGedrMillis =0; //millis beim Drücken des Tasters
unsigned long TasterLosMillis =0; //millis beim Loslassen des Tasters
void setup() {
digitalWrite(Relais, LOW);
pinMode(Trig, INPUT_PULLUP);
pinMode(Relais, OUTPUT);
Step = 0; //Schrittkette löschen
}
void loop() {
switch (Step) {
case 0: // Warten auf Taster gedrückt, einschalten
if (digitalRead(Trig) == LOW) { //Taster gedrückt
digitalWrite(Relais, HIGH); // Relais Ein
StartRelaisMillis = millis(); //Zeit übernehmen
Step = 1;
}
break;
case 1: //Taster losgelassen
if (digitalRead(Trig) == HIGH) {
Step = 2;
}
break;
case 2: //Abschalten
if (millis() - StartRelaisMillis >= Laufzeit) { //Abschalten nach Zeit
digitalWrite(Relais, LOW);
Step = 0;
}
else if (digitalRead(Trig) == LOW) { //Zeit Tastendruck laden
TasterGedrMillis = millis(); //Zeit übernehmen
Step = 3;
}
break;
case 3:
if (millis() - TasterGedrMillis >= Druckzeit) { //Abschalten nach langem Tasterdruck
digitalWrite(Relais, LOW);
Step = 4;
}
else if (digitalRead(Trig) == HIGH) { //nur kurz gedrückt, zurück
Step = 2;
}
break;
case 4:
if (digitalRead(Trig) == HIGH) { //entprellen
TasterLosMillis = millis(); //Zeit übernehmen
Step = 5;
}
break;
case 5:
if (millis() - TasterLosMillis >= LosZeit) { // Zurück zum Anfang
Step = 0;
}
break;
}
}