网站首页 > 技术教程 正文
网拍上容易买到类似左下图的4路触控模块,对Arduino控制板而言,它相当于右下角的4组开关,所以程序不需要引用特别的程序库:
此触控模块的主要构成电路如下,负责处理电容触控信号的核心是TTP224芯片。TTP224的技术文件指出,每个触控感应端可连接0~50pF的电容,借以调整触控感应的灵敏度,此模块采用的电容值为30pF。每当触控端感应到人体碰触时,对应的OUT1~OUT4将输出高电位,模块上的LED也将被点亮。
相较于上一篇文章的简易DIY触控电路,使用触控IC的好处是稳定、不易受外界环境影响(如:汗水、油污)和噪声干扰,而且程序也简单许多。
使用4路触控开关模块制作LED调光器
本单元实验将使用4路触控模块的其中3个开关,当作LED灯的开关、调亮和调暗控制界面。
实验材料
- Arduino Uno控制板×1
- 4路触控开关模块×1
- 电阻:680Ω×1
- LED×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;
}
猜你喜欢
- 2024-11-07 超值一篇分享,Docker:从入门到实战过程全记录
- 2024-11-07 首创引入蛋白动态信息的AI模型,高效预测药物-蛋白亲和力
- 2024-11-07 这个高中女生建立了一个道德黑客站,让人们进入数据安全
- 2024-11-07 「洞幺邦」智能停车场车位管理系统
- 2024-11-07 基于ARM的商用车信息系统的设计 基于arm的车辆中控娱乐系统报告
- 2024-11-07 CrowPi2树莓派4教育笔记本电脑的评测
- 2024-11-07 浅谈嵌入式开发朋友的身边事 嵌入式开发实例
- 2024-11-07 校园一卡通系统中RFID读写器的设计
- 2024-11-07 学生设计——小区门禁系统设计 小区门禁系统安装图教程
- 2024-11-07 毕业设计 基于树莓派指纹识别与RFID考勤系统 - 嵌入式 物联网
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)