Seite 37 von 37

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM etc)

Verfasst: 16. Mär 2022
von Emil1957
Da bald Ostern ist, wäre ich auch an einem Ei interessiert.

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM etc)

Verfasst: 17. Mär 2022
von Dragon
Okay, dann biete mir doch gerne per PN zwei Stück an. Den dritten integriere ich ins Cockpit.
Fragen zum Schaltplan:
1. Die Dioden sind Standard 1N4001 ?
2. Die Blinker, wenn ich meinen Schaltplan richtig lese, dann kommt von der Armatur (Schalter Re/Li) +12V
Liege ich da falsch, oder hast du das geändert?
VG
Axel

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM etc)

Verfasst: 17. Mär 2022
von brummbaehr
1N400x oder auch 1N4148 sind OK
Die Armatur habe ich umgebaut auf Taster und es wird Masse geschaltet.

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM etc)

Verfasst: 13. Jun 2022
von brummbaehr
Auf meiner Tour letzte Woche habe ich noch einen Software-Fehler in dem Ei gefunden.
Wenn man das automatische Abschalten nicht abwartet und nach dem wieder losfahren den Blinker manuell durch Tastendruck abschaltet, dann passiert beim nächsten Tastendruck einfach nix. :oops: Da der Merker für die automatische Abschaltung noch gesetzt ist, wird beim Tastendruck der Blinker gleich wieder ausgeschaltet. Ein weiterer Tastendruck funktioniert dann wieder.
Der Fehler ist nun behoben.

Dann ist mir aber noch etwas anderes aufgefallen.
Wenn man kurz hintereinander erst Rechts und dann Links (oder anders herum) abbiegen muss, dann kann man nicht von Rechts-Blinken direkt auf Links-Blinken umschalten.
Der Tastendruck (Links) schaltet dann den Blinker Rechts Aus. Erst ein weiterer Tastendruck (Links) schaltet dann den Blinker Links Ein. Das ist irgendwie doof...
Ich habe nun die Software so angepasst, das mit dem Tastendruck (Links) direkt umgeschaltet wird auf Links-Blinken.
Das manuelle Ausschalten des Blinkers ist daher nur noch möglich wenn der passende Taster betätigt wird.

Wenn z.B. der rechte Blinker blinkt, dann kann der manuell nur noch mit erneuter Betätigung Rechts abgeschaltet werden.
Ein Tastendruck auf Links schaltet dann um auf Links Blinken.

Code: Alles auswählen

/*
Programmierung auf ATTiny85, Pins gemäß Anordnung

13.06.2022

P2   Eingang Blinker Rechts
P3   Eingang Blinker Links
P4   Eingang Neutral/Kupplung

P0   Ausgang Blinker Rechts
P1   Ausgang Blinker Links
*/

#include <Bounce2.h>

#define Switch 0 // 0 --> Tastersteuerung, 1 --> Schalter
#define BLINKPINRIGHT 0 // digitaler Ausgang rechter Blinker
#define BLINKPINLEFT 1 // digitaler Ausgang linker Blinker
#define BUTTONRIGHT 2 // digitaler Eingang rechter Taster
#define BUTTONLEFT  3 // digitaler Eingang linker Taster
#define NEUTRAL 4 // digitaler Eingang Neutral/Kupplung

#define WARNBLINKPRESSTIME 2000 // Zeitdauer Tastendruck um Warnblinken ein zu schalten
#define LONGKEYPRESSTIME 300 // Zeit ab der ein Tastendruck "lang" ist
#define BLINKCOUNT 4 // Anzahl der Blinkimpulse bei kurzem Tastendruck
#define BLINKDELAY 400 // Blinkintervall
#define NEUTRALCOUNT 5 // Anzahl der Blinkimpulse nach dem die Maschine wieder los fährt

Bounce Bleft = Bounce();
Bounce Bright = Bounce();
Bounce Bneutral = Bounce();


void setup()
{
// Eingänge
Bleft.attach(BUTTONLEFT, INPUT_PULLUP);
Bleft.interval(20);
Bright.attach(BUTTONRIGHT, INPUT_PULLUP);
Bright.interval(20);
Bneutral.attach(NEUTRAL, INPUT_PULLUP);
Bneutral.interval(100);

// Ausgänge
pinMode(BLINKPINLEFT, OUTPUT);
pinMode(BLINKPINRIGHT, OUTPUT);
}

void loop()
{
Blinker();
}

