Re: Elektronik Bastelei mit Arduino (Selbstbau Tacho, DZM etc)
Verfasst: 16. Mär 2022
Da bald Ostern ist, wäre ich auch an einem Ei interessiert.
Das Forum für Petrolheads, Garagenschrauber, Ölfinger, Frickelracer und Alteisentreiber
https://www.caferacer-forum.de/
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);
}