網拍上容易買到類似左下圖的4路觸控模組,對Arduino控制板而言,它相當於右下角的4組開關,所以程式不需要引用特別的程式庫:

此觸控模組的主要構成電路如下,負責處理電容觸控訊號的核心是TTP224晶片。TTP224的技術文件指出,每個觸控感應端可連接0~50pF的電容,藉以調整觸控感應的靈敏度,此模組採用的電容值為30pF。每當觸控端感應到人體碰觸時,對應的OUT1~OUT4將輸出高電位,模組上的LED也將被點亮。

相較於上一篇文章的簡易DIY觸控電路,使用觸控IC的好處是穩定、不易受外界環境影響(如:汗水、油污)和雜訊干擾,而且程式也簡單許多。
使用4路觸控開關模組製作LED調光器
本單元實驗將使用4路觸控模組的其中3個開關,當作LED燈的開關、調亮和調暗控制介面。
實驗材料
- Arduino Uno控制板×1
- 4路觸控開關模組×1
- 電阻:680Ω×1
- LED×1(顏色不拘)
LED接在Arduino的第5腳(或其他具PWM輸出的接腳),觸控模組的3個輸出,接Arduino的10~12腳。麵包板的接線示範:

偵測開關訊號變化的程式
本單元程式將做出「按一下開、再按一下關」的開關效果。每碰觸一次開關,開關模組就會輸出一個脈衝(方波):

當觸控訊號從低電位變成高電位,代表有人碰觸了開關,程式需要依照第5腳的LED狀態,決定:
- 若LED燈是亮著的,則要關閉它。
- 若LED燈是熄滅的,則要點亮它。
偵測單一開關訊號變化的程式:
const byte TOUCH_PIN = 10; // 觸控接腳
const byte LED_PIN = 13; // LED接腳
bool powerOn = false; // LED電源是否開啟,預設「否」
bool lastStatus = LOW; // 開關的上次狀態
bool btnStatus = LOW; // 開關的當前狀態
void setup() {
pinMode(TOUCH_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// 讀取開關當前的狀態
btnStatus = digitalRead(TOUCH_PIN);
// 如果目前開關的狀態是「高電位」,且之前的狀態是「低電位」…
if (btnStatus == HIGH && lastStatus == LOW) {
powerOn = !powerOn; // 反相電源狀態
digitalWrite(LED_PIN, powerOn);
}
lastStatus = btnStatus; // 紀錄訊號狀態
}
編譯、上傳程式之後,碰一下編號2的觸控板,可點亮LED;再碰一下觸控板,則關閉LED。
自訂觸鍵結構資料
本單元程式有三組觸控鍵,需要建立如下的變數來儲存接腳和開關狀態:
bool powerOn = false; // LED電源是否開啟,預設「否」 bool btnStatus = LOW; // 觸鍵的當前狀態 byte touchPin1 = 10; // 第1個觸鍵的接腳 bool lastStatus1 = LOW; // 第1個觸鍵的上次狀態 byte touchPin2 = 11; // 第2個觸鍵的接腳 bool lastStatus2 = LOW; // 第2個觸鍵的上次狀態 byte touchPin3 = 12; // 第3個觸鍵的接腳 bool lastStatus3 = LOW; // 第3個觸鍵的上次狀態
為了讓程式碼更清晰易讀,我們可以替具有相同資料結構的觸控鍵,定義如下的struct類型(struct類型定義的語法說明,請參閱「Mifare RFID-RC522模組實驗(二):C語言的結構(struct)與類型定義(typedef)說明」):
// 宣告觸鍵的自訂結構類型
typedef struct {
byte pin; // 按鍵的接腳編號
bool lastStatus; // 上次的狀態
} key;
如此,便能用底下的敘述宣告電源鍵的接腳及其預設狀態:
key powerKey = { 10, LOW };
觸控LED調光器的完整程式碼如下。「調亮」和「調暗」鍵只有在電源開啟(即,powerOn值為true)的狀態才有作用;燈光亮度值範圍介於0~255。
const byte LED_PIN = 5; // LED燈的接腳
const byte PWR_LED = 13; // 電源指示燈的接腳
bool powerOn = false; // LED電源是否開啟,預設「否」
bool btnStatus; // 按鈕狀態
int pwmVal = 0; // 電源輸出值
// 宣告觸鍵的自訂結構類型
typedef struct {
byte pin; // 按鍵的接腳編號
bool lastStatus; // 上次的狀態
} key;
// 宣告電源鍵的接腳和預設狀態
key powerKey = { 10, LOW };
// 宣告「調亮」鍵的接腳和預設狀態
key upKey = { 11, LOW };
// 宣告「調暗」鍵的接腳和預設狀態
key downKey = { 12, LOW };
void setup() {
Serial.begin(9600);
pinMode(powerKey.pin, INPUT);
pinMode(upKey.pin, INPUT);
pinMode(downKey.pin, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(PWR_LED, OUTPUT);
}
void loop() {
// 讀取電源鍵的狀態
btnStatus = digitalRead(powerKey.pin);
// 如果電源鍵的訊號從低電位變成高電位…
if (btnStatus && powerKey.lastStatus == LOW) {
powerOn = !powerOn; // 反相電源狀態
digitalWrite(PWR_LED, powerOn);
if (powerOn) { // 若powerOn為true…
// 依照pwmVal的值點亮LED
analogWrite(LED_PIN, pwmVal);
} else {
// 關閉LED燈
digitalWrite(LED_PIN, LOW);
}
}
// 紀錄這次的電源鍵訊號狀態
powerKey.lastStatus = btnStatus;
// 讀取「調亮」鍵的狀態
btnStatus = digitalRead(upKey.pin);
// 若「有開啟電源」且「此按鍵訊號是高電位」且「前次訊號是低電位」
if (powerOn && btnStatus && upKey.lastStatus == LOW) {
// 增加亮度值,每次增加10,不能超過255。
if ((pwmVal+10) <= 255) {
pwmVal += 10;
Serial.println(pwmVal);
analogWrite(LED_PIN, pwmVal);
}
}
upKey.lastStatus = btnStatus;
// 讀取「調暗」鍵的狀態
btnStatus = digitalRead(downKey.pin);
if (powerOn && btnStatus && downKey.lastStatus == LOW) {
// 減少亮度值,最低值為0
if ((pwmVal-10) >= 0) {
pwmVal -= 10;
Serial.println(pwmVal);
analogWrite(LED_PIN, pwmVal);
}
}
downKey.lastStatus = btnStatus;
}

老師想請教一下,目前是有兩個音訊輸入,而輸出也是有兩組音響 ,目前是希望能夠用nano當中繼的方式去控制播放與停止以及從第幾個音響播放(或是同時)然後若已經有音訊佔據了音響 另一個訊號輸入無效
我是想說直接透過4個繼電器來使用,再以程式端那邊控制無效那部分,不知道有沒有什麼更好的控制方式?