Я пытаюсь контролировать и светодиод со средним значением, рассчитанным расстоянием от ультразвукового датчика. Я усредняю данные, но они непрерывны с момента включения. Я хочу пересчитать среднее значение после каждых десяти чтений. Может кто-нибудь сказать мне, что мне нужно изменить, чтобы пересчитать среднее каждые 10 значений по сравнению с вычислением скользящего среднего?
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;
}
Вам просто нужно изменить свой код, чтобы он вычислял среднее значение при index == 10. Если вы измените 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;
}
Вы хотите усреднить последние десять чтений после каждого чтения, или каждые 10 чтений рассчитать среднее.
В первом случае вам нужен «вращающийся массив», во втором случае вам не нужен массив, просто установите общее значение в ноль, посчитайте показания, добавьте показания к итоговому значению, а затем каждый раз, когда счет достигает 10 , выведите среднее значение и снова установите значение на ноль.
Просто добавив эту ссылку в качестве ссылки, которая говорит, что вы не должны усреднять данные сонара.
http://forum.arduino.cc/index.php/topic,20920.0.html