按鍵訊號輸入
TACK Switch
圖片來源:https://www.icshop.com.tw/product-page.php?263
符號與圖片來源:例說8051
眾多家電裝置中,除觸碰感應外,舉反接觸式按鈕,大多使用TACK SW,外觀相似友直立、橫式、或長柄等。
按下時開關兩邊電路閉合(導通,Turn ON),放開時開關邊斷路(Turn OFF)。
按鈕電路訊號處理 >> MCU只管讀取訊號
圖片來源:例說8051
不論何種開關,在MCU上處理時,只讀取訊號的情況作為依據。
按鈕電路 控制內建LED亮滅 >> 採低態動作 <檔案位置>
// ===== 按鍵實驗 一顆按鍵 控制 亮滅 寸動 按下"亮" 未按"滅"=====
//使用ESP32 須注意 開關這邊給的訊號 是高態動作 或 低態動作
//button_0
#define Tsw 36 //開關訊號輸入腳
#define LED 2 //使用內建LED
void setup() {
pinMode(LED, OUTPUT); //將LED腳規畫為輸出埠
pinMode(Tsw, INPUT); //將Tsw腳規畫為輸入埠
digitalWrite(LED, 1); //關閉LED
}
void loop() {
/* 註解開關 第一段 在最左邊 加上斜線成 // 即可開啟本段
digitalWrite(LED,!digitalRead(Tsw));
delay(100); //暫停0.1秒
// 註解開關 第一段 結束
/*/
//註解開關 第二段 開始
int sw=digitalRead(Tsw); //讀取Tsw
digitalWrite(LED,!sw); //反應到LED
// 註解開關 結束*/
delay(100); //暫停0.1秒
}
按鈕訊號讀(butten_0sn,寸動+序列窗觀察)
// ===== 按鍵實驗 一顆按鍵 控制 亮滅 寸動 按下"亮" 未按"滅"=====
//使用ESP32 須注意 開關這邊給的訊號 是高態動作 或 低態動作
//加上序列監控 觀察TACK SW的動作情況
//button_0sn
#define Tsw 36 //開關訊號輸入腳
#define LED 2 //使用內建LED
void setup() {
Serial.begin(9600);
pinMode(LED, OUTPUT); //將LED腳規畫為輸出埠
pinMode(Tsw, INPUT); //將Tsw腳規畫為輸入埠
digitalWrite(LED, 1); //關閉LED
}
void loop() {
/* 註解開關 第一段 在最左邊 加上斜線成 // 即可開啟本段
digitalWrite(LED,!digitalRead(Tsw));
delay(100); //暫停0.1秒
// 註解開關 第一段 結束
/*/
//註解開關 第二段 開始
int sw=digitalRead(Tsw); //讀取Tsw
digitalWrite(LED,!sw); //反應到LED
Serial.print("TaskSW = ");
Serial.println(sw);
// 註解開關 結束*/
delay(100); //暫停0.1秒
}
控制內建LED亮滅(1個SW啟動,另1SW關閉)。開關的使用必須使用if指令語法
// ===== 按鍵實驗3 二顆按鍵 PB0按下"亮燈 並 計算次數" , PB2按下"關閉 滅 並歸0"=====
//不直接輸出 透過if條件式 設定燈亮滅的條件
// button_2
#define TswOFF 36
#define TswON 39
#define LED 2 //內建LED 高態亮 低態滅
void setup() {
pinMode(LED, OUTPUT); //將LED腳規畫為輸出埠
pinMode(TswOFF, INPUT); //將TswOFF腳規畫為輸入埠
pinMode(TswON, INPUT); //將TswON腳規畫為輸入埠
digitalWrite(LED, 0); //關閉LED
Serial.begin(9600);
}
void loop() {
int pb = digitalRead(TswOFF); //讀取pbOFF鈕
if (pb == 0) { //若按下pbOFF鈕
digitalWrite(LED, 0); //關閉LED
Serial.println("LED off ");
}
else {
int pb = digitalRead(TswON); //讀取pbON鈕
if (pb == 0) { //若按下pbON鈕
digitalWrite(LED, 1); //點亮LED
Serial.println("LED on ");
}
}
delay(100); //暫停0.1秒
}
用TACK SW來計算次數_顯示到七段顯示器上(引用七段顯示程式函數)
https://randomnerdtutorials.com/esp32-hc-sr04-ultrasonic-arduino/
如果上述開關電路,可以準確地用來精準的開啟與關閉 LED燈,那開關的需求也可以運用在許多地方,入用來計算買場用來計算入場人數與車輛的往來數量等,那透過上一個開啟與關閉電路,使用序列監控窗來模擬,Tsw1 為累加人次,Tsw2作為歸零。
則程式將修改如下:
// ===== 按鍵實驗4 二顆按鍵 PB0按下"亮燈 並 計算次數" , PB2按下"關閉 滅 並歸0"=====
//不直接輸出 透過if條件式 設定燈亮滅的條件
// button_3 並顯示在單顆 七段顯示器上
// p, g, f, e, d, c, b, a
char segpin[] = {27, 32, 33, 13, 12, 14, 26, 25};
// p,g,f,e,d,c,b,a 共陽極
byte seven_seg_digits[][8] = { { 1, 1, 0, 0, 0, 0, 0, 0 }, // = 0
{ 1, 1, 1, 1, 1, 0, 0, 1 }, // = 1
{ 1, 0, 1, 0, 0, 1, 0, 0 }, // = 2
{ 1, 0, 1, 1, 0, 0, 0, 0 }, // = 3
{ 1, 0, 0, 1, 1, 0, 0, 1 }, // = 4
{ 1, 0, 0, 1, 0, 0, 1, 0 }, // = 5
{ 1, 0, 0, 0, 0, 0, 1, 1 }, // = 6
{ 1, 1, 1, 1, 1, 0, 0, 0 }, // = 7
{ 1, 0, 0, 0, 0, 0, 0, 0 }, // = 8
{ 1, 0, 0, 1, 1, 0, 0, 0 } // = 9
};
// 在七段顯示器上顯示指定的一個數字
void sevenSegWrite(byte digit) {
for (byte seg = 0; seg < 8; ++seg)
digitalWrite(segpin[seg], seven_seg_digits[digit][seg]);// 共陽極 // digitalWrite(segpin[seg], !seven_seg_digits[digit][seg]);// 共陰極
}
#define TswOFF 36
#define TswON 39
#define LED 2 //內建LED 高態亮 低態滅
int swt = 0; //計算次數的變數
void setup() {
pinMode(LED, OUTPUT); //將LED腳規畫為輸出埠
pinMode(TswOFF, INPUT); //將TswOFF腳規畫為輸入埠
pinMode(TswON, INPUT); //將TswON腳規畫為輸入埠
digitalWrite(LED, 0); //關閉LED
Serial.begin(9600);
for (int i = 0; i < 8; i++) {
pinMode(segpin[i], OUTPUT);
digitalWrite(segpin[i], 0);
}
delay(2000);
}
void loop() {
int pb = digitalRead(TswOFF); //讀取pbOFF鈕
if (pb == 0) { //若按下pbOFF鈕
digitalWrite(LED, 0); //關閉LED
Serial.println("LED off ");
swt = 0;
}
else {
int pb = digitalRead(TswON); //讀取pbON鈕
if (pb == 0) { //若按下pbON鈕
digitalWrite(LED, 1); //點亮LED
Serial.println("LED on ");
swt++;
}
}
//delay(100); //暫停0.1秒
sevenSegWrite(swt % 10);
Serial.print("swt = ");
Serial.println(swt);
}
用TACK SW使用上的實際問題_接點彈跳現象<彈跳檔案>
https://randomnerdtutorials.com/esp32-hc-sr04-ultrasonic-arduino/
圖片來源:例說8051
//counter0 使用序列視窗 觀察彈跳現象
// 36腳 每次加1
// 39腳 歸零
#define TswAdd 36
#define TswSub 39
#define LED 2 //內建LED 高態亮 低態滅
int counter=0;
void setup() {
pinMode(LED, OUTPUT); //將LED腳規畫為輸出埠
pinMode(TswAdd, INPUT); //將TswAdd腳規畫為輸入埠
pinMode(TswSub, INPUT); //將TswSub腳規畫為輸入埠
digitalWrite(LED, 0); //關閉LED
Serial.begin(9600);
}
void loop() {
int pbAdd = digitalRead(TswAdd); //讀取pbOFF鈕
if (pbAdd == 0) { //若按下pbOFF鈕
digitalWrite(LED, 0); //關閉LED
counter++;
Serial.print("counter = ");
Serial.println(counter);
}//if (pbAdd == 0)
else {
int pbSub = digitalRead(TswSub); //讀取pbON鈕
if (pbSub == 0) { //若按下pbON鈕
digitalWrite(LED, 1); //點亮LED
counter=0;
Serial.print("counter = ");
Serial.println(counter );
}//if (pbSub == 0)
}//if (pbAdd == 0)else
delay(0); //暫停0.1秒
}//loop() {
//counter1 使用序列視窗 觀察使用delay 無窮迴圈 消除彈跳現象
// 按鈕放開後動作
// 36腳 每次加1
// 39腳 歸零
#define TswAdd 36
#define TswSub 39
#define LED 2 //內建LED 高態亮 低態滅
int counter=0;
void setup() {
pinMode(LED, OUTPUT); //將LED腳規畫為輸出埠
pinMode(TswAdd, INPUT); //將TswAdd腳規畫為輸入埠
pinMode(TswSub, INPUT); //將TswSub腳規畫為輸入埠
digitalWrite(LED, 0); //關閉LED
Serial.begin(9600);
}
void loop() {
int pbAdd = digitalRead(TswAdd); //讀取pbOFF鈕
if (pbAdd == 0) { //若按下pbOFF鈕
delay(20);//等待20ms 等待彈跳現象結束
while (!pbAdd) pbAdd = digitalRead(TswAdd); //等待TswAdd鈕放開
digitalWrite(LED, 0); //關閉LED
counter++;
Serial.print("counter = ");
Serial.println(counter);
}//if (pbAdd == 0)
else {
int pbSub = digitalRead(TswSub); //讀取pbON鈕
if (pbSub == 0) { //若按下pbON鈕
digitalWrite(LED, 1); //點亮LED
counter=0;
Serial.print("counter = ");
Serial.println(counter );
}//if (pbSub == 0)
}//if (pbAdd == 0)else
delay(0); //暫停0.1秒
}//loop() {
//counter2 使用序列視窗 觀察使用delay 無窮迴圈 消除彈跳現象
// 按鈕按下立即動作
// 36腳 每次加1
// 39腳 歸零
#define TswAdd 36
#define TswSub 39
#define LED 2 //內建LED 高態亮 低態滅
int counter=0;
void setup() {
pinMode(LED, OUTPUT); //將LED腳規畫為輸出埠
pinMode(TswAdd, INPUT); //將TswAdd腳規畫為輸入埠
pinMode(TswSub, INPUT); //將TswSub腳規畫為輸入埠
digitalWrite(LED, 0); //關閉LED
Serial.begin(9600);
}
void loop() {
int pbAdd = digitalRead(TswAdd); //讀取pbOFF鈕
if (pbAdd == 0) { //若按下pbOFF鈕
digitalWrite(LED, 1); //點亮LED
counter++;
Serial.print("counter = ");
Serial.println(counter);
//彈跳處理
delay(20);//等待20ms 等待彈跳現象結束
while (!pbAdd) pbAdd = digitalRead(TswAdd); //等待TswAdd鈕放開
}//if (pbAdd == 0)
else {
int pbSub = digitalRead(TswSub); //讀取pbON鈕
if (pbSub == 0) { //若按下pbON鈕
digitalWrite(LED, 0); //關閉LED
counter=0;
Serial.print("counter = ");
Serial.println(counter );
}//if (pbSub == 0)
}//if (pbAdd == 0)else
delay(0); //暫停0.1秒
}//loop() {
用TACK SW使用上的實際問題_接點彈跳現象
https://randomnerdtutorials.com/esp32-hc-sr04-ultrasonic-arduino/
// ===== 按鍵實驗5 二顆按鍵 PB0按下"亮燈 並 計算次數" , PB2按下"關閉 滅 並歸0"=====
//不直接輸出 透過if條件式 設定燈亮滅的條件
// button_3 並顯示在單顆 七段顯示器上
//透過while 迴圈確認未放開按鈕時程式在等待狀態
// p, g, f, e, d, c, b, a
char segpin[] = {27, 32, 33, 13, 12, 14, 26, 25};
// p,g,f,e,d,c,b,a 共陽極
byte seven_seg_digits[][8] = { { 1, 1, 0, 0, 0, 0, 0, 0 }, // = 0
{ 1, 1, 1, 1, 1, 0, 0, 1 }, // = 1
{ 1, 0, 1, 0, 0, 1, 0, 0 }, // = 2
{ 1, 0, 1, 1, 0, 0, 0, 0 }, // = 3
{ 1, 0, 0, 1, 1, 0, 0, 1 }, // = 4
{ 1, 0, 0, 1, 0, 0, 1, 0 }, // = 5
{ 1, 0, 0, 0, 0, 0, 1, 1 }, // = 6
{ 1, 1, 1, 1, 1, 0, 0, 0 }, // = 7
{ 1, 0, 0, 0, 0, 0, 0, 0 }, // = 8
{ 1, 0, 0, 1, 1, 0, 0, 0 } // = 9
};
// 在七段顯示器上顯示指定的一個數字
void sevenSegWrite(byte digit) {
for (byte seg = 0; seg < 8; ++seg)
digitalWrite(segpin[seg], seven_seg_digits[digit][seg]);// 共陽極 // digitalWrite(segpin[seg], !seven_seg_digits[digit][seg]);// 共陰極
}
#define TswOFF 36
#define TswON 39
#define LED 2 //內建LED 高態亮 低態滅
int swt = 0; //計算次數的變數
void setup() {
pinMode(LED, OUTPUT); //將LED腳規畫為輸出埠
pinMode(TswOFF, INPUT); //將TswOFF腳規畫為輸入埠
pinMode(TswON, INPUT); //將TswON腳規畫為輸入埠
digitalWrite(LED, 0); //關閉LED
Serial.begin(9600);
for (int i = 0; i < 8; i++) {
pinMode(segpin[i], OUTPUT);
digitalWrite(segpin[i], 0);
}
delay(2000);
}
void loop() {
int pb = digitalRead(TswOFF); //讀取pbOFF鈕
if (pb == 0) { //若按下TswOFF鈕
delay(20);//等待20ms
while (!pb) pb = digitalRead(TswOFF); //等待TswOFF鈕放開
digitalWrite(LED, 0); //關閉LED
Serial.println("LED off ");
swt = 0;
sevenSegWrite(swt % 10);
Serial.print("swt = ");
Serial.println(swt);
}
else {
int pb = digitalRead(TswON); //讀取TswON鈕
if (pb == 0) { //若按下TswON鈕
delay(20);//等待20ms
while (!pb) pb = digitalRead(TswON); //等待TswON鈕放開
digitalWrite(LED, 1); //點亮LED
Serial.println("LED on ");
swt++;
sevenSegWrite(swt % 10);
Serial.print("swt = ");
Serial.println(swt);
}
}
//delay(100); //暫停0.1秒
}
使用一個SW控制LED亮滅 >> 使用狀態設定
// ===== 按鍵實驗6 使用一個SW 每按下SW時 "亮燈" ,"關閉" ,再按""重複循環===
//使用狀態設定模式
// button_21
#define Tsw 39
#define LED 2 //內建LED 高態亮 低態滅
boolean val = 0; //設定LED的狀態 布林值
void setup() {
pinMode(LED, OUTPUT); //將LED腳規畫為輸出埠
pinMode(Tsw, INPUT); //將TswOFF腳規畫為輸入埠
digitalWrite(LED, 0); //關閉LED
Serial.begin(9600);
}
void loop() {
int pb = digitalRead(Tsw); //讀取pb鈕
if (pb == 0) { //若按下pb鈕
delay(20);
while (!pb) pb = digitalRead(Tsw); //等待pb被放開
val = !val; //變更狀態 亮 >> 滅 , 滅 >>亮
digitalWrite(LED, val); //關閉LED
Serial.print("LED = ");
Serial.println(val);
}
//delay(100); //暫停0.1秒
}