#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/adc.h"
#include "hardware/dma.h"
#include "hardware/i2c.h"
#include "ssd1306.h" // Adicione o caminho correto da biblioteca
#define I2C_PORT i2c0
#define I2C_SDA_PIN 4
#define I2C_SCL_PIN 5
#define BUFFER_SIZE 1
uint16_t adc_buffer[BUFFER_SIZE];
float convert_to_celsius(uint16_t raw) {
const float conversion_factor = 3.3f / (1 << 12);
float voltage = raw * conversion_factor;
float temperature = 27 - (voltage - 0.706f) / 0.001721f;
return temperature;
}
int main() {
stdio_init_all();
sleep_ms(500); // Aguarda inicialização
// Inicializa I2C e Display
i2c_init(I2C_PORT, 400 * 1000);
gpio_set_function(I2C_SDA_PIN, GPIO_FUNC_I2C);
gpio_set_function(I2C_SCL_PIN, GPIO_FUNC_I2C);
gpio_pull_up(I2C_SDA_PIN);
gpio_pull_up(I2C_SCL_PIN);
ssd1306_init(I2C_PORT, 0x3C, I2C_SDA_PIN, I2C_SCL_PIN);
ssd1306_clear();
ssd1306_show();
// Inicializa ADC
adc_init();
adc_set_temp_sensor_enabled(true);
adc_select_input(4);
adc_fifo_setup(true, true, 1, false, false);
// Configura DMA
int dma_chan = dma_claim_unused_channel(true);
dma_channel_config dma_cfg = dma_channel_get_default_config(dma_chan);
channel_config_set_transfer_data_size(&dma_cfg, DMA_SIZE_16);
channel_config_set_read_increment(&dma_cfg, false);
channel_config_set_write_increment(&dma_cfg, true);
channel_config_set_dreq(&dma_cfg, DREQ_ADC);
char display_buf[32];
while (true) {
adc_run(true);
dma_channel_configure(
dma_chan,
&dma_cfg,
adc_buffer, // Destino (RAM)
&adc_hw->fifo, // Origem (FIFO do ADC)
BUFFER_SIZE, // Número de amostras
true // Iniciar agora
);
dma_channel_wait_for_finish_blocking(dma_chan);
adc_run(false);
float temperature = convert_to_celsius(adc_buffer[0]);
snprintf(display_buf, sizeof(display_buf), "Temp: %.2f C", temperature);
// Exibir no OLED
ssd1306_clear();
ssd1306_draw_string(0, 0, display_buf);
ssd1306_show();
sleep_ms(500);
}
return 0;
}