Mehrfacher Tastereingan mit Zeit auswerten

Hallo Nachbarn,

ich bin neu hir im Forum und habe mich angemeldet, weil ich ein kleines Problem habe. Eigentlich bin ich Maschinenbauer und habe etwas Erfahrung mit der Programmierung von SPS Systemen. Ich habe bisher keinen Erfahrung mit Arduino, möchte es aber lernen.

Ich möchte an einem Auto das Standlicht ausschalten, wenn der Blinker blinkt. Arduino bekommt also alle paar Sekunden ein Eingangssignal blinker = an. Er soll beim ersten blinker = an das standlich ausschalten und nach dem letzten blinker = an Signal noch 5 Sekunden warten und dann das standlicht wieder anschalten. Ich habe schon eine weile rumprobiert, bekomme es aber nicht hin.

mein Sketch sieht so aus:

int blinker=7;
int standlicht=8;
int tasterstatus=0; // Abfrage Blinker
int oldval=0; // Zwischenspeicher um mehrfach Betätigung abzufangen (was nicht klappt)

void setup() //Wir starten mit dem Setup


{

pinMode(7, INPUT); // Blinker.

pinMode(8, OUTPUT); // Standlicht

}

void loop() 

{
digitalWrite(standlicht, HIGH);

if (oldval == 0) // Abfrage des Blinkers
{
tasterstatus=digitalRead(blinker);
}


if ((tasterstatus == HIGH) && (oldval == 0))
{
 oldval = 1;  
 digitalWrite(standlicht, LOW);
 delay(5000);
 digitalWrite(standlicht, HIGH);           
 oldval = 0;  
}

}

Ich hoffe ihr könnt mir helfen. Vermutlich ist das für einen Profi ein Klacks :-)

LG Eric

bitte a) bevor du Code postest, drücke strg-t in der IDE und entferne Leerzeilen b) dann habe ich ein paar Anmerkungen für deinen Code c) zum Suchen von Logik-Fehlern mach dir reichlich Serial.print ausgaben, damit du verstehst,was dein Programm macht

nur so als Beispiel:

const byte blinker = 7;  // ändert sich nicht, daher const
const byte standlicht = 8;

int tasterstatus = 0; // Abfrage Blinker
int oldval = 0; // Zwischenspeicher um mehrfach Betätigung abzufangen (was nicht klappt)

void setup()
{
  Serial.begin(115200);
  pinMode(blinker, INPUT); // nicht kommentieren sondern hinschreiben!.
  pinMode(standlicht, OUTPUT);
}

void loop()

{
  digitalWrite(standlicht, HIGH);
  if (oldval == 0) // Abfrage des Blinkers
  {
    Serial.println(F("D20 oldval==0"));
    tasterstatus = digitalRead(blinker);
  }

  if ((tasterstatus == HIGH) && (oldval == 0))
  {
    Serial.print(F("D26 oldval=")); Serial.println(oldval);
    oldval = 1;
    digitalWrite(standlicht, LOW);
    delay(5000);
    digitalWrite(standlicht, HIGH);
    oldval = 0;
    Serial.print(F("D32 oldval=")); Serial.println(oldval);
  }
}

wenn du es nicht selber findest, poste deine Serial Ausgabe und berichte.

Vermutlich liegts daran, dass das wesentliche oldval nicht geändert wird und somit für die Ifs immer 0 ist. Vermutlich, weil ich solche Variablen normalerweise nicht mal ansehe. oldval ... ist was? überlege dir da einen sprechenden namen. Unter "standlicht" kann ich mir ja auch was vorstellen (standlichtPin wäre fast perfekt gewesen).

P.S.: ich sehe das nur rein als Schreibtisch-Projekt - nicht als Anwendung in einem Auto. Von den rechtlichen Sachen ganz abgesehen, um in einem Auto sowas sicher betreiben zu können braucht es mehr als nur einen 20zeiler.

Du weißt schon daß Du bei einem PKW keine solche Umbauten machen darfst. Es erlischt die Fahrerlaubnis. Grüße Uwe

Es handelt sich um einen 49 Jahre alten Oldtimer. Das Standlicht soll, wie es im original war, mit in die Blinker. Original ist dort eine kleine Glühbirne.

