我想用霍尔传感器来计算按下按钮时的旋转次数。所以为了计数,我写了下面的代码:
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;
}发布于 2021-01-14 10:25:30
在为小型嵌入式设备编码时,您应该避免使用任何阻塞代码。这样做会造成各种各样的问题,包括缺乏响应能力,无法做简单的事情,如闪烁的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 ;)
}https://stackoverflow.com/questions/65704973
复制相似问题