第7课/31-2:使用簧片开关检测磁场 | SunFounder套件
检测磁场是在Arduino上开始使用数字输入最简单、最有成就感的方式之一。在这个项目中,你将使用干簧管构建一个磁场检测器——一个微小的玻璃封装开关,每当磁铁靠近它时,其触点就会闭合。由于干簧管的行为与按钮完全相同(它要么断开,要么闭合),它是介绍digitalRead()函数的完美入门示例,同时它还会教你为什么下拉电阻很重要,以及Arduino内置的输入上拉如何完全取代它。
一旦你让这个项目运行起来,同样的电路就会成为许多实际应用的核心。以下是一些你可以尝试的实用想法:
- 门窗报警器——将干簧管安装在门框上,在门上安装一块小磁铁;磁铁一移开,Arduino就会报告“打开”。
- 非接触式转速计——将一块磁铁粘在旋转的轮子上,并计数脉冲以测量RPM。
- 水表或燃气表读数器——许多公用事业仪表都有磁脉冲输出,干簧管可以拾取并记录。
- 笔记本电脑盖/外壳传感器——检测盖子何时关闭,以触发睡眠或状态LED。
- 自行车速度计——辐条上放一块磁铁,前叉上放一个干簧管,每转一圈就产生一个脉冲。
- 防拆检测——将一对磁铁和干簧管藏在外壳内,这样你就能知道它是否被打开过。
干簧管的工作原理
干簧管是一个小玻璃胶囊,里面有两片薄薄的铁磁簧片(视频12:38处)。在磁场存在时,簧片相互吸引并接触,从而闭合电路。移开磁铁后,簧片弹开,电路再次断开。这就是全部原理——它是一种开关,没有可按动的按钮,不会因手指按压而磨损,也不需要与被感测物体发生物理接触。
你可以用万用表的通断模式验证这种行为(视频13:59处):附近没有磁铁时,万用表显示开路;一旦磁铁靠近,蜂鸣器响起,万用表显示闭路。由于这种开关在电气上与按钮完全相同,Arduino代码和接线与任何其他数字输入都一样。
数字输入与上拉/下拉电阻详解
Arduino将数字引脚读取为HIGH或LOW。在5 V开发板上,大约高于2.2 V的任何电压都会被视为HIGH,而低于约1.5 V的任何电压都会被视为LOW(视频01:49处)。问题在于,当开关直接连接在引脚和5 V之间时,开关断开会让引脚处于悬空状态——它没有连接到任何东西,因此会拾取噪声并报告随机值。
这就是为什么要使用电阻。两种接法同样有效:
- 下拉:从引脚到地接一个10 kΩ电阻。当开关断开时,引脚读数为LOW;当开关将引脚连接到5 V时,引脚读数为HIGH。
- 上拉:从引脚到5 V接一个10 kΩ电阻。当开关断开时,引脚读数为HIGH;当开关将引脚连接到地时,引脚读数为LOW。
Arduino还有一个内部上拉电阻,可以通过软件使用INPUT_PULLUP启用(视频19:52处)。这完全消除了对外部电阻的需求——引脚空闲时为HIGH,将开关闭合到地会将其拉低为LOW。代价是逻辑反转了:按下(或有磁铁存在)现在读数为0而不是1。
硬件与元件
- Arduino Uno(或任何兼容板)
- 干簧管开关模块或裸干簧管开关
- 10 kΩ电阻(仅下拉版本需要)
- 面包板和跳线
- 用于测试的小磁铁
- 用于编程和供电的USB线
接线指南
干簧管开关的接线方式与按钮完全相同。干簧管开关的一只引脚接到5 V,另一只引脚接到Arduino引脚2以及10 kΩ电阻的一端。电阻的另一端接地(视频14:40处)。这是一个下拉配置,因此没有磁铁时引脚读数为LOW,磁铁使开关闭合时读数为HIGH。
在面包板上,将干簧管开关放置成两只引脚位于不同的行,将电阻从与一只引脚相同的行连接到地线轨,用一根红色导线从另一只引脚连接到5 V轨,再用一根绿色导线从干簧管开关和电阻的结点连接到引脚2(视频15:53处)。黑色接地,红色接5 V,绿色接引脚2——与SunFounder套件中始终使用的颜色约定相同。
如果你想跳过电阻,将干簧管开关的一只引脚接到引脚2,另一只引脚直接接地,然后在代码中启用INPUT_PULLUP,如下所述。
代码说明
这个草图刻意做得很小。你想要修改的所有内容都位于文件顶部的两个地方。
int reedPin = 2;//the pin reed switch is connected to
void setup() {
Serial.begin(9600);
pinMode(reedPin, INPUT);
}
reedPin——如果你将干簧管开关接到了其他数字引脚,请更改这个数字。Uno上的任何数字引脚都可以;这里使用引脚2只是因为它在面包板上很方便。
Serial.begin(9600)——设置串口监视器速度。如果你更改了这个值,还必须更改串口监视器窗口中的波特率下拉选项,否则你会看到乱码字符(视频11:25处)。
pinMode(reedPin, INPUT)——将引脚配置为高阻抗输入,以便它可以检测由干簧管开关和电阻设定的电压。如果你改用内部上拉,请将此行改为pinMode(reedPin, INPUT_PULLUP);,并记住读数会反转。
循环只是读取引脚并打印结果:
void loop() {
Serial.println(digitalRead(reedPin));
delay(10);
}
digitalRead(reedPin)在引脚为HIGH时返回1,为LOW时返回0。由于该值直接传入Serial.println(),因此不需要中间变量——读数会直接打印。使用下拉接线时,0表示“无磁场”,1表示“检测到磁铁”(视频18:31处)。
delay(10)控制打印读数的频率。十毫秒足够快,你会在磁铁靠近的瞬间看到数值变化。如果你更喜欢较平缓的显示,可以将其提高到200 ms,但请注意这也会减慢检测速度(视频12:01处)。
实时项目演示
上传草图后,打开串口监视器并将波特率设置为9600。附近没有磁铁时,窗口中会满是零。将一块小磁铁靠近玻璃胶囊,输出会立即切换为1;将磁铁拿开,它又会回到零(视频17:04处)。响应是即时的,即使磁铁距离开关一两厘米也能工作。
如果你改为搭建上拉版本,逻辑是相反的:监视器在静止时显示1,有磁铁时显示0(视频22:13处)。无论哪种方式,你现在都有一个可靠、非接触式的磁场检测器,成本几乎为零,并且可以放入本文顶部列出的任何项目创意中。
同一数字读取课程的按钮版本在第7/31课:数字读取按钮,检测磁场 SunFounder套件 | Robojax中单独讲解。
本视频的相关项目
章节
- [00:00] 简介:两个数字读取示例
- [01:33] 数字读取以及高电平/低电平的含义
- [02:46] 按钮开关的工作原理
- [03:25] 上拉和下拉电阻原理
- [05:18] 在面包板上为按钮接线
- [08:21] 打开并讲解按钮示例程序
- [10:55] 上传并测试按钮示例
- [12:38] 介绍簧片开关并用万用表测试
- [14:40] 将簧片开关连接到2号引脚
- [16:46] 用磁铁测试簧片开关
- [17:19] 讲解簧片开关示例程序
- [19:45] 使用INPUT_PULLUP而无需外部电阻
图像
/*
* Lesson 7/31-2: Digital read, working with reed switch
Download and resource page https://robojax.com/RJT590
watch video tutorial https://www.youtube.com/watch?v=yyJrqFKn-X4
* written/updated by Ahmad Shamshiri www.Robojax.com
* Dec 12, 2022
*
*/
int reedPin = 2;//the pin reed switch is connected to
void setup() {
Serial.begin(9600);
pinMode(reedPin, INPUT);
}
void loop() {
Serial.println(digitalRead(reedPin));
delay(10);
}
Common Course Links
Common Course Files
|||您可能需要的东西
-
亚马逊Buy reed switch from Amazonamzn.to
-
亚马逊
-
亚马逊SunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
亚马逊
-
亚马逊
-
亚马逊
-
易趣Buy reed switch from eBayebay.us
-
全球速卖通Buy reed switch from AliExpresss.click.aliexpress.com
资源与参考
-
文档SunFounder 3合1物联网/智能车/学习套件的文档docs.sunfounder.com
-
外部购买SunFounder的3合1智能汽车学习套件sunfounder.com
文件📁
Arduino 库(zip 格式)
-
SunFounder 的 3 合 1 智能汽车学习套件源代码
3in1-kit-main-v2.zip12.80 MB
用户手册
-
SunFounder 3合1 Arduino智能车组装手册本文档逐步展示SunFounder 3合1 Arduino智能车的组装过程
SunFounder_car_assembly_manual.pdf1.20 MB