//***** Blinker *****
void Blinker()
{
static int blinkstate=0; // Blinkstatus in den untersten 2 Bits
static unsigned long startBlinkMillis=0; // Zeitpunkt beim Setzen des Blinkers
static byte shortButtonPress=false; // Wird true sobald ein kurzer Tastendruck erkannt wurde
static byte longBeamPress=false; // Wird true sobald ein langer Tastendruck erkannt wurde
static boolean blinkPhase=false;
static boolean currentOn=false;
static unsigned long startNeutralMillis;
static boolean Neutral = false;


Bleft.update();
Bright.update();
Bneutral.update();

if (!Switch)  // ********* Tastersteuerung ***********
{
  //********* Blinker links *************  
  if (Bleft.fell())        //Blinker links wurde soeben gedrückt
  {
    startBlinkMillis=millis();
    if (blinkstate==0b00 || blinkstate==0b01) // Wenn Blinkstatus "AUS" (13.06.22) oder "Rechts"
    blinkstate=0b10; // Blinker Links setzen
    else
    blinkstate=0b00; // Blinker ausschalten
    
    shortButtonPress = false; // Flag für kurzen Tastendruck löschen
    Neutral = false; // 13.06.22 Flag für automatisches Ausschalten löschen
  }
  
  //********** Blinker rechts ***********
  if (Bright.fell())      //Blinker rechts wurde soeben gedrückt
  {
    startBlinkMillis=millis();
    if (blinkstate==0b00 || blinkstate==0b10) // Wenn Blinkstatus "AUS" (13.06.22) oder "Links"
    blinkstate=0b01; // Blinker Rechts setzen
    else
    blinkstate=0b00; // Blinker ausschalten
    
    shortButtonPress = false; // Flag für kurzen Tastendruck löschen
    Neutral = false; // 13.06.22 Flag für automatisches Ausschalten löschen
  }
  // Sonderfall Warnblinker wenn Links/Rechts länger als WARNBLINKPRESSTIME gedrückt
  if (!Bleft.read() || !Bright.read()) // && Bneutral.read())
  if ((millis()- startBlinkMillis) > WARNBLINKPRESSTIME)
  blinkstate=0b11;
  
  // Sonderfall kurzer Tastendruck beim Links- oder Rechtsblinken
  if (((Bright.read() && millis()-startBlinkMillis<LONGKEYPRESSTIME && blinkstate==0b01) || (Bleft.read() && millis()-startBlinkMillis<LONGKEYPRESSTIME && blinkstate==0b10)) && Bneutral.read())
  shortButtonPress=true;
  
  // Prüfen, ob nach Einschalten mit kurzem Buttondruck die Blinkdauer abgelaufen ist
  if (shortButtonPress && (millis()-startBlinkMillis)>=(BLINKCOUNT*2-1)*BLINKDELAY && (blinkstate==0b01 || blinkstate==0b10))
  blinkstate=0b00; // falls ja, Blinken hier automatisch beenden

  // Keinen Leerlauf mehr, und Kupplung losgelassen, jetzt nur noch kurz weiter Blinken
  if (Bneutral.rose() && blinkstate){
    startNeutralMillis=millis();
    Neutral = true;
  }
  if (Neutral && (millis()-startNeutralMillis)>=(NEUTRALCOUNT*2-1)*BLINKDELAY && (blinkstate==0b01 || blinkstate==0b10)){
    blinkstate=0b00; // falls ja, Blinken hier automatisch beenden
    Neutral = false;
  }
  if (Bneutral.fell() && blinkstate){ // Wird die Kupplung wieder gezogen, dann Blinken nicht ausschalten
    Neutral = false;
    shortButtonPress=false;
  }
   
}

else   // ********* Schaltersteuerung *********
{    
  if (!blinkstate)
    startBlinkMillis=millis();
    
  //********* Blinker links *************  
  if (!Bleft.read())   // Blinker links
  blinkstate |= 0b10;  // Blinker Links setzen
  else
  blinkstate &= 0b01;  // Blinker Links ausschalten
  
  
  //********** Blinker rechts ***********
  if (!Bright.read())  // Blinker rechts
  blinkstate |= 0b01;  // Blinker Rechts setzen
  else
  blinkstate &= 0b10;  // Blinker Rechts ausschalten
}

if (((millis()-startBlinkMillis)/BLINKDELAY)%2==0)
blinkPhase=true;
else
blinkPhase=false;

// Soll der linke Blinker gerade an sein?
currentOn=bitRead(blinkstate,1) && blinkPhase;
if (digitalRead(BLINKPINLEFT)!=currentOn)
digitalWrite(BLINKPINLEFT,currentOn);

// Soll der rechte Blinker gerade an sein?
currentOn=bitRead(blinkstate,0) && blinkPhase;
if (digitalRead(BLINKPINRIGHT)!=currentOn)
digitalWrite(BLINKPINRIGHT,currentOn);
}

Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM etc)

Verfasst: 21. Jun 2022
von Dragon
Danke für die Info. Ich habe das Ei bis jetzt noch nicht eingebaut. Habe mir eine zweite Armatur besorgt, damit ich das in Ruhe machen kann.
VG
Axel