如何解决如何在 Arduino 中使用霍尔传感器计算旋转次数?
我想在按下按钮时使用霍尔传感器计算转数。所以为了计数,我写了这段代码:
const int hallPin = D3;
boolean lastRevolutionPin = LOW;
boolean currentRevolutionPin = LOW;
unsigned long Count = 0;
void setup() {
pinMode (hallPin,INPUT);
Serial.begin(9600);
}
void loop() {
currentRevolutionPin = check(lastRevolutionPin,hallPin);
if (lastRevolutionPin == HIGH && currentRevolutionPin == LOW) {
Count++;
Serial.println(Count)
}
lastRevolutionPin = currentRevolutionPin;
}
boolean check(boolean last,int pin) {
boolean current = digitalRead(pin);
if (last != current) {
delay(5);
current = digitalRead(pin);
}
return current;
}
现在这段代码正在工作,但是当我尝试将它用作一个函数时,该函数将开始计数并在数圈后返回反馈,该函数进入无限循环并且我获得了 WTD 软复位。
所以请告诉我如何创建一个计算转数的函数,并在特定的旋转后返回一个值,然后我可以在固定的旋转数后执行另一个操作。
这是我尝试使用函数进行计数的代码,但它进入无限循环并导致看门狗重置。
const int hallPin = D3;
boolean lastRevolutionPin = LOW;
boolean currentRevolutionPin = LOW;
unsigned long Count = 0;
void setup() {
pinMode (hallPin,INPUT);
Serial.begin(9600);
}
void loop() {
Serial.println(pleasecountaccurate());
Count = 0;
}
int pleasecountaccurate() {
while (Count < 20) { // I want to return only when it completed 20 rotations
currentRevolutionPin = check(lastRevolutionPin,hallPin);
if (lastRevolutionPin == HIGH && currentRevolutionPin == LOW) {
Count++;
}
lastRevolutionPin = currentRevolutionPin;
}
return Count;
}
boolean check(boolean last,int pin) {
boolean current = digitalRead(pin);
if (last != current) {
delay(5);
current = digitalRead(pin);
}
return current;
}
解决方法
在为小型嵌入式设备编码时,您应该避免使用任何阻塞代码。这样做会产生各种各样的问题,包括响应速度慢、无法执行 LED 闪烁等简单操作,以及看门狗出现问题。
每次退出loop()时,看门狗都会被重置,所以如果你打开了看门狗,你必须始终避免阻塞。
如果您不阻挡,则不应错过来自霍尔传感器的任何脉冲。
你试过吗?
constexpr int hallPin = D3; // using constexpr here saves 2 bytes of RAM.
unsigned char turnsCount = 0;
bool lastHallState = false;
// note that variables are passed by reference,making this function
// available for any number of hall sensors.
bool CheckTurnsCount(int pin,bool& lastState,unsigned char& count,unsigned char maxCount)
{
bool curState = digitalRead(pin);
count += (lastState && !curState); // tests and comparisons return either 0 or 1
lastState = curState;
if (count < maxCount)
return false;
count = 0;
return true;
}
void setup()
{
pinMode (hallPin,INPUT);
Serial.begin(9600);
lastHallState = digitalRead(hallPin);
}
void loop()
{
if (CheckTurnsCount(hallPin,lastHallState,turnsCount,20))
Serial.println("tick");
// here you should still have plenty of cpu time for other controls ;)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。