// ---------------------------------------------------------------------------
/* Código para Arduino Uno
Leitura de canal analógico A0 (potenciometro) e
cálculo de estatísticas de tendência central e de dispersão do sinal
jams, EESC/USP, 2024 */
// ---------------------------------------------------------------------------
// Diretivas de pré-processador
#define PINO_POTENCIOMETRO A0 // Pino analógico para o potenciômetro
#define TAMANHO_BUFFER 16 // Tamanho do buffer de amostras para cálculos
// ---------------------------------------------------------------------------
// Declaração de variáveis, protótipos de funções, etc.
float amostras[ TAMANHO_BUFFER ];
float mediaMovel = 0;
int indiceAmostra = 0;
// ---------------------------------------------------------------------------
// Configuração da porta serial
void setup() {
Serial.begin( 9600 );
}
// ---------------------------------------------------------------------------
// Loop principal
void loop() {
// float mediaMovel = 0;
// Leitura do potenciômetro (0 a 1023)
float tensao = analogRead( PINO_POTENCIOMETRO );
// Conversão para posição em graus
float posicao = map( tensao, 0, 1023, 225, -45 );
// armazenar a posicao no array de amostras
amostras[ indiceAmostra ] = posicao;
indiceAmostra = ( indiceAmostra + 1 ) % TAMANHO_BUFFER;
// ------------------------------------------------------------------------
// Cálculos estatísticos
float media = calculaMedia( amostras, TAMANHO_BUFFER );
float mediana = calculaMediana( amostras, TAMANHO_BUFFER );
float moda = calculaModa( amostras, TAMANHO_BUFFER );
float desvio = calculaDesvio( amostras, TAMANHO_BUFFER, media );
mediaMovel = calculaMediaMovel( amostras, TAMANHO_BUFFER );
// ------------------------------------------------------------------------
// Exibir resultados
Serial.print( "Posição: " );
Serial.print( posicao );
Serial.print( " | Média: " );
Serial.print( media );
Serial.print( " | Mediana: " );
Serial.print( mediana );
Serial.print( " | Moda: " );
Serial.print( moda );
Serial.print( " | Desvio Padrão: " );
Serial.print( desvio );
Serial.print( " | Média Móvel: " );
Serial.println( mediaMovel );
delay( 100 ); // Ajuste o intervalo conforme necessário
}
// ---------------------------------------------------------------------------
// Função Média:
float calculaMedia( float data[], int size ) {
float sum = 0;
for ( int i = 0; i < size; i++ ) {
sum += data[ i ];
}
return sum / size;
}
// ---------------------------------------------------------------------------
// Função Mediana:
float calculaMediana( float data[], int size ) {
float sorted[ size ];
memcpy( sorted, data, size * sizeof(float) );
for ( int i = 0; i < size - 1; i++ ) {
for ( int j = i + 1; j < size; j++ ) {
if ( sorted[ i ] > sorted[ j ] ) {
float temp = sorted[ i ];
sorted[ i ] = sorted[ j ];
sorted[ j ] = temp;
}
}
}
if ( size % 2 == 0 ) {
return ( sorted[ size / 2 - 1 ] + sorted[ size / 2 ] ) / 2;
} else {
return sorted[ size / 2 ];
}
}
// ---------------------------------------------------------------------------
// Função Moda:
float calculaModa( float data[], int size ) {
float moda = data[ 0 ];
int maxCount = 0;
for ( int i = 0; i < size; i++ ) {
int count = 1;
for ( int j = i + 1; j < size; j++ ) {
if ( data[ j ] == data[ i ] ) count++;
}
if ( count > maxCount ) {
maxCount = count;
moda = data[ i ];
}
}
return maxCount > 1 ? moda : NAN;
}
// ---------------------------------------------------------------------------
// Função Desvio Padrão:
float calculaDesvio( float data[], int size, float media ) {
float sumSq = 0;
for ( int i = 0; i < size; i++ ) {
sumSq += pow( data[ i ] - media, 2 );
}
return sqrt( sumSq / size );
}
// ---------------------------------------------------------------------------
// Função Média móvel:
float calculaMediaMovel( float data[], int size ) {
float sum = 0;
for ( int i = 0; i < size; i++ ) {
sum += data[ i ];
}
return sum / size;
}