使用 arduino nano 上的簧片开关计数磁铁外观
Counting magnet apperance using reed switch on arduino nano
我只是想使用簧片开关计算每次磁铁出现在某个区域中的次数。我遇到了一个小问题。启动程序时,它不能正确计数。有时它会遵循顺序,但通常会跳跃 2 或 3 个单位。有人能帮忙吗?
这是代码:
#include <SPI.h>
int count=0;
volatile bool check = true;
volatile bool revcheck = true;
void setup() {
Serial.begin(9600);
SPI.begin();
pinMode(2, INPUT);
attachInterrupt(digitalPinToInterrupt(2), magnet_detect, LOW);
}
void loop() {
if(digitalRead(2) == HIGH) {
check = true; }
if(!revcheck) {
Serial.println(count);
revcheck = true; }
}
void magnet_detect()
{
if(check) {
count++;
check = false;
revcheck =false;
}
}
硬件设置和输出:
[1]: https://i.stack.imgur.com/kJSr7.png
[2]: https://i.stack.imgur.com/xBC1q.jpg
你附加一个中断并检查数字状态,这是错误的,它应该只是增加计数的方法之一。
您需要某种形式的去抖动。有实现此目的的标准方法,但一个简单的“穷人”版本如下所示:
beginning of function()
oldState = 0;
do stuff
if(the sensor reads 1 AND oldState is 0):
counter ++
oldState = 1
if (the sensor reads 0 AND oldState is 1):
oldState = 0
你知道,循环比通过开关的物理磁铁更快(因为微处理器以毫秒计算,通常是纳秒)。所以你必须检查你是否真的已经扫描过磁铁。
我只是想使用簧片开关计算每次磁铁出现在某个区域中的次数。我遇到了一个小问题。启动程序时,它不能正确计数。有时它会遵循顺序,但通常会跳跃 2 或 3 个单位。有人能帮忙吗? 这是代码:
#include <SPI.h>
int count=0;
volatile bool check = true;
volatile bool revcheck = true;
void setup() {
Serial.begin(9600);
SPI.begin();
pinMode(2, INPUT);
attachInterrupt(digitalPinToInterrupt(2), magnet_detect, LOW);
}
void loop() {
if(digitalRead(2) == HIGH) {
check = true; }
if(!revcheck) {
Serial.println(count);
revcheck = true; }
}
void magnet_detect()
{
if(check) {
count++;
check = false;
revcheck =false;
}
}
硬件设置和输出: [1]: https://i.stack.imgur.com/kJSr7.png [2]: https://i.stack.imgur.com/xBC1q.jpg
你附加一个中断并检查数字状态,这是错误的,它应该只是增加计数的方法之一。
您需要某种形式的去抖动。有实现此目的的标准方法,但一个简单的“穷人”版本如下所示:
beginning of function()
oldState = 0;
do stuff
if(the sensor reads 1 AND oldState is 0):
counter ++
oldState = 1
if (the sensor reads 0 AND oldState is 1):
oldState = 0
你知道,循环比通过开关的物理磁铁更快(因为微处理器以毫秒计算,通常是纳秒)。所以你必须检查你是否真的已经扫描过磁铁。