在許多情況下,使用觸摸傳感器代替按鈕。優(yōu)點(diǎn)是我們不必提供力量來按下按鈕,并且我們可以使用觸摸傳感器在不觸摸它的情況下激活一個鍵。觸摸傳感技術(shù)日益流行。在過去十年左右的時間里,很難想象沒有觸敏電子產(chǎn)品的世界。電阻式和電容式觸摸方法都可以用于開發(fā)觸摸傳感器,在本文中,我們將討論使用 ESP32 制作電容式觸摸傳感器的粗略方法,之前我們還使用 Raspberry pi 構(gòu)建了電容式觸摸按鈕。
什么是電容式觸摸傳感器及其工作原理?
電容器有多種形式。最常見的形式是含鉛封裝或表面貼裝封裝,但要形成電容,我們需要用介電材料隔開的導(dǎo)體。因此,很容易創(chuàng)建一個。一個很好的例子是我們將在下面的例子中開發(fā)的例子。
考慮到蝕刻后的 PCB作為導(dǎo)電材料,貼紙作為介電材料,所以現(xiàn)在的問題是,觸摸銅焊盤如何導(dǎo)致電容發(fā)生變化,以使觸摸傳感器控制器能夠檢測到?當(dāng)然是人的手指。
那么,主要有兩個原因:一是我們手指的介電特性,二是我們手指的導(dǎo)電特性。我們將使用 基于電容的觸摸。因此,我們將把重點(diǎn)轉(zhuǎn)向基于電容的觸摸傳感器。但在我們討論所有這些之前,重要的是要注意沒有任何傳導(dǎo)發(fā)生,并且手指是絕緣的,因?yàn)橘N紙中使用了紙張。因此,手指無法對電容器放電。
手指作為電介質(zhì):
眾所周知,電容器具有常數(shù)值,這可以通過兩個導(dǎo)電板的面積、板之間的距離和介電常數(shù)來實(shí)現(xiàn)。我們不能僅僅通過觸摸來改變電容器的面積,但我們可以肯定地改變電容器的介電常數(shù),因?yàn)槿说氖种妇哂信c顯示它的材料不同的介電常數(shù)。在我們的例子中,它是空氣,我們用手指置換空氣。 如果你問怎么做?這是因?yàn)榭諝?006在海平面室溫下的介電常數(shù)和手指的介電常數(shù)在80左右要高得多,因?yàn)槿说氖种钢饕伤M成。因此,手指與電容器電場的相互作用導(dǎo)致介電常數(shù)增加,因此電容增加。
現(xiàn)在我們已經(jīng)了解了原理,讓我們繼續(xù)制作實(shí)際的 PCB。
構(gòu)建四路電容式觸摸傳感器
本項(xiàng)目使用的電容式觸摸傳感器有四個通道,制作簡單。下面我們已經(jīng)提到了制作一個的詳細(xì)過程。
首先,我們在Eagle PCB 設(shè)計(jì)工具的幫助下為傳感器制作了 PCB,如下圖所示。
在尺寸和 Photoshop 的幫助下,我們制作了模板,最后制作了傳感器的貼紙,如下圖所示,
現(xiàn)在,當(dāng)我們完成貼紙后,我們繼續(xù)制作我們將用于制作 PCB 的實(shí)際復(fù)合板模板,如下圖所示,
現(xiàn)在我們可以打印此文件并繼續(xù)制作自制 PCB 的過程。如果您是新手,可以查看有關(guān)如何在家中構(gòu)建 PCB 的文章。您也可以從以下鏈接下載所需的 PDF 和 Gerber 文件
四通道電容式觸摸傳感器的 GERBER 文件
完成后,實(shí)際的蝕刻 PCB 如下圖所示。
現(xiàn)在是時候鉆一些孔了,我們將一些電線與 PCB 連接起來。這樣我們就可以將它與ESP32板連接起來。完成后,如下圖所示。
由于我們沒有在 PCB 上放置過孔,因此焊接時焊料會到處都是,我們通過在 PCB 上鉆孔來糾正我們的錯誤,您可以在上面的下載部分中找到該鉆孔。最后,是時候貼上貼紙并制作完成了。如下圖所示。
現(xiàn)在我們完成了觸控面板,是時候繼續(xù)制作觸控面板的控制電路了。
ESP32觸控電路所需材料
下面給出了使用 ESP32 構(gòu)建控制器部分所需的組件,您應(yīng)該能夠在當(dāng)?shù)氐膼酆蒙痰曛姓业狡渲械拇蟛糠帧?/p>
我還在下表中列出了所需的類型和數(shù)量的組件,因?yàn)槲覀冋谶B接一個四通道觸摸傳感器并控制四個交流負(fù)載,我們將使用 4 個繼電器來切換交流負(fù)載和 4 個晶體管來構(gòu)建繼電器驅(qū)動電路。
我們的電容式觸摸傳感器的控制電路
下圖顯示了我們基于 ESP32 的觸摸傳感器的完整電路圖。
如您所見,這是一個非常簡單的電路,所需的組件非常少。
由于它是一個簡單的觸摸傳感器電路,因此在您希望通過觸摸與設(shè)備交互的地方非常有用,例如,您可以通過觸摸打開/關(guān)閉設(shè)備,而不是使用典型的板載開關(guān)。
在原理圖中,DC 筒形千斤頂用作輸入,我們提供為電路供電所需的必要電源,從那里我們有我們的 7805 穩(wěn)壓器,它將未穩(wěn)壓的 DC 輸入轉(zhuǎn)換為恒定的 5V DC,通過它我們提供ESP32 模塊的電源。
接下來,在原理圖中,我們在引腳 25、26、27、28 上有觸摸連接器,我們將在此處連接觸摸板。
接下來,我們的繼電器通??過 BD139 晶體管切換,二極管 D2、D3、D4、D5 用于保護(hù)電路免受繼電器切換時產(chǎn)生的任何瞬態(tài)電壓的影響,這種配置中的二極管被稱為反激二極管/續(xù)流二極管。每個晶體管基極的 560R 電阻器用于限制通過基極的電流。
電容式觸摸傳感器電路的 PCB 設(shè)計(jì)
我們的觸摸傳感器電路的 PCB 是為單面板設(shè)計(jì)的。我們使用 Eagle 來設(shè)計(jì)我的 PCB,但您可以使用您選擇的任何設(shè)計(jì)軟件。我們的電路板設(shè)計(jì)的 2D 圖像如下所示。
足夠的跡線直徑用于制作電源跡線,用于使電流流過電路板。我們將螺絲端子放在頂部,因?yàn)檫@樣連接負(fù)載要容易得多,而電源連接器(一個DC 筒形插孔)被放置在側(cè)面,這也便于使用??梢詮南旅娴逆溄酉螺d Eagle 的完整設(shè)計(jì)文件和 Gerber。
基于 ESP32 的觸摸傳感器控制電路的 GERBER 文件
現(xiàn)在我們的設(shè)計(jì)已經(jīng)準(zhǔn)備就緒,是時候蝕刻和焊接電路板了。蝕刻、鉆孔和焊接過程完成后,電路板如下圖所示,
基于 ESP32 的電容式觸摸傳感器的 Arduino 代碼
對于這個項(xiàng)目,我們將使用我們將在稍后描述的自定義代碼對 ESP32 進(jìn)行編程。代碼非常簡單易用,
我們首先定義所有必需的引腳,在我們的例子中,我們定義了觸摸傳感器和繼電器的引腳。
?
#define Relay_PIN_1 15 #define Relay_PIN_2 2 #define Relay_PIN_3 4 #define Relay_PIN_4 16 #define TOUCH_SENSOR_PIN_1 13 #define TOUCH_SENSOR_PIN_2 12 #define TOUCH_SENSOR_PIN_3 14 #define TOUCH_SENSOR_PIN_4 27
?
接下來,在設(shè)置部分,我們首先初始化 UART 以進(jìn)行調(diào)試,接下來我們引入了 1S 的延遲,這給了我們一點(diǎn)時間來打開串行監(jiān)視器窗口。接下來,我們使用Arduinos pinMode函數(shù)將 Relay 引腳作為輸出,這標(biāo)志著Setup()部分的結(jié)束。
?
無效設(shè)置(){ 序列號.開始(115200); 延遲(1000); pinMode(Relay_PIN_1, OUTPUT); pinMode(Relay_PIN_2,輸出); pinMode(Relay_PIN_3, OUTPUT); pinMode(Relay_PIN_4, OUTPUT); }
?
我們以if語句開始我們的循環(huán)部分,內(nèi)置函數(shù)touchRead(pin_no)用于確定引腳是否被觸摸。touchRead?(pin_no)函數(shù)返回一個整數(shù)值范圍(0 - 100),該值始終保持在 100 附近,但是如果我們觸摸選定的引腳,該值會下降到接近零,并且在變化的值的幫助下,我們可以確定特定的引腳是否被手指觸摸。
在if語句中,我們正在檢查整數(shù)值是否有任何變化,如果該值低于 28,我們可以確定我們已經(jīng)確認(rèn)了一次觸摸。一旦if?語句為真,我們等待 50ms 并再次檢查參數(shù),這將幫助我們確定傳感器值是否被錯誤觸發(fā),然后我們使用digitalWrite(Relay_PIN_1, !digitalRead (Relay_PIN_1))?方法,其余代碼保持不變。
?
如果(觸摸讀?。═OUCH_SENSOR_PIN_1)<28){ 如果(觸摸讀取(TOUCH_SENSOR_PIN_1)<28){ Serial.println("傳感器一被觸摸"); digitalWrite(Relay_PIN_1, !digitalRead(Relay_PIN_1)); } } 否則如果 (touchRead(TOUCH_SENSOR_PIN_2) < 28) { 如果 (touchRead(TOUCH_SENSOR_PIN_2) < 28) { Serial.println("傳感器二被觸摸"); digitalWrite(Relay_PIN_2, !digitalRead(Relay_PIN_2)); } } 否則,如果(觸摸讀?。ㄓ|摸傳感器_PIN_3)<28){ 如果 (touchRead(TOUCH_SENSOR_PIN_3) < 28) { Serial.println("傳感器三被觸摸"); digitalWrite(Relay_PIN_3, !digitalRead(Relay_PIN_3)); } } 否則如果 (touchRead(TOUCH_SENSOR_PIN_4) < 28) { 如果 (touchRead(TOUCH_SENSOR_PIN_4) < 28) { Serial.println("傳感器四被觸摸"); digitalWrite(Relay_PIN_4, !digitalRead(Relay_PIN_4)); } }
?
最后,我們以另外 200 毫秒的阻塞延遲結(jié)束我們的代碼。
測試基于 ESP32 的觸摸傳感器電路
由于這是一個非常簡單的項(xiàng)目,因此測試裝置非常簡單,如您所見,我連接了 4 個 LED 和電阻作為負(fù)載,因?yàn)樗c繼電器連接,您可以輕松連接高達(dá) 3 安培的任何負(fù)載。
#define Relay_PIN_1 15
#define Relay_PIN_2 2
#define Relay_PIN_3 4
#define Relay_PIN_4 16
//所有繼電器引腳定義
#define TOUCH_SENSOR_PIN_1 13
#define TOUCH_SENSOR_PIN_2 12
#define TOUCH_SENSOR_PIN_3 14
#define TOUCH_SENSOR_PIN_4 27
//所有觸摸傳感器引腳定義
無效設(shè)置(){
序列號.開始(115200);//開始UART
延遲(1000);// 給我時間啟動串口監(jiān)視器
pinMode(Relay_PIN_1, OUTPUT);
pinMode(Relay_PIN_2,輸出);
pinMode(Relay_PIN_3, OUTPUT);
pinMode(Relay_PIN_4, OUTPUT);
//所有繼電器引腳設(shè)置為輸出
}
無效循環(huán)(){
/*
取消注釋以進(jìn)行調(diào)試
序列號.println(" ");
Serial.println("#############################");
Serial.print("Button1:");
Serial.println(touchRead(TOUCH_SENSOR_PIN_1)); // 獲取 Touch 0 pin = GPIO 4 的值
Serial.print("Button2:");
Serial.println(touchRead(TOUCH_SENSOR_PIN_2));
Serial.print("Button3:");
Serial.println(touchRead(TOUCH_SENSOR_PIN_3));
Serial.print("Button4:");
Serial.println(touchRead(TOUCH_SENSOR_PIN_4));
Serial.println("#############################");
序列號.println(" ");
*/
if ( touchRead(TOUCH_SENSOR_PIN_1) < 28) { // 檢查值是否達(dá)到 28 以下
延遲(50);
if ( touchRead(TOUCH_SENSOR_PIN_1) < 28) { //再次檢查值是否低于 28
Serial.println("傳感器一被觸摸");
digitalWrite(Relay_PIN_1, !digitalRead(Relay_PIN_1));
}
}
否則如果 (touchRead(TOUCH_SENSOR_PIN_2) < 28) {
延遲(50);
如果 (touchRead(TOUCH_SENSOR_PIN_2) < 28) {
Serial.println("傳感器二被觸摸");
digitalWrite(Relay_PIN_2, !digitalRead(Relay_PIN_2));
}
}
否則,如果(觸摸讀?。ㄓ|摸傳感器_PIN_3)<28){
延遲(50);
如果 (touchRead(TOUCH_SENSOR_PIN_3) < 28) {
Serial.println("傳感器三被觸摸");
digitalWrite(Relay_PIN_3, !digitalRead(Relay_PIN_3));
}
}
否則如果 (touchRead(TOUCH_SENSOR_PIN_4) < 28) {
延遲(50);// 用作去抖動延遲。
如果 (touchRead(TOUCH_SENSOR_PIN_4) < 28) {
Serial.println("傳感器四被觸摸");
digitalWrite(Relay_PIN_4, !digitalRead(Relay_PIN_4));
}
}
延遲(200);
}
評論
查看更多