在arduino上运行后台进程

running a background process on arduino

本文关键字:后台进程 运行 arduino      更新时间:2023-10-16

我正试图让我的arduino mega在后台运行一个函数,同时它也在运行一堆其他函数。

我试图在后台运行的函数是一个从风速计确定风速的函数。它处理数据的方式类似于里程表,因为它读取风速计在一段时间内的转数,然后根据这段时间内的转数来确定风速。我让它运行的时间越长,我收到的数据就越准确,因为有更多的数据需要平均。

我遇到的问题是有一堆其他数据,我也在阅读arduino,我想在一秒钟内阅读一次。这一秒的时间间隔太短,我无法获得准确的风速读数,因为风速计没有完成足够的转数,无法获得高精度的风速数据。

是否有一种方法可以让风传感器函数在后台运行,并每隔5秒左右更新一次全局变量,而我的程序的其余部分同时运行并每秒更新其他数据。

这是我从风传感器读取数据的代码。风传感器每转一圈,就有一部分信号读取为0,否则传感器读取为大于0的整数。

 void windmeterturns(){
     startime = millis();
     endtime = startime + 5000;
     windturncounter = 0;
     turned = false;
     int terminate = startime;
     while(terminate <= endtime){
           terminate = millis();
           windreading = analogRead(windvelocityPin);
           if(windreading == 0){
               if(turned == true){
                   windturncounter = windturncounter + 1;
                   turned = false;
               }
           }
           else if(windreading >= 1){
               turned = true;
           }
           delay(5);
     }
 }

的其余处理发生在另一个函数中,但这是我目前正在努力解决的问题。在这里张贴整个代码是不合理的,因为它接近1000行。

其他函数在循环中运行1秒延迟,但正如我通过试验和错误发现的延迟以及其他函数的处理使其延迟实际上长于一秒,并且它根据我从其他传感器读取的数据类型而变化,因此用于计时的5循环计数器我认为不会在这里工作

让Interrupts为你做这些工作。

简而言之,我建议使用定时器中断来生成一个周期性中断,以测量后台的模拟读数。随后可以更新静态volatile变量。

在这里看到我的答案,因为它是一个类似的场景,详细说明了如何使用定时器中断。你可以用上面的模拟值和增量来代替callback()。

在不查看其余代码如何设置的情况下,我会尝试将windturncounter作为全局变量,并添加另一个整数,该整数在主程序循环的每秒钟迭代一次。然后:

// in the main loop
if(iteratorVariable >= 5){
  iteratorVariable = 0;
  // take your windreading and implement logic here
} else {
  iteratorVariable++;
}

我不确定你的风速表如何存储数据或你可能面临的其他挑战,所以这可能不是一个100%的解决方案,但它可以让你每隔五秒从原始帖子运行逻辑。