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