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