使用 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

你知道,循环比通过开关的物理磁铁更快(因为微处理器以毫秒计算,通常是纳秒)。所以你必须检查你是否真的已经扫描过磁铁。