Da heute jeder mit Tagfahrlicht fährt, möchte ich einen helleren LED Ring verwenden, damit ich auch noch gesehen werde also aus Sicherheitsgründen.

Damit die Blinker besser gesehen werden beim blinken, soll dieser LED Ring dann ausgeschaltet werden. Ich habe das "Projekt" mit meinem TÜV Gutachter besprochen und er würde mir das eintragen.

Frank und frei: die rechtliche Situation ist mir egal (obwohl ich stark bezweifle dass ein "TÜV Gutachter" eine Lichttechnisches Gutachten schreiben wird, aber das brauchen wir jetzt gar nicht diskutieren, tu was du nicht lassen kannst.),

aber rein von der Elektrik solltest du dir das ansehen: http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.23

und zurück zum Schreibtisch: Fehler gefunden?

Ich bin für Eure Hinweise zunächst dankbar. Ich finde es auch gut/wichtig dass alle Fahrzeuge zugelassen sind. Bei Oldtimern, bei denen die Sicherheit erhöht werden kann, scheint der TÜV auch etwas kulanter zu sein. Ich habe mal ein Bild angehängt, damit ihr seht für was für ein Auto es sich handelt. Anhänger ist eine Eigenbau.

Im Code habe ich noch geändert, aber es klappt noch nicht. Der Hinweis mit der Seriellen Ausgabe war super. tastenstatus sollte ja eigentlich als Speicher gelten und sich während des delay in der if Schleife nicht ändern. Also die Idee ist, dass ich den blinker abfrage in tasterstatus speicher, die Funktion ausführe, dann den tastenstatus zurücksetze und erst dann wieder eine Eingabe vom blinker entgegennehme. Aber irgendwie funkt mir der blinker dazwischen.

const byte blinker = 7; // ändert sich nicht, daher const
const byte standlicht = 8;
int tasterstatus = 0; // Abfrage Blinker

void setup()
{
Serial.begin(115200);
pinMode(blinker, INPUT);
pinMode(standlicht, OUTPUT);
}

void loop()
{
digitalWrite(standlicht, HIGH);

Serial.print(F(“D22 tasterstatus=”)); Serial.println(tasterstatus);
tasterstatus = digitalRead(blinker);
Serial.print(F(“D24 tasterstatus=”)); Serial.println(tasterstatus);
if (tasterstatus == HIGH)
{
tasterstatus = LOW;
Serial.print(F(“D26 tasterstatus=”)); Serial.println(tasterstatus);
digitalWrite(standlicht, LOW);
delay(5000);
digitalWrite(standlicht, HIGH);
Serial.print(F(“D28 tasterstatus=”)); Serial.println(tasterstatus);
}
}

(deleted)

Dann blinkt aber das Standlicht im Wechsel zum Blinker. Das möchte ich nicht. Das Standlicht soll während der Zeit des Blinkens und dann noch weitere 5 Sekunden aus sein.

richtig anschließen, dann geht das ;-)

Egal.

schau dir mal das an.

ungetestet:

/*
  Retriggerbares Nachlaufrelais
  Standlicht für 5 sec aus wenn Blinker high
  Annahme: Blinkfrequenz ist niedriger als 5sec
  Sperre des Standlicht retriggert sich
*/

const byte blinker = 7;  // ändert sich nicht, daher const
const byte standlicht = 8;
int tasterstatus = 0;

bool isBlinking = false;

void setup()
{
  Serial.begin(115200);
  pinMode(blinker, INPUT);  // ac
  pinMode(standlicht, OUTPUT);

  //tagfahrlicht einschalten
  digitalWrite(standlicht, HIGH);
}

void loop()
{
  static uint32_t previousMillis = 0;             // Zeit merken wann wir zuletzt geblinkt haben, brauchen wir nächstes mal immer noch, daher static
  //Blinker einlesen
  isBlinking = digitalRead(blinker);
  Serial.print(F("D30 isBlinking=")); Serial.println(isBlinking);
  //behandeln
  if (isBlinking)                                 // Nachtriggern
  {
    Serial.print(F("D34 isBlinking=")); Serial.println(isBlinking);
    previousMillis = millis();
    digitalWrite(standlicht, LOW);                // wir schalten trotzdem aus, auch wenns schon ausgeschalten gewesen wäre, eh wurscht
  }
  if (millis() - previousMillis > 5000)           // Nach Zeitablauf einschalten
  {
    Serial.print(F("D40 isBlinking=")); Serial.println(isBlinking);
    digitalWrite(standlicht, HIGH);
  }
}

