#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/bootrom.h"
#include "ssd1306.h"
#include "hardware/adc.h"
#include "hardware/pwm.h"
#define botao_B1 22 // GPIO22 //Botão que fica na CPU
#define ADC0_NUM 0 // ADC A0
#define ADC0_PIN ( 26 + ADC0_NUM ) // GPIO ( 26 + 0 ) = 26
#define PWM_PIN 14
// Variáveis Globais
uint8_t display_buffer[128 * SSD1306_HEIGHT / 8] = {0}; // Buffer de RAM de tela
uint16_t adc0_valor; // Valor de leitura do ADC
uint slice_num;
char ADC_value_buffer[50];// Valor de leitura do ADC em string
int main() {// Configura os I/Os
gpio_init(botao_B1);
gpio_set_dir(botao_B1, GPIO_IN);
// Configurado o GPIO 22 do botão B1 para função inicial de Boot
// Usado quando temos a placa de condicionador
bool boot = gpio_get(botao_B1);
if (boot == 0) {
reset_usb_boot(0, 0);
}
// Inicializa a UART com baud rate de 115200
// Usado para fazer monitoração serial via VS Code ou outro software
stdio_init_all(); // Inicializa a UART com baud rate de 115200 // Usado para fazer monitoração serial via VS Code ou outro software
SSD1306_init(); // Inicializa a interface I2C e o display
// Configuração do ADC
adc_init(); // inicializa o ADC
adc_gpio_init(ADC0_PIN); // configura os pinos de entrada analogica
// Configuração do PWM
gpio_set_function(PWM_PIN, GPIO_FUNC_PWM);
slice_num = pwm_gpio_to_slice_num (PWM_PIN);
pwm_set_clkdiv (slice_num, 1.907f); // divisor
pwm_set_wrap (slice_num, 100); // período
pwm_set_enabled (slice_num, true);
float tensao;
float percentual;
uint16_t duty;
while (true)
{
adc_select_input(ADC0_NUM); // Seleciona o entrada A0
adc0_valor = adc_read(); // Leitura do sinal da entrada A0
tensao = (adc0_valor * 3.3) / 4095; // Conversão para Volts (12 bits = 4095)
percentual = (tensao / 3.3) * 100;
duty = (adc0_valor * 100) / 4095; // Conversão ADC -> PWM
pwm_set_chan_level(slice_num, PWM_CHAN_A, duty); // Atualiza PWM
ssd1306_clear_buffer(display_buffer); // Limpa o buffer
sprintf(ADC_value_buffer, "Divisão: %d", adc0_valor); // Exibe o valor bruto (Raw)
ssd1306_write_text(display_buffer, 0, 0, ADC_value_buffer); // Escreve texto no buffer
sprintf(ADC_value_buffer, "Tensao: %.2fV", tensao); // Exibe a tensão calculada
ssd1306_write_text(display_buffer, 0, 12, ADC_value_buffer); // Escreve texto no buffer
sprintf(ADC_value_buffer, "Pedal: %.1f%%", percentual);
ssd1306_write_text(display_buffer, 0, 24, ADC_value_buffer);
sprintf(ADC_value_buffer, "PWM: %d", duty);
ssd1306_write_text(display_buffer, 0, 36, ADC_value_buffer);
ssd1306_send_data(display_buffer, 128 * SSD1306_HEIGHT / 8); // Atualiza o display com o conteúdo do buffer
sleep_ms(100);
}
}GPIO14
GPIO 13
GPIO 12
GPIO 11
GPIO 10
GPIO 9
GPIO 8
GP14
GP13
GP12
GP11
GP10
GP9
GP8
RESET
Botão B1
OLED