
Ab wann soll das Teil in "Serie" gehen?
Und gibt es schon ne ungefähre Preisvorstellung?
Weiterhin viel Erfolg [emoji106]
Gruß,
Nille
Hört sich prima an, Roland.NyFAZ hat geschrieben: 20. Dez 2018 Tom, wenn das Teil in der Konfiguration praxiserprobt ist, bist Du mein zweiter Testdummy ;)
Wenn ich günstig an die MosFets komme baue ich Dir noch eins zusammen, will hier jedoch kein verbindliches Versprechen abgeben.
LG Roland
Klasse.NyFAZ hat geschrieben: 19. Dez 2018 So, liebe Gemeinde. Langsam wird es ernst.
9D50EA07-0004-4B14-A568-4012717F61D0.jpeg
LG Roland
Code: Alles auswählen
/*
Programmierung auf ATTiny84, Pins gemäß Anordnung
Pin1 Zündungsplus(Klemme15) Pin14 Masse(Klemme31)
Pin2 Ausgang Abblendlicht Pin13 Eingang Taster Blinker links
Pin3 Ausgang Anlasser Pin12 Eingang Taster Blinker rechts
Pin4 RESET Pin11 Eingang Taster Fernlicht
Pin5 Ausgang Hupe Pin10 Eingang Taster Hupe
Pin6 Ausgang Fernlicht Pin9 Eingang Starttaster
Pin7 Ausgang Blinker links Pin8 Ausgang Blinker rechts
*/
#define BUTTONLEFT 0 // digitaler Eingang linker Taster
#define BUTTONRIGHT 1 // digitaler Eingang rechter Taster
#define BUTTONLIGHT 2 // digitaler Eingang Fernlichttaster
#define BUTTONWARN 3 // digitaler Eingang Hupentaster
#define BUTTONSTART 4 // digitaler Eingang Motor an
#define BLINKPINRIGHT 5 // digitaler Ausgang rechter Blinker
#define BLINKPINLEFT 6 // digitaler Ausgang linker Blinker
#define LIGHTPIN 7 // digitaler Ausgang Lichtumschaltung
#define WARNPIN 8 // digitaler Ausgang Hupe
#define STARTPIN 9 // digitaler Ausgang Anlasser
#define ABLIGHTPIN 10 // digitaler Ausgang Abblendlicht
#define DEBOUNCETIME 10 // Zeit zum Entprellen in Millisekunden
#define LONGKEYPRESSTIME 250 // Zeit ab der ein Tastendruck "lang" ist
#define BLINKDELAY 500 // Blinkintervall
#define BLINKCOUNT 3 // Anzahl der Blinkimpulse bei kurzem Tastendruck
byte Fernlicht=false;
byte Starter=false;
void setup()
{
pinMode(BUTTONLEFT, INPUT_PULLUP);
pinMode(BUTTONRIGHT, INPUT_PULLUP);
pinMode(BUTTONLIGHT, INPUT_PULLUP);
pinMode(BUTTONWARN, INPUT_PULLUP);
pinMode(BUTTONSTART, INPUT_PULLUP);
// Die vier LED-Pins auf digitalen Output schalten
pinMode(BLINKPINLEFT, OUTPUT);
pinMode(BLINKPINRIGHT, OUTPUT);
pinMode(LIGHTPIN, OUTPUT);
pinMode(WARNPIN, OUTPUT);
pinMode(STARTPIN, OUTPUT);
pinMode(ABLIGHTPIN, OUTPUT);
digitalWrite(ABLIGHTPIN, HIGH);
}
void loop()
{
blinkTask();
}
void blinkTask()
{
static byte keystate=0; // Tastenstatus: je 4 Bit letzter und aktueller Tastenstatus
static byte keystate2=0; // Tastenstatus: je 4 Bit letzter und aktueller Tastenstatus
static byte blinkstate=0; // Blinkstatus in den untersten 2 Bits
static unsigned long lastTaskRun=0; // Zeit wann der Task zum letzten mal gelaufen ist
static unsigned long startBlinkMillis=0; // Zeitpunkt beim Setzen des Blinkers
static unsigned long startBeamMillis=0; // Zeitpunkt beim Tasten des Fernlichts
static byte shortButtonPress=false; // Wird true sobald ein kurzer Tastendruck erkannt wurde
static byte shortBeamPress=false; // Wird true sobald ein kurzer Tastendruck erkannt wurde
if (millis()-lastTaskRun<DEBOUNCETIME) return; // Task soll nur einmal pro DEBOUNCETIME laufen
lastTaskRun=millis();
setCurrentKeystate(keystate, keystate2);
handleStateChange(keystate, keystate2, blinkstate, startBlinkMillis, startBeamMillis, shortButtonPress, shortBeamPress, Starter);
handleBlinkState(blinkstate, millis()-startBlinkMillis, shortButtonPress, shortBeamPress);
if (Starter!=true)
{
handleBeam(Fernlicht);
handleLight(Fernlicht);
}
}
void handleLight(byte Fernlicht)
{
if (Fernlicht==true)
digitalWrite(ABLIGHTPIN, LOW);
if (Fernlicht!=true)
digitalWrite(ABLIGHTPIN, HIGH);
}
void handleBeam(byte Fernlicht)
{
if ((digitalRead(LIGHTPIN)!=HIGH) && (Fernlicht==true))
digitalWrite(LIGHTPIN,HIGH);
if ((digitalRead(LIGHTPIN)==HIGH) && (Fernlicht==false))
digitalWrite(LIGHTPIN,LOW);
}
void setCurrentKeystate(byte &state, byte &state2)
{
state= state<<4; // Den alten Status um 4 Bit nach links schieben
state2= state2<<4; // Den alten Status um 4 Bit nach links schieben
bitWrite(state,3,!digitalRead(BUTTONWARN)); // neuer Status Warn-Taste in Bit-3
bitWrite(state,2,!digitalRead(BUTTONLIGHT)); // neuer Status Licht-Taste in Bit-2
bitWrite(state,1,!digitalRead(BUTTONLEFT)); // neuer Status linke Taste in Bit-1
bitWrite(state,0,!digitalRead(BUTTONRIGHT));// neuer Status rechte Taste in Bit-0
bitWrite(state2,0,!digitalRead(BUTTONSTART)); // neuer Status linke Taste in Bit-0
}
void handleStateChange(byte keystate, byte keystate2 ,byte &blinkstate, unsigned long &startBlinkMillis, unsigned long &startBeamMillis, byte &shortButtonPress, byte &shortBeamPress, byte &Starter)
{
switch (keystate)
{
case 0b00000010: // Übergang 0000 nach 0010 = Blinker links wurde soeben gedrückt
if (blinkstate==0b11) // Wenn Blinkstatus "Warnblinker"
{
blinkstate=0b00; // Warnblinker aus
break;
}
if (blinkstate==0b10) // Wenn Blinkstatus "Blinker links"
blinkstate=0b00; // Blinker Stopp
else
{
blinkstate=0b10; // Blinker Links setzen
startBlinkMillis=millis();
}
shortButtonPress=false; // Flag für kurzen Tastendruck löschen
break;
case 0b00000001: // Übergang 0000 nach 0001 = Blinker rechts wurde soeben gedrückt
if (blinkstate==0b11) // Wenn Blinkstatus "Warnblinker"
{
blinkstate=0b00; // Warnblinker aus
break;
}
if (blinkstate==0b01) // Wenn Blinkstatus "Blinker rechts"
blinkstate=0b00; // Blinker Stopp
else
{
blinkstate=0b01; // Blinker Rechts setzen
startBlinkMillis=millis();
}
shortButtonPress=false; // Flag für kurzen Tastendruck löschen
break;
case 0b00000100: // Übergang 0000 nach 0100 = Fernlichttaster wurde soeben gedrückt
if (Fernlicht) //Wenn Fernlichtflag aktiv
{
Fernlicht=false;
}
else
{
Fernlicht=true;
startBeamMillis=millis();
}
shortBeamPress=false; // Flag für kurzen Tastendruck löschen
break;
case 0b10001000: // Taster gehalten 1000 nach 1000 = Hupentaster wird gehalten (Zweiter Durchgang: Bit 3+8 auf HIGH)
digitalWrite(WARNPIN,HIGH);
break;
}
switch (keystate2)
{
case 0b00000001: // Starttaster wird gerade gedrückt
digitalWrite(ABLIGHTPIN, LOW);
digitalWrite(LIGHTPIN, LOW);
digitalWrite(STARTPIN,HIGH);
Starter=true;
break;
case 0b00010001: // Starttaster wird gehalten
break;
case 0b00010000: // Starttaster wurde gerade los gelassen
digitalWrite(STARTPIN,LOW);
digitalWrite(ABLIGHTPIN, HIGH);
digitalWrite(LIGHTPIN, LOW);
Starter=false;
//Theoretisch auf D+ testen ob Motorlauf vorhanden
break;
}
//Hupe ausschalten wenn Taster nicht mehr gedrückt wird, unabhängig der anderen Zustände
if (!bitRead(keystate,3))
digitalWrite(WARNPIN,LOW);
// Sonderfall Warnblinker wenn Links/Rechts gedrückt,
// aber vorher nicht beide Tasten schon gedrückt waren
// Übergang von "nicht beide gedrückt" auf "beide gedrückt"
if ((keystate & 0b11) == 0b11 && (keystate & 0b00110000) < 0b00110000)
blinkstate=0b11;
// Sonderfall kurzer Tastendruck beim Links- oder Rechtsblinken
if (keystate==0 && millis()-startBlinkMillis<LONGKEYPRESSTIME && (blinkstate==0b10 || blinkstate==0b01))
shortButtonPress=true;
// Sonderfall kurzer Tastendruck beim Links- oder Rechtsblinken
if (keystate==0 && millis()-startBeamMillis<LONGKEYPRESSTIME && Fernlicht==true)
shortBeamPress=true;
}
void handleBlinkState(byte &blinkstate, unsigned long blinkTime, byte &shortButtonPress, byte &shortBeamPress)
{
boolean blinkPhase, currentOn;
// Prüfen, ob nach Einschalten mit kurzem Buttondruck die Blinkdauer abgelaufen ist
if (shortButtonPress && blinkTime>=(BLINKCOUNT*2-1)*BLINKDELAY && (blinkstate==0b01 || blinkstate==0b10))
blinkstate=0b00; // falls ja, Blinken hier automatisch beenden
// Lichthupe
if (shortBeamPress && Fernlicht==true)
Fernlicht=false;
if ((blinkTime/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);
}