2014-02-07 386 views
1

我试图控制和计算距超声波传感器距离的平均值的LED。我有数据被平均,但从通电起就是连续的。我想在每十次读数后重新计算平均值。任何人都可以告诉我需要改变什么来重新计算每10个值的平均值与计算连续的平均值?Arduino HC-SR04传感器,平均数据

const int TrigPin = 8; 
const int EchoPin = 9; 
const int LedPin = 13; 
const int numReadings = 5; 
long Duration = 0; 

int readings[numReadings]; 
int index = 0; 
int total = 0; 
int average = 0; 

void setup() { 
    Serial.begin(9600); 
    pinMode(LedPin, OUTPUT); 
    pinMode(TrigPin, OUTPUT); 
    pinMode(EchoPin, INPUT); 
    for (int thisReading = 0; thisReading < numReadings; thisReading++) 
    readings[thisReading] = 0; 
} 

void loop() { 
    digitalWrite(TrigPin, LOW); 
    delayMicroseconds(2); 
    digitalWrite(TrigPin, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(TrigPin, LOW); 

    Duration = pulseIn(EchoPin, HIGH); 
    long Distance_mm = Distance(Duration); 

    //Serial.print("Distance = "); 
    //Serial.print(Distance_mm); 
    //Serial.println(" mm"); 

    total= total - readings[index]; 
    readings[index] = analogRead(EchoPin); 
    total = total + readings[index]; 
    index = index + 1; 

    if (index >= numReadings) 
    index = 0; 

    average = total/numReadings; 
    Serial.print("Dist_avg = "); 
    Serial.print(average); 
    Serial.println("mm"); 
    delay(100); 

    if (average > 400) 
    { 
    digitalWrite(LedPin, HIGH); // turn the LED on (HIGH is the voltage level) 
    } 
    else 
    { 
    digitalWrite(LedPin, LOW); // turn the LED off by making the voltage LOW 
    } 

} 

long Distance(long time) 
{ 
    long DistanceCalc; 
    DistanceCalc = ((time /2.9)/2); 
    return DistanceCalc; 
} 

回答

3

你只需要改变你的代码,以便它计算平均值时指数== 10.如果你cahnge numReadings到10,你可以尝试这样的代码:

void loop(){ 
    ... 

//total= total - readings[index]; 
//you don't need the array here anymore 
//readings[index] = analogRead(EchoPin); 
//total = total + readings[index]; 
total = total + analogRead(EchoPin); 
index = index + 1; 

if (index >= numReadings) 
{ 
    index = 0; 

    average = total/numReadings; 

    Serial.print("Dist_avg = "); 
    Serial.print(average); 
    Serial.println("mm"); 
    delay(100); 

    if (average > 400) 
    digitalWrite(LedPin, HIGH); // turn the LED on (HIGH is the voltage level) 
    else 
    digitalWrite(LedPin, LOW); // turn the LED off by making the voltage LOW 

    total = 0; 
} 
+0

该OP仍然困惑,似乎... –

0

你想平均每次读数后的最后十次读数,或每10次读数计算平均值。 在第一种情况下,您需要一个“旋转阵列”,在第二种情况下,您不需要数组,只需将总数设置为零,计算读数,将读数添加到总数,然后每次计数到达10,输出平均值,并将总数重新设置为零。