Faz repetidas leituras a partir de uma entrada analógica, calculando a média e informando o computador. Este exemplo é útil para regular os valores de sensores com leituras irregulares, e também demonstra a utilização de arrays para armazenar dados.

Componentes necessários:

  • Arduino
  • 1 potenciômetro 10kΩ
  • Jumpers
  • 1 Cabo USB

Circuito

Arduino Exemplos: Regulando

Esquema

Código

O código abaixo armazena sequencialmente 10 leituras do sensor analógico em arrays, um por um. Com cada novo valor, a soma de todos os valores é gerada e dividida, produzindo um valor médio que será usado para regular os dados. E porque esta média ocorre cada vez que um novo valor é adicionado ao array (em vez de esperar por 10 novos valores, por exemplo), não há defasagem no cálculo desta média em execução.


A alteração do tamanho do array, alterando numReadings para um valor maior irá suavizar os dados coletados ainda mais.

/*

  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 April 2007
  By David A. Mellis  <dam@mellis.org>
  modified 9 Apr 2012
  by Tom Igoe
  http://www.arduino.cc/en/Tutorial/Smoothing
 
  This example code is in the public domain.


*/



// 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
// 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 index = 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[index];        
  // read from the sensor:  
  readings[index] = analogRead(inputPin);
  // add the reading to the total:
  total= total + readings[index];      
  // advance to the next position in the array:  
  index = index + 1;                    

  // if we're at the end of the array...
  if (index >= numReadings)              
    // ...wrap around to the beginning:
    index = 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            
}
 

O conteúdo desta página é uma tradução para o português a partir do site original do Arduino.