ich würde gerne die originale Lenkradfernbedienung eines 2015er Autos in meinem 2003er nutzen. Die LFB selbst funktioniert über eine Widerstandskaske. Nun will ich das bei Drücken von Taste 1 (1,2kOhm) Relais 1 geschaltet wird. Das ganze soll in 2 Strängen (LFB Modul links und rechts) in insgesamt 12 Relais umgesetzt werden.
Mein Vorgedanke dazu war das ich mittels Festspannungsregler und ein paar Kondensatoren die 12V (bzw. 13,4V Ladespannung) auf glatte 5V runterreduzieren kann.
Nun sollte man über den Spannungsfall der Widerstände über den Analogeingang die unterschiedlichen Taster auswerten können.
Hardwaretechnisch ist aktuell nichts vorhanden, das würde dann entsprechend angeschafft werden. Hier bin ich nicht ganz unbedarft, Löten und Platinenbau ist kein Problem. Leider gilt das nicht für die Programmierung, hier bin ich absolut unfähig...
Ich hoffe aufs blaue hinaus mir kann hier geholfen werden.
Wenn die Widerstände geschickt gewählt sind, reicht eine einfache lineare Transformation des Analogwerts. Falls nicht, brauchst du ein switch...case Konstrukt, in dem du die einzelnen Wertebereiche abfragst.
Unten ein Beispiel aus einem eigenen Projekt zum ersten Fall mit sechs Tastern, inklusive einfachem debouncing. Bei Bedarf reiche ich die Widerstandswerte nach. Und: Diese Lösung kann natürlich nicht mit mehreren simultan gedrückten Tasten umgehen.
/* Buttons / user input */
const uint8_t bs_noButton = 0;
const uint8_t bs_downButton = 1;
const uint8_t bs_centerButton = 2;
const uint8_t bs_rightButton = 3;
const uint8_t bs_upButton = 4;
const uint8_t bs_leftButton = 5;
const uint8_t bs_menuButton = 6;
const uint8_t pinSharedButtonDivider = 171; // 1023/6 buttons
const uint8_t inputPin = 3; // PB3, phys. pin 2
const unsigned long buttonDebouncePeriod = 100; // ignore any button action after any button event for this long
uint8_t previousButtonState = bs_noButton; //
unsigned long lastButtonChange = 0; // time in millis()
/*
read current key presses and debounce
returns button code if button was just released, else bs_noButton
*/
uint8_t readButtons() {
uint8_t res = bs_noButton;
if ((millis() - lastButtonChange) > buttonDebouncePeriod) { // long enough after last event
uint8_t currentButtonState = convertAnalogInputToButton(analogRead(inputPin)) ; //
if (currentButtonState != previousButtonState) {
lastButtonChange = millis(); // start debounce period
if (currentButtonState == bs_noButton) { // button was realeased
res = previousButtonState; // return the button that was just released
}
previousButtonState = currentButtonState;
}
}
return res;
}
uint8_t convertAnalogInputToButton(int analogValue) {
return ((analogValue + (pinSharedButtonDivider / 2)) / pinSharedButtonDivider);
}