Arduino Ardruino的多速率多传感器读数

Arduino Ardruino的多速率多传感器读数,arduino,Arduino,我刚买了一台新的Arduino,用很少的传感器获取数据。我从这里得到了这个代码: typedef void (*command)(); template <unsigned long wait_ms, command c> void repeat() { static unsigned long start = millis(); if (millis()-start >= wait_ms) { start += wait_ms;

我刚买了一台新的Arduino,用很少的传感器获取数据。我从这里得到了这个代码:

typedef void (*command)();

template <unsigned long wait_ms, command c>

void repeat() {
    static unsigned long start = millis();
    if (millis()-start >= wait_ms) {
        start += wait_ms;
        c();
    }
}

void task1()                   
{

}

void task2() 
{

}

void task3() 
{

}

void setup(){

  Serial.begin(4800);

}

void loop(){
  int aba=1000;
  repeat<1000, task2>();
  repeat<5000, task1>();  
  repeat<3000, task3>();    
}
typedef void(*命令)();
模板
void repeat(){
静态无符号长启动=毫秒();
如果(毫秒()-开始>=等待){
开始+=等待_ms;
c();
}
}
void task1()
{
}
void task2()
{
}
void task3()
{
}
无效设置(){
Serial.begin(4800);
}
void循环(){
int-aba=1000;
重复();
重复();
重复();
}
上面的代码运行完美,没有任何问题。然而当我做出这样的改变时

void loop(){
      int aba=1000;
      repeat<aba, task2>();
      repeat<5000, task1>();  
      repeat<3000, task3>();    
    }
void循环(){
int-aba=1000;
重复();
重复();
重复();
}

执行它有问题

局部变量
aba
不是编译时常量

如果您所追求的是
wait\u ms
(在运行时更改)的一个变量值,那么您就不走运了。您需要实现一个可以使用运行时值的非模板版本

在模板中使用编译时常量通常效率更高,但是使用不同的模板参数值在每个实例中复制代码

对于变量等待,您可以执行以下操作:

typedef void (*command)();

void repeat(unsigned long wait_ms, command c, unsigned long &start);
void repeat(unsigned long wait_ms, command c, unsigned long &start) {
    if (millis()-start >= wait_ms) {
        start += wait_ms;
        c();
    }
}

static unsigned long task1Start, task2Start, task3Start;  

void task1() {Serial.println("task 1");}                 
void task2() {Serial.println("task 2");}   
void task3() {Serial.println("task 3");}   

void setup(){
  Serial.begin(9600);
  task1Start = task2Start = task3Start = millis();
}

void loop(){
  int aba=1000;
  repeat( aba, task1, task1Start );
  repeat( random(5000, 10000), task2, task2Start );  
  repeat( random(50, 500), task3, task3Start );    
}
编辑:由于该函数不再是模板,因此该函数只在每个调用之间生成一个共享的静态
start
。该模板基本上复制了每组输入的代码,为每个任务提供了唯一的
start

这可以通过添加第三个参数来解决,该参数传递对每个特定任务的
start
变量的引用


如果要使用多个任务,封装每个任务的
Task
对象可能有用/更容易处理。

局部变量
aba
不是编译时常量

如果您所追求的是
wait\u ms
(在运行时更改)的一个变量值,那么您就不走运了。您需要实现一个可以使用运行时值的非模板版本

在模板中使用编译时常量通常效率更高,但是使用不同的模板参数值在每个实例中复制代码

对于变量等待,您可以执行以下操作:

typedef void (*command)();

void repeat(unsigned long wait_ms, command c, unsigned long &start);
void repeat(unsigned long wait_ms, command c, unsigned long &start) {
    if (millis()-start >= wait_ms) {
        start += wait_ms;
        c();
    }
}

static unsigned long task1Start, task2Start, task3Start;  

void task1() {Serial.println("task 1");}                 
void task2() {Serial.println("task 2");}   
void task3() {Serial.println("task 3");}   

void setup(){
  Serial.begin(9600);
  task1Start = task2Start = task3Start = millis();
}

void loop(){
  int aba=1000;
  repeat( aba, task1, task1Start );
  repeat( random(5000, 10000), task2, task2Start );  
  repeat( random(50, 500), task3, task3Start );    
}
编辑:由于该函数不再是模板,因此该函数只在每个调用之间生成一个共享的静态
start
。该模板基本上复制了每组输入的代码,为每个任务提供了唯一的
start

这可以通过添加第三个参数来解决,该参数传递对每个特定任务的
start
变量的引用


如果要使用多个任务,则封装每个任务的
Task
对象可能很有用/更容易处理。

感谢@Chris解决int部分:)但是在我尝试后,只有task1可以运行,task2和task3在执行期间没有被忽略。这是因为
start
变量现在是共享的,解决方案和上面的编辑:)太好了!!谢谢你,伙计!非常感谢:)在此之后,我将尝试添加一个输入侦听器,以便为我的项目从PC获取数据。感谢@Chris解决int部分:)但是,在我尝试之后,只有task 1可以运行,task 2和task 3在执行过程中没有被忽略。这是因为
start
变量现在已共享,上面的解决方案和编辑:)太棒了!!谢谢你,伙计!非常感谢:)在此之后,我将尝试添加一个输入侦听器,以便从PC机获取项目的数据。