#define TRIGGER_PIN 9 // Pino Trigger do HC-SR04
#define ECHO_PIN 8 // Pino Echo do HC-SR04
#define SAMPLE_SIZE 5 // Tamanho do buffer de amostras para cálculos
float samples[SAMPLE_SIZE];
int sampleIndex = 0;
float movingAverage = 0;
void setup() {
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.begin(9600);
}
void loop() {
float distance = measureDistance();
if (distance > 0) {
samples[sampleIndex] = distance;
sampleIndex = (sampleIndex + 1) % SAMPLE_SIZE;
// Cálculos estatísticos
float mean = calculateMean(samples, SAMPLE_SIZE);
float median = calculateMedian(samples, SAMPLE_SIZE);
float mode = calculateMode(samples, SAMPLE_SIZE);
float stddev = calculateStdDev(samples, SAMPLE_SIZE, mean);
movingAverage = calculateMovingAverage(samples, SAMPLE_SIZE);
// Exibir resultados
Serial.print("Distância: ");
Serial.print(distance);
Serial.print(" cm | Média: ");
Serial.print(mean);
Serial.print(" | Mediana: ");
Serial.print(median);
Serial.print(" | Moda: ");
Serial.print(mode);
Serial.print(" | Desvio Padrão: ");
Serial.print(stddev);*/
Serial.print(" | Média Móvel: ");
Serial.println(movingAverage);
delay(100); // Ajuste o intervalo conforme necessário
}
}
float measureDistance() {
// Enviar pulso de trigger
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
// Medir o tempo do pulso no pino ECHO
long duration = pulseIn(ECHO_PIN, HIGH);
// Calcular a distância em cm (velocidade do som no ar é ~343 m/s)
float distance = duration * 0.034 / 2;
return distance;
}
float calculateMean(float data[], int size) {
float sum = 0;
for (int i = 0; i < size; i++) {
sum += data[i];
}
return sum / size;
}
float calculateMedian(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];
}
}
float calculateMode(float data[], int size) {
float mode = 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;
mode = data[i];
}
}
return maxCount > 1 ? mode : NAN;
}
float calculateStdDev(float data[], int size, float mean) {
float sumSq = 0;
for (int i = 0; i < size; i++) {
sumSq += pow(data[i] - mean, 2);
}
return sqrt(sumSq / size);
}
float calculateMovingAverage(float data[], int size) {
float sum = 0;
for (int i = 0; i < size; i++) {
sum += data[i];
}
return sum / size;
}