觸摸式開關壞了怎么辦(觸摸開關失靈怎么辦)
前沿拓展:
網拍上容易買到類似左下圖的4路觸控模塊,對Arduino控制板而言,它相當于右下角的4組開關,所以程序不需要引用特別的程序庫:
此觸控模塊的主要構成電路如下,負責處理電容觸控信號的核心是TTP224芯片。TTP224的技術文件指出,每個觸控感應端可連接0~50pF的電容,借以調整觸控感應的靈敏度,此模塊采用的電容值為30pF。每當觸控端感應到人體碰觸時,對應的OUT1~OUT4將輸出高電位,模塊上的LED也將被點亮。
相較于上一篇文章的簡易DIY觸控電路,使用觸控IC的好處是穩定、不易受外界環境影響(如:汗水、油污)和噪聲干擾,而且程序也簡單許多。
使用4路觸控開關模塊制作LED調光器本單元實驗將使用4路觸控模塊的其中3個開關,當作LED燈的開關、調亮和調暗控制界面。
實驗材料
Arduino Uno控制板×14路觸控開關模塊×1電阻:680Ω×1LED×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; }拓展知識:
- 1海信42k11p怎么折開(海信42K11P:全方位展示超清畫質)
- 2電視頻道沒了怎么恢復(快速解決方法)
- 3Fardior燃氣灶售后維修電話號碼查詢(Fardior燃氣灶售后維修電話查詢)
- 4艾木歐防盜門沒電打不開怎么辦(艾木歐防盜門沒電無法啟動?解決方法總結)
- 5ENS指紋鎖售后熱線(ENS指紋鎖售后熱線-專業解決您的問題)
- 6打電話顯示關機是什么原因(如何解決手機無法接通問題)。
- 7v500hk1 cs5故障維修(v500hk1 cs5故障維修指南)
- 8創維液晶電視的遙控器怎么調試(創維電視遙控器調試指南)
- 9林內空氣能售后服務官網熱線(林內空氣能售后服務官網熱線)
- 10朝友精工保險柜24小時售后電話(朝友精工保險柜24小時售后電話 - 完善24小時保
-
特靈空調維修服務電話(中央特靈空調水流開關故障如何判斷和修復)
2024-09-12
-
特靈全國服務電話(特靈空調機故障及維修常見故障及解決方法)
2024-09-12
-
三菱電機中央空調廠家24小時服務熱線電話(精密三菱空調安裝步驟應該注意哪些
2024-09-12
-
開利中央空調廠家24小時服務熱線(開利空調5e是什么意思詳解開利空調故障代碼
2024-09-12
-
特靈空調24小時客服在線咨詢(特靈空調加氟幾個壓是什么意思特靈空調加氟壓力
2024-09-12