ESP32は、静電容量式のタッチセンサーを10個内蔵しています。(入力ピンT0~T9)
各ピンとGPIO番号の対応は次のようになっています。
T0 GPIO4
T1 GPIO0
T2 GPIO2
T3 GPIO15
T4 GPIO13
T5 GPIO12
T6 GPIO14
T7 GPIO27
T8 GPIO33
T9 GPIO32
主に使う関数だけテストしました。
タッチパッドの値を読み取る関数は
touchRead(uint8_t pin); //uint8_t pinは、GPIOの番号またはシンボル(T0~T9)
タッチセンサー割込み タッチパッドの値がしきい値(threshold)未満になったときに割込みをかける関数
touchAttacjInterrupt(uint8_t pin, ISR, uint_16 threshold); //pinはGPIO番号かシンボル、ISRは割込みがかかった時に実行する関数、割込みをかけるthresholdの値
まず、touchRead()で実際のタッチパッドの値を測定してみました。
T0のタッチパッドの値を1秒ごとにシリアルモニタに表示するスケッチです。
----------------------------
void setup(){
Serial.begin(115200);
}
void loop(){
Serial.println(touchRead(T0));
delay(1000);
}
----------------------------
タッチパッドの値は、
T0(GPIO4)にリード線も何もつけない状態のとき、88程度
T0にリード線をつけた状態で、79
リード線の先端の金属部分に触ったとき20以下でした。
タッチパッドをスイッチとして使う場合、しきい値(threshold)を50程度にすればよいようです。
そこで、リード線に触ったときにLEDが点灯するスケッチを描いてテストしました。
LEDは、GPIO27に接続します。タッチセンサーは、T0を使います。
-------------------------------
/*
* ESP32 Touch LED
* 2020.2.4
* JH7UBC Keiji Hata
*/
#define LED_Pin 27
void setup() {
pinMode(LED_Pin, OUTPUT);
}
void loop() {
if(touchRead(T0) < 50){
digitalWrite(LED_Pin, HIGH);
}else{
digitalWrite(LED_Pin, LOW);
}
}
-------------------------------
リード線に触るとLEDが点灯しました。
割込みについても次のようなスケッチでテストしました。
------------------------------------
/*
* ESP32 Touch interrupt test
* 2020.2.4
* JH7UBC Keiji Hata
*/
#define LED_Pin 27
//Interrupt Service Routine
void LED_Blink(){
digitalWrite(LED_Pin, !digitalRead(LED_Pin));
delay(500);
}
void setup() {
pinMode(LED_Pin, OUTPUT);
touchAttachInterrupt(T0, LED_Blink,50);
}
void loop() {
}
------------------------------------
リード線をチョン、チョンと触るとLEDが点灯、消灯を繰り返すのですが、触り続けると点灯しっぱなしになります。
安定して動作させるには、スケッチに工夫が必要なようです。
タッチセンサーは、いまのところあまり利用する予定がないので、動作を確認して終わりにしました。
※コメント投稿者のブログIDはブログ作成者のみに通知されます