// ---------------------------------------------------------------------------
/* 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.
Renan Ribeiro Machado e Prof. Jaime A Mosquera Sanchez, EESC/USP, 2024 */
// ---------------------------------------------------------------------------
// Diretivas de pré-processador:
#define PINO_POTENCIOMETRO A0
#define TAMANHO_BUFFER 16
// ---------------------------------------------------------------------------
// Declaração de variáveis, protótipos de funções, etc.
bool coletaIniciada = false;
bool sistemaTravado = false;
int indiceAmostra = 0;
float amostras[ TAMANHO_BUFFER ];
float mediaMovel = 0;
float valorInicial = 0;
unsigned long tempoInicialColeta = 0;
unsigned long tempoFimColeta = 0;
// ---------------------------------------------------------------------------
// Configuração da porta serial
void setup() {
// Salvar o valor de tensão inicial:
valorInicial = analogRead( PINO_POTENCIOMETRO );
// Configura a porta serial:
Serial.begin( 9600 );
Serial.println("Aguardando movimento do potenciômetro...");
}
// ---------------------------------------------------------------------------
// Loop principal
void loop() {
// Leitura do potenciômetro (0 a 1023):
float tensao = analogRead( PINO_POTENCIOMETRO );
// Lógica (condição) para iniciar a medição:
if ( !coletaIniciada && !sistemaTravado && abs( tensao - valorInicial ) > 10 ) {
coletaIniciada = true;
tempoInicialColeta = millis();
Serial.println( "Movimento detectado. Iniciando coleta por 10 segundos..." );
}
// Condição principal para armazenar as medições e calcular as medidas estatísticas
if ( coletaIniciada && ( millis() - tempoInicialColeta <= 10000 ) ){
// armazenar a posicao atual no array de amostras enquanto o deadline não estoura:
float posicao = map( tensao , 0 , 1023 , 225, -45 );
amostras[ indiceAmostra ] = posicao;
indiceAmostra = ( indiceAmostra + 1 ) % TAMANHO_BUFFER;
// ----------------------------------------------------------------------
// Cálculo das medidas estatísticas:
// ----------------------------------------------------------------------
// Exibir resultados
Serial.print("Posicao:");
Serial.println(posicao);
delay( 100 );
// ----------------------------------------------------------------------
// Se o tempo de coleta estourou o deadline de 10 s:
} else if ( coletaIniciada && ( millis() - tempoInicialColeta > 10000 ) ) {
Serial.println( "Coleta finalizada. Sistema travado por 10 segundos..." );
coletaIniciada = ?;
sistemaTravado = ?;
tempoFimColeta = ?;
}
// ----------------------------------------------------------------------
// Se o tempoFimColeta é igual a 10 s, então libera o sistema para nova medição:
if( sistemaTravado && ( millis() - tempoFimColeta >= 10000 ) ) {
Serial.println( "Sistema pronto. Aguardando novo movimento do potenciômetro...") ;
sistemaTravado = ?;
valorInicial = ?; // Atualiza o valor inicial
}
}
// ----------------------------------------------------------------------
// Funções estatísticas
float calculaMedia(float data[], int size)
float calculaMediana(float data[], int size)
float calculaModa(float data[], int size)
float calculaDesvio(float data[], int size, float media)
float calculaMediaMovel(float data[], int size)