STM32L-Discoveryは、14セグメント6桁のLCDもついた面白い基板ですが、
プログラムで使える機械的なタクトスイッチはひとつだけですので、タッチセンサーをスイッチとしてつかえるようにしてみました。(まあ、もともとスイッチなんですが)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
typedef enum { TSL_KEY_UP = (uint8_t)0, TSL_KEY_P1 = (uint8_t)1, TSL_KEY_P2 = (uint8_t)2, TSL_KEY_P3 = (uint8_t)3, TSL_KEY_P4 = (uint8_t)4, TSL_KEY_UNSTABLE = (uint8_t)255 } TSLKeyPos_T; TSLKeyPos_T GetTSLButtonState(void) { uint32_t slValue; TSLKeyPos_T ret; /*if touch detected by TSLibrary */ if((TSL_GlobalSetting.b.CHANGED)&&(TSLState == TSL_IDLE_STATE)){ /*reset TSL CHANGED FLag*/ TSL_GlobalSetting.b.CHANGED = 0; } /*check if SLIDER has been touched and display position*/ if((SLIDER_DETECTED)&&(TSLState == TSL_IDLE_STATE)){ /* get Slider position and convert it to a sensor SW position*/ slValue = SLIDER_POSITION ; ret = TSL_KEY_UP; if(slValue <= 20) ret = TSL_KEY_P1; if((slValue > 30)&&(slValue <= 100)) ret = TSL_KEY_P2; if((slValue > 120)&&(slValue <= 190)) ret = TSL_KEY_P3; if(slValue > 210) ret = TSL_KEY_P4; } else if((!TSL_GlobalSetting.b.CHANGED)&&(TSLState == TSL_IDLE_STATE)){ /*if no touch detected by TSLibrary */ ret = TSL_KEY_UP; } else{ ret = TSL_KEY_UNSTABLE; } return ret; } |
void Button_value(void)をちょっと改造しただけなんですけどね。
- タッチセンサに触れていないときは TSL_KEY_UP を返します。
- タッチセンサに触れているときはその位置に応じて TSL_KEY_P1 ~ TSL_KEY_P4 を返します。(タッチセンサの左側から順がP1です。)
- センサが安定していないときは TSL_KEY_UNSTABLE を返します。
28行目~31行目の閾値を変えると、隣のエリアに指が入って意図しない動作にならないように、不感帯を決めることができます。
1 2 |
TSL_Action(); key = GetTSLButtonState(); |
のように呼び出して使います。TSL_Action()もペアにして呼び出してください。