Smoothing

Bu çizim, çalışan bir ortalamayı hesaplayıp bilgisayara yazdırarak analog girişten tekrar tekrar okunur. Bu örnek, gergin veya düzensiz sensörlerden değerleri düzeltmek için yararlıdır ve ayrıca veri depolamak için dizilerin kullanımını gösterir.

Donanım

  • Arduino veya Genuino Kurulu
  • 10k ohm potansiyometre

Devre

büyütmek için resme tıklayın

Potansiyometrenin bir pimini 5V'ye, orta pimi analog pim 0'a ve son pimi şasiye bağlayın.

Şematik

büyütmek için resme tıklayın

Kod

Aşağıdaki kod, analog sensörünüzden 10 okumayı diziler halinde sırayla depolar. Her yeni değerde, tüm sayıların toplamı üretilir ve bölünür, bu da daha sonra dış verileri düzeltmek için kullanılan ortalama bir değer üretir. Bu ortalama, diziye her yeni değer eklendiğinde (örneğin, 10 yeni değer beklemek yerine) gerçekleştiği için, bu çalışan ortalamanın hesaplanmasında gecikme süresi yoktur.

Kullanılan dizinin boyutunu değiştirmek, numReadings değerini daha büyük bir değere değiştirerek toplanan verileri daha da düzleştirecektir.


/*
  Smoothing

  Reads repeatedly from an analog input, calculating a running average and
  printing it to the computer. Keeps ten readings in an array and continually
  averages them.

  The circuit:
  - analog sensor (potentiometer will do) attached to analog input 0

  created 22 Apr 2007
  by David A. Mellis  
  modified 9 Apr 2012
  by Tom Igoe

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/Smoothing
*/

// Define the number of samples to keep track of. The higher the number, the
// more the readings will be smoothed, but the slower the output will respond to
// the input. Using a constant rather than a normal variable lets us use this
// value to determine the size of the readings array.
const int numReadings = 10;

int readings[numReadings];      // the readings from the analog input
int readIndex = 0;              // the index of the current reading
int total = 0;                  // the running total
int average = 0;                // the average

int inputPin = A0;

void setup() {
  // initialize serial communication with computer:
  Serial.begin(9600);
  // initialize all the readings to 0:
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
}

void loop() {
  // subtract the last reading:
  total = total - readings[readIndex];
  // read from the sensor:
  readings[readIndex] = analogRead(inputPin);
  // add the reading to the total:
  total = total + readings[readIndex];
  // advance to the next position in the array:
  readIndex = readIndex + 1;

  // if we're at the end of the array...
  if (readIndex >= numReadings) {
    // ...wrap around to the beginning:
    readIndex = 0;
  }

  // calculate the average:
  average = total / numReadings;
  // send it to the computer as ASCII digits
  Serial.println(average);
  delay(1);        // delay in between reads for stability
}

See Also

  • array
  • if
  • for
  • serial

  • AnalogInOutSerial- Bir analog giriş pinini okuyun, sonucu eşleyin ve ardından bir LED'i kısmak veya aydınlatmak için bu verileri kullanın.
  • AnalogInput- Bir LED'in yanıp sönmesini kontrol etmek için bir potansiyometre kullanın.
  • AnalogWriteMega- Arduino veya Genuino Mega kartı kullanarak 12 LED'i birer birer söner ve söndürür.
  • Calibration- Beklenen analog sensör değerleri için bir maksimum ve minimum tanımlayın.
  • Fading- Bir LED'in solması için bir analog çıkış (PWM pin) kullanın.