... aber nur weil ich Puch mag und ich einen Fiat erkenne.

Der Code funktioniert auf meinem Testboard. Danke !!!

Allerdings muss ich ihn noch verstehen. Und ich werde es am Wagen testen, dann melde ich mich noch mal.

Vielen Dank an alle und besonders an noiasca.

PS: Ich bin Fiat Fan, mag aber auch die Puchs :-)

eric69: Dann blinkt aber das Standlicht im Wechsel zum Blinker. Das möchte ich nicht. Das Standlicht soll während der Zeit des Blinkens und dann noch weitere 5 Sekunden aus sein.

Hallo,

da hast Du recht und das geht meines Erachtens auch nicht anders. Bei einem Oldtimer wird es so sein : Klemme "15 Zündung ein" geht auf das Blinkrelais Eingang. Der Ausgang Klemme 49 geht auf den Blinkerschalter der ist in Mittelstellung aus und schaltet recht 49R und links 49L ein. Von da geht es je an die Glühbirnen. Damit gibt es kein Signal Blinker ein das dauernd Spannung führt.

ich habe da allerdings ehr andere Bedenken, das Bordnetz ist in der Regel so verseucht das Dein Aduino ohne geeignete Schutzmaßnahmen nicht lange lebt. Lichtmaschine und Zündung erzeugen Spannungsspitzen die ziemlich hoch sein können.

Heinz

Hi

Nebenfrage: Ist ein Oldtimer mit nachgerüstetem Tagfahrlicht überhaupt rechtlich noch ein Oldtimer? Wie ich schon hören durfte, braucht's zumindest für das H-Kennzeichen das Fahrzeug als Original (und erhaltenswert muß Es auch noch sein - alt alleine reicht nicht - wobei das Bild schon schnieke ausschaut).

Für mich ist ein Auto aber leider nur ein Fortbewegungsmittel - ok, Spielkram wie eine Druckluft-Tröte dürfen schon mit ...

MfG

Was du willst nennt sich retriggerbares Monoflop

Das sind die großen Diskussionen in der Oldtimer Szene. Meine Einstellung ist: Möglichst orginal mit zwei Ausnahmen:

Verbesserungen die der Sicherheit dienen baue ich ein. Ich habe 3 kleine Kinder die mitfahren. Deswegen habe ich z.B. Sicherheitsgurte vorne und hinten eingebaut. Als der Wagen aktuell war fuhren die anderen Autos ohne Licht am Tag. Heute haben alle Tagfahrlicht an. Der Wagen ist auch noch sehr klein, also möchte ich die Sichtbarkeit erhöhen, sonst wurde ich keine LED Technik einbauen.

Langstrecke. Ich fahre den Wagen auch weiten Strecken mit Anhänger. Im Sommer war ich z.B. in London. Deswegen haben ich Optimierungen an Motor und Getriebe vorgenommen, die die Langlebigkeit erhöhen.

Außerdem baue ich kein Tagfahlicht ein, sondern ersetze nur das vorhandene Standlicht im Hauptscheinwerfer durch ein Standlicht im Blinker. Es leuchtet also zusätzlich zum Abblendlicht, was ein Tagfahlicht ja nicht darf. Es ist aber auch nicht so hell wie ein Tagfahrlicht. Ich möchte auch nicht, dass es als LED Ring von außen erkennbar ist. Es soll einfach nur wie ein helleres Standlicht aussehen.

Bei allen Veränderungen achte ich darauf, dass sie von außen nicht sichtbar sind. Mit dem H-Kennzeichen hatte ich bisher noch nie ein Problem.

Das soll aber jeder halten wie er will.

Hi

Danke für Deine Ausführungen - da auch Du Dich wohl alle paar Jahre beim TÜV vorstellen darfst, solltest Du ja schon einige Erfahrungen gesammelt haben, was geht.
Ein schönes Auto hast Du Da auf jeden Fall - wobei ich mir dort drin 2+3 echt ‘amüsant’ vorstellen mag :).

MfG