在本教程中,我们将使用 Arduino 的中断功能来检测霍尔传感器附近的磁铁并发光 LED。大多数情况下,霍尔传感器将仅与中断一起使用,因为它们的应用需要高读取和执行速度,因此让我们在本教程中也使用中断。
所需材料:
霍尔效应传感器(A3144 或任何其他数字版本)
Arduino (任何版本)
10k 欧姆和 1K 欧姆电阻器
发光二极管
连接线
霍尔效应传感器:
在我们深入研究连接之前,您应该了解一些关于霍尔效应传感器的重要事项。实际上,有两种不同类型的霍尔传感器,一种是数字霍尔传感器,另一种是模拟霍尔传感器。数字霍尔传感器只能检测磁铁是否存在(0 或 1),但模拟霍尔传感器的输出根据磁铁周围的磁场而变化,它可以检测磁铁的强度或距离。在本项目中,将仅针对数字霍尔传感器,因为它们是最常用的传感器。
顾名思义,霍尔效应传感器的工作原理是“霍尔效应”。根据该定律,“当垂直于磁场引入具有沿一个方向流动的电流的导体或半导体时,可以以与电流路径成直角的方式测量电压”。使用这种技术,霍尔传感器将能够检测到其周围是否存在磁铁。理论够了,让我们进入硬件。
Arduino霍尔效应传感器电路连接及说明:
霍尔传感器与 Arduino 接口的完整电路图如下。
如您所见,霍尔效应传感器 arduino 电路图非常简单。但是,我们经常犯错误的地方是弄清楚霍尔传感器的引脚数。将读数面向您,左侧的第一个引脚分别是 Vcc,然后是接地和信号。
我们将如前所述使用中断,因此霍尔传感器的输出引脚连接到 Arduino 的引脚 2。引脚连接到 LED,当检测到磁铁时,该 LED 将打开。我只是在面包板上进行了连接,完成后看起来有点像这样。
Arduino 霍尔效应传感器代码:
完整的Arduino代码只有几行,它可以在这个页面的底部找到,可以直接上传到你的Arduino板。如果您想知道该程序的工作原理,请进一步阅读。
我们有一个输入,即传感器,一个输出是LED。传感器必须作为中断输入连接。因此,在我们的设置函数中,我们初始化这些引脚,并使引脚 2 作为中断工作。这里的引脚 2 称为 Hall_sensor,引脚 3 称为 LED。
void setup() {
pinMode(LED, OUTPUT); //LED is a output pin
pinMode(Hall_sensor, INPUT_PULLUP); //Hall sensor is input pin
attachInterrupt(digitalPinToInterrupt(Hall_sensor), toggle, CHANGE); //Pin two is interrupt pin which will call toggle function
}
当检测到中断时,将如上行所述调用切换函数。有许多中断参数,如切换、变化、上升、下降等,但在本教程中,我们将检测霍尔传感器输出的变化。
现在在切换函数中,我们使用一个名为“state”的变量,如果已经是 1,它只会将其状态更改为 0,如果已经为零,则更改为 1。这样,我们可以使 LED 打开或关闭。
void toggle() {
state = !state;
}
最后,在我们的循环功能中,我们只需要控制LED。每次检测到磁铁时,可变状态都会改变,因此我们使用它来确定 LED 应该保持亮起还是熄灭。
void loop() {
digitalWrite(LED, state);
}
Arduino霍尔效应传感器工作:
准备好硬件和代码后,只需将代码上传到Arduino即可。我使用9V电池为整个设置供电,您可以使用任何更好的电源。现在将磁铁靠近传感器,您的 LED 会发光,如果您将其拿走,它将熄灭。
注意:霍尔传感器对极点敏感,这意味着传感器的一侧只能检测北极或仅检测南极,而不能同时检测两者。因此,如果您将南极靠近北感应表面,您的 LED 将不会发光。
内部实际发生的事情是,当我们把磁铁靠近传感器时,传感器会改变其状态。这种变化是由中断引脚感应到的,中断引脚将调用切换函数,我们将变量“状态”从 0 更改为 1。因此,LED 将亮起。现在,当我们将磁铁从传感器上移开时,传感器的输出将再次发生变化。我们的中断语句再次注意到了这种变化,因此变量“state”将从 1 更改为 0。因此,如果 LED 熄灭。每次将磁铁靠近传感器时,都会重复相同的情况。
const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;
int val=0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), test, CHANGE);
Serial.begin(9600);
}
void loop() {
digitalWrite(ledPin, state);
Serial.println(val/2);
}
void test() {
state = !state;
val++;
}
全部0条评论
快来发表一下你的评论吧 !