2014-10-27 80 views
0

我有一个Arduino由于我在代码的一个部分做了很多非常干净的东西,我正在处理一个flowsensor并从中读取数据。因为它是一个霍尔传感器设备,所以流量传感器连接到中断。我遇到的问题是,我的数学基于一秒钟的收集数据,当我打开中断和睡眠一秒钟,以gp/m为单位计算流量时,效果很好。然而,对于我的目的,我不能暂停和收集数据,所以我计算了超过一千毫秒的时间变化。然后我从上一次循环开始计算时间,将其分为1000毫秒或1秒,然后我将变量中存储的1秒的百分比存储起来,将计数乘以百分比,并计算每次计数的次数第二。然而,无论我在下一个循环之前将数字清零,这种结果都会增加。下面我已经包含了我为flowsensor设置表达式和循环代码的方式,我会发布整个代码,但是我不想浪费空间在stackoverflow上,并且我知道那部分代码已经可以用sleep方法。Arduino由于C计时器编码(中断计数)

long currentMillis = 0; 
long lastMillis = 0; 
int checkMillis = 0; 
volatile int NbTopsFan; //measuring the rising edges of the signal 
int newNbTopsFan; 
float realNbTopsFan; 
float realMillis; 
float Calc; 
float Calcd; 
int Calcf; 
int hallsensor = 7; 

void loop() 
{ 
    if (lastMillis = 0) { 
    lastMillis = millis(); 
    } 
    currentMillis = millis(); 
    checkMillis = (currentMillis - lastMillis); 
    if (checkMillis >= 1000) { 
    realMillis = (checkMillis/1000); 
    realNbTopsFan = (NbTopsFan * realMillis); 
    newNbTopsFan = realNbTopsFan; 
    Calc = (newNbTopsFan * 60/7.5); //(Pulse frequency x 60)/7.5Q, = flow rate 
    Calc = (Calc/60); 
    Calc = (Calc/3.78541); 
    Calc = (Calc * 1.47); 
    Calcd = (Calc * 100); 
    Calcf = Calcd; 
    NbTopsFan = 0; 
    lastMillis = 0; 
    checkMillis = 0; 
    realMillis = 0; 
    realNbTopsFan = 0; 
    newNbTopsFan = 0; 
    } 
} 
+0

这一行:realMillis =(checkMillis/1000);将无法给出正确答案,因为它正在执行整数除法。更好的方法是秒= checkMillis/1000; realMillis =(checkmillis - 秒);或类似的东西,具体取决于你想要完成的事情 – user3629249 2014-10-28 01:17:57

回答

0

你的第一行应为:

if (lastMillis == 0) { 
    lastMillis = millis(); 
} 

您需要的双重=评估变量