#include <stdio.h>
#include <stdlib.h> //para abs
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "hardware/adc.h"
#define ADC_NUM2 2 // ADC A2
#define ADC_PIN2 (26 + ADC_NUM2)//26 + 2 = GPIO 28
int vetor[10] = {60, 100, 500, 700, 1000, 1600, 2500, 2800, 3400, 4000}; // Vetor crescente e não-linear
int buscar_inferior(int valor) { //Busca o valor inferior OU igual mais próximo
int escolhido = vetor[0];
for (int i = 0; i < 10; i++) {
if (vetor[i] <= valor) {
escolhido = vetor[i];
} else {
break;
}
}
return escolhido;
}
int buscar_superior(int valor) { //Busca o valor superior OU igual mais próximo
for (int i = 0; i < 10; i++) {
if (vetor[i] >= valor) {
return vetor[i];
}
}
return vetor[9]; // retorna o maior se nada for maior
}
int buscar_menor_erro(int valor) { // Busca o valor com menor erro absoluto
int melhor = vetor[0];
int menor_dif = abs(valor - vetor[0]);
for (int i = 1; i < 10; i++) {
int dif = abs(valor - vetor[i]);
if (dif < menor_dif) {
menor_dif = dif;
melhor = vetor[i];
}
}
return melhor;
}
int main() {
stdio_init_all();
adc_init(); //inicializa ADC
adc_gpio_init(ADC_PIN2); //configura pino como entrada
uint adc_valor2;
while (true) {
adc_select_input(ADC_NUM2); //seleciona a entrada A2
adc_valor2 = adc_read(); // faz a leitura do sinal da entrada A2, valor entre 0 e 4095
int v_inf = buscar_inferior(adc_valor2);
int v_sup = buscar_superior(adc_valor2);
int v_erro = buscar_menor_erro(adc_valor2);
printf("ADC = %u | INF = %d | SUP = %d | ERRO = %d\n", adc_valor2, v_inf, v_sup, v_erro);
sleep_ms(500);
}
}