搜索代码

第7课/31-2:使用簧片开关检测磁场 | SunFounder套件

第7课/31-2:使用簧片开关检测磁场 | SunFounder套件

检测磁场是在Arduino上开始使用数字输入最简单、最有成就感的方式之一。在这个项目中,你将使用干簧管构建一个磁场检测器——一个微小的玻璃封装开关,每当磁铁靠近它时,其触点就会闭合。由于干簧管的行为与按钮完全相同(它要么断开,要么闭合),它是介绍digitalRead()函数的完美入门示例,同时它还会教你为什么下拉电阻很重要,以及Arduino内置的输入上拉如何完全取代它。

reed_switch

一旦你让这个项目运行起来,同样的电路就会成为许多实际应用的核心。以下是一些你可以尝试的实用想法:

  • 门窗报警器——将干簧管安装在门框上,在门上安装一块小磁铁;磁铁一移开,Arduino就会报告“打开”。
  • 非接触式转速计——将一块磁铁粘在旋转的轮子上,并计数脉冲以测量RPM。
  • 水表或燃气表读数器——许多公用事业仪表都有磁脉冲输出,干簧管可以拾取并记录。
  • 笔记本电脑盖/外壳传感器——检测盖子何时关闭,以触发睡眠或状态LED。
  • 自行车速度计——辐条上放一块磁铁,前叉上放一个干簧管,每转一圈就产生一个脉冲。
  • 防拆检测——将一对磁铁和干簧管藏在外壳内,这样你就能知道它是否被打开过。

干簧管的工作原理

lesson-7-reading-reed-with-magnet-multimeter

干簧管是一个小玻璃胶囊,里面有两片薄薄的铁磁簧片(视频12:38处)。在磁场存在时,簧片相互吸引并接触,从而闭合电路。移开磁铁后,簧片弹开,电路再次断开。这就是全部原理——它是一种开关,没有可按动的按钮,不会因手指按压而磨损,也不需要与被感测物体发生物理接触。

你可以用万用表的通断模式验证这种行为(视频13:59处):附近没有磁铁时,万用表显示开路;一旦磁铁靠近,蜂鸣器响起,万用表显示闭路。由于这种开关在电气上与按钮完全相同,Arduino代码和接线与任何其他数字输入都一样。

数字输入与上拉/下拉电阻详解

Arduino将数字引脚读取为HIGH或LOW。在5 V开发板上,大约高于2.2 V的任何电压都会被视为HIGH,而低于约1.5 V的任何电压都会被视为LOW(视频01:49处)。问题在于,当开关直接连接在引脚和5 V之间时,开关断开会让引脚处于悬空状态——它没有连接到任何东西,因此会拾取噪声并报告随机值。

why_use_resistor_switch-1
why_use_resistor_switch-2
why_use_resistor_switch-3
why_use_resistor_switch-4
why_use_resistor_switch-5
why_use_resistor_switch-6
why_use_resistor_switch-7
why_use_resistor_switch-8
使用INPUT_PULLUP的按钮

这就是为什么要使用电阻。两种接法同样有效:

  • 下拉:从引脚到地接一个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线

接线指南

lesson-7-reading-reed-schematic
lesson-7-reading-reed-wiring

干簧管开关的接线方式与按钮完全相同。干簧管开关的一只引脚接到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处)。响应是即时的,即使磁铁距离开关一两厘米也能工作。

lesson-7-reading-reed-wiring-on-breadboard

如果你改为搭建上拉版本,逻辑是相反的:监视器在静止时显示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而无需外部电阻

图像

reed_switch
reed_switch
push button with INPUT_PULLUP
push button with INPUT_PULLUP
why_use_resistor_switch-1
why_use_resistor_switch-1
why_use_resistor_switch-2
why_use_resistor_switch-2
why_use_resistor_switch-3
why_use_resistor_switch-3
why_use_resistor_switch-4
why_use_resistor_switch-4
why_use_resistor_switch-5
why_use_resistor_switch-5
why_use_resistor_switch-6
why_use_resistor_switch-6
why_use_resistor_switch-7
why_use_resistor_switch-7
why_use_resistor_switch-8
why_use_resistor_switch-8
lesson-7-reading-reed-with-magnet-multimeter
lesson-7-reading-reed-with-magnet-multimeter
lesson-7-reading-push-button-schematic
lesson-7-reading-push-button-schematic
lesson-7-reading-push-button-wiring
lesson-7-reading-push-button-wiring
lesson-7-reading-reed-schematic
lesson-7-reading-reed-schematic
lesson-7-reading-reed-wiring
lesson-7-reading-reed-wiring
lesson-7-reading-reed-wiring-on-breadboard
lesson-7-reading-reed-wiring-on-breadboard
932-Lesson 7/31-2: Digital read, working with reed switch
语言: C++
/*
 * 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);       
}

文件📁

Arduino 库(zip 格式)

用户手册