Keyboard
Read in the keyboard
== main.cpp ==
#include <Arduino.h> #include "keyboard.h" #undef DEBUG keycodes_t key1 = keycode_invalide; void setup() { activatePullups(); Serial.begin(9600); } void loop() { key1 = readKeys(); //blockiert! uint8_t x=(int)key1; Serial.print(x,HEX); }
== keyboard.h ==
#ifndef KEYBOARD_H_ #define KEYBOARD_H_ //Keys on PORTX/PINX #define PINX PIND #define PORTX PORTD #define VOL_DN 0 #define VOL_UP 1 #define CH_DN 4 #define CH_UP 7 #ifdef DEBUG #define DEBOUNCETIME 2 #define LONGKEYPRESSURE_MINIMALTIME 5 #else #define DEBOUNCETIME 25 #define LONGKEYPRESSURE_MINIMALTIME 15 #endif enum keycodes_t{ keycode_invalide, keycode_vol_up,keycode_vol_dn, keycode_ch_up, keycode_ch_dn, keycode_vol_up_long,keycode_vol_dn_long, keycode_ch_up_long, keycode_ch_dn_long, keycode_mute, keycode_ch_search, keycode_ch_save, keycode_eeprom_clear, keycode_testmode }; keycodes_t readKeys(); void activatePullups(); #endif /* KEYBOARD_H_ */
== keyboard.cpp ==
#include <Arduino.h> #include "keyboard.h" void activatePullups(){ PORTX |= (1<<VOL_UP|1<<VOL_DN|1<<CH_UP|1<<CH_DN); } enum keycodes_t readKeys(){ uint8_t mask = 1<<VOL_UP|1<<VOL_DN|1<<CH_UP|1<<CH_DN; while ((PINX & mask) == mask){} //wait for key pressure delay(DEBOUNCETIME); //debounce time …
Analog Keyboard
Jede Taste erzeugt an einem Spannungsteiler eine eigene Spannung. Über einen Analogeingang werden die Spannungen ausgewertet. Mehrfachtastendrücke möglich (aber nicht getestet)
//short Keystrokes = Keycode 1,2,3 //long Keystrokes = 11, 12, 13 //very long Keystrokes = 101, 102, 103 uint8_t waitForKey() { int keyTime = 0; TRACE ("waitForKey") int newSensorValue = 0; DELAY (20); //let the adc recreate while (sensorValue == 0) { sensorValue = analogRead (analogInPin); DELAY (50) //debounce } //delay(50); //let the adc settle sensorValue = analogRead (analogInPin); DELAY (300); newSensorValue = analogRead (analogInPin); while ( (newSensorValue / 100 == sensorValue / 100) && (sensorValue != 0) ) { // div by 100 to reduce sensibility DELAY (300) keyTime++; newSensorValue = analogRead (analogInPin); if (keyTime >= 2){ Radio.mute(); //feedback to user for long key pressure delay(50); Radio.unMute(); } if (keyTime > 6){ Radio.mute(); //feedback to user for very long key pressure delay(500); Radio.unMute(); } } int keyValue = map (sensorValue, 0, 1023, 0, 5); if (keyTime >= 2 && keyTime <= 6) { keyValue += 10; } else if (keyTime > 6) { keyValue += 100; } sensorValue = 0; return keyValue; }