Leolvasások simítása analóg bemenetnél

Egy analóg bemenet többszöri leolvasásának simítása.


Utolsó felülvizsgálat: 2022.02.04 16:50


Ez a vázlat ismételten olvas egy analóg bemenetről, kiszámítja a futó átlagot, és kinyomtatja a számítógépre. Ez a példa hasznos az ugráló vagy szabálytalan érzékelők értékeinek kiegyenlítésére, és bemutatja a tömbök használatát az adatok tárolására.

Hardver szükséglet

  • Arduino kártya

  • 10 kohm-os potenciométer

Az áramkör

Csatlakoztassa a potenciométer egyik csatlakozóját az 5 V-hoz, a középső csatlakozót a 0 analóg kivezetéshez, az utolsó csatlakozót pedig a földhöz.

Vázlat

A kód

Az alábbi kód egymás után 10 leolvasást tárol az analóg kivezetéstől egy tömbben, egymás után. Minden egyes új értéknél az összes szám összege generálódik és felosztásra kerül, így egy átlagos érték jön létre, amelyet azután a külső adatok kiegyenlítésére használunk. Mivel ez az átlagolás minden alkalommal megtörténik, amikor új értéket adnak a tömbhöz (inkább például, hogy 10 új értéket várnának), nincs késleltetési idő ennek a futó átlagnak a kiszámításakor.

A használt tömb méretének megváltoztatása, a numReadings nagyobb értékre történő módosítása még tovább simítja az összegyűjtött adatokat.

/*
  Smoothing

  Ismételten olvas egy analóg bemenetről, kiszámítja a futó átlagot és kinyomtatja
  a számítógépre.Tíz leolvasást tart egy tömbben, és folyamatosan átlagolja azokat.

  Az áramkör:
  - analóg érzékelő (potenciométer megteszi), amely a 0 analóg bemenethez van csatlakoztatva

  created 22 Apr 2007
  by David A. Mellis  <dam@mellis.org>
  modified 9 Apr 2012
  by Tom Igoe

  Ez a kód nyilvános.

  https://docs.arduino.cc/built-in-examples/analog/Smoothing
*/
// Határozza meg a nyomon követendő minták számát. Minél nagyobb a szám, annál
// jobban kisimulnak a leolvasott értékek, de a kimenet annál lassabban reagál
// a bemenetre. Ha normál változó helyett konstanst használunk, akkor ezt az
// értéket használhatjuk a leolvasási tömb méretének meghatározására.
const int numReadings = 10;

int readings[numReadings];      // az analóg bemenetről olvasott értékek
int readIndex = 0;              // az aktuális leolvasás indexe
int total = 0;                  // a futóösszeg
int average = 0;                // az átlag

int inputPin = A0;

void setup() {
  // soros kommunikáció inicializálása a számítógéppel:
  Serial.begin(9600);
  // inicializálja az összes leolvasást 0-ra:
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
}

void loop() {
  // kivonjuk az utolsó olvasást:
  total = total - readings[readIndex];
  // olvassa le az érzékelőről:
  readings[readIndex] = analogRead(inputPin);
  // add hozzá a leolvasott értéket az összeghez:
  total = total + readings[readIndex];
  // lépés a tömb következő helyére:
  readIndex = readIndex + 1;

  // ha a tömb végén vagyunk...
  if (readIndex >= numReadings) {
    // ...körbetekerünk az elejéhez:
    readIndex = 0;
  }

  // számítsa ki az átlagot:
  average = total / numReadings;
  // küldje el a számítógépnek ASCII számként
  Serial.println(average);
  delay(1);        // késleltetés a leolvasások között a stabilitás érdekében
}

Tudj meg többet

További alapvető oktatóanyagokat a beépített példák részben talál.

Felfedezheti a nyelvi referenciát is, az Arduino programozási nyelv részletes gyűjteményét.