/* * Anzeige des Gangs im Motorad * Messung des Gangs per Spannungsteiler und ADC * Anzeige über 6 LEDs per Charliplexing * ATtiny25 */ // Widerstände der Gänge /Ohm #define GANG1 560 #define GANG2 1000 #define GANG3 2000 #define GANG4 3000 #define GANG5 5000 #define GANG6 15000 // externer Widerstand für Spannungsteiler /Ohm #define REXT 7500 #define ADCWERT(x) ((1024L*x)/(x+REXT)) uint16_t schwelle[5]; // Schaltschwellen zwischen den Gängen // Codes für LEDs, charliplexing // oberes Nibble Tristate, unteres Nibble Zustand const uint8_t led[6] = {0x31, 0x32, 0x51, 0x54, 0x62, 0x64}; // setze Ausgänge für LEDs, Charliplexing void setLEDs(uint8_t data) { if (data & 0x10) pinMode(0, OUTPUT); else pinMode(0, INPUT); if (data & 0x20) pinMode(3, OUTPUT); else pinMode(3, INPUT); if (data & 0x40) pinMode(4, OUTPUT); else pinMode(4, INPUT); digitalWrite(0, data & 0x01); digitalWrite(3, data & 0x02); digitalWrite(4, data & 0x04); } void setup() { // Schaltschwellen berechnen schwelle[0] = (ADCWERT(GANG1) + ADCWERT(GANG2))/2; schwelle[1] = (ADCWERT(GANG2) + ADCWERT(GANG3))/2; schwelle[2] = (ADCWERT(GANG3) + ADCWERT(GANG4))/2; schwelle[3] = (ADCWERT(GANG4) + ADCWERT(GANG5))/2; schwelle[4] = (ADCWERT(GANG5) + ADCWERT(GANG6))/2; } void loop() { unsigned int adcWert, j; adcWert = analogRead(A1); for (j=0; j<5; j++) { if (adcWert <= schwelle[j]) break; } setLEDs(led[j]); delay(100); }