#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/adc.h"
#include "esp_log.h"
#include "stdio.h"
#include "math.h"
#define ADC_PIN ADC1_CHANNEL_6 // Pino ADC (GPIO34, ADC1_CHANNEL_0)
#define ADC_WIDTH ADC_WIDTH_BIT_12 // Resolução do ADC (12 bits)
#define ADC_ATTEN ADC_ATTEN_DB_0 // Atenuação de 0dB para faixa de 0 a 3.3V
#define NUM_SAMPLES 80 // Número de amostras a serem coletadas (80 pontos)
#define SAMPLING_RATE 4000 // Taxa de amostragem (4 kHz)
#define LIMIAR_RMS 0.5 // Limiar para detecção do tipo de sinal (ajustável)
static const char *TAG = "Sinal Detection";
// Função para calcular o valor RMS de um sinal
float calcular_rms(float *sinal, int n_amostras) {
float soma_quadrados = 0.0;
for (int i = 0; i < n_amostras; i++) {
soma_quadrados += sinal[i] * sinal[i];
}
return sqrt(soma_quadrados / n_amostras);
}
// Função para calcular a derivada numérica de um sinal
void calcular_derivada(float *sinal, float *derivada, int n_amostras) {
for (int i = 1; i < n_amostras; i++) {
derivada[i] = sinal[i] - sinal[i - 1];
}
derivada[0] = derivada[1]; // Aproximação para o primeiro valor
}
// Função para detectar o tipo de sinal com base no valor RMS da derivada
void detectar_sinal(float *sinal, int n_amostras, float limiar_rms) {
float derivada[n_amostras];
calcular_derivada(sinal, derivada, n_amostras);
// Calcular o valor RMS da derivada
float rms_derivada = calcular_rms(derivada, n_amostras);
// Classificar o tipo de sinal com base no RMS da derivada
if (rms_derivada > limiar_rms) {
ESP_LOGI(TAG, "Sinal Quadrado - RMS Derivada: %.4f", rms_derivada);
} else {
ESP_LOGI(TAG, "Sinal Dente de Serra - RMS Derivada: %.4f", rms_derivada);
}
}
void app_main() {
ESP_LOGI(TAG, "Iniciando detecção de sinais...");
// Configuração do ADC (GPIO34 para ADC1_CHANNEL_6)
adc1_config_width(ADC_WIDTH); // Configura a largura do ADC (12 bits)
adc1_config_channel_atten(ADC_PIN, ADC_ATTEN); // Configura a atenuação do ADC
int adc_value;
float sinal[NUM_SAMPLES];
int sample_index = 0;
while (1) {
// Coleta de dados do ADC e preenchimento do vetor 'sinal'
adc_value = adc1_get_raw(ADC_PIN);
// Converte o valor do ADC para uma faixa de 0 a 3.3V
sinal[sample_index] = (float)adc_value * (3.3 / 4095.0);
sample_index++;
// Quando preencher o vetor de sinais, realiza a detecção
if (sample_index >= NUM_SAMPLES) {
sample_index = 0; // Resetar o índice para o próximo ciclo
detectar_sinal(sinal, NUM_SAMPLES, LIMIAR_RMS);
}
vTaskDelay(pdMS_TO_TICKS(1000 / SAMPLING_RATE)); // Intervalo baseado na taxa de amostragem (4kHz)
}
}