//Gabriel Oliveira, Dênis Flores e Arthur Zagretti
#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/bootrom.h"
#include "ssd1306.h"
#include "hardware/adc.h"
#define I2C_PORT i2c0
#define SDA_PIN 20
#define SCL_PIN 21
#define BOTAO_B1 22
#define ADC0_NUM 0 // ADC A0
#define ADC0_PIN ( 26 + ADC0_NUM ) // GPIO ( 26 + 0 ) = 26
uint8_t display_buffer[128 * SSD1306_HEIGHT / 8]; // Buffer de RAM de tela
uint16_t adc0_valor; // Valor de leitura do ADC
char ADC_value_buffer[50]; // Valor de leitura do ADC em string
int main() {
gpio_init(BOTAO_B1);
gpio_set_dir(BOTAO_B1, GPIO_IN);
gpio_pull_up(BOTAO_B1);
bool boot = gpio_get(BOTAO_B1); // Configurado o GPIO 22 do botão B1 para função inicial de Boot
if(boot == 0) {reset_usb_boot(0, 0);} // Usado quando temos a placa de condicionador
stdio_init_all();
SSD1306_init(); // Inicializa a interface I2C e o display
ssd1306_clear_buffer(display_buffer); // Limpa o buffer
ssd1306_send_data(display_buffer, 128 * SSD1306_HEIGHT / 8);
sleep_ms(10);
adc_init(); // inicializa o ADC
adc_gpio_init( ADC0_PIN ); // configura os pinos de entrada analogica
ssd1306_write_text(display_buffer, 0, 0, "ADC 0: "); // Escreve texto no buffer
ssd1306_send_data(display_buffer, 128 * SSD1306_HEIGHT / 8); // Atualiza o display com o conteúdo do buffer
float tensao;
while (true) {
adc_select_input(ADC0_NUM); // Seleciona o entrada A0
adc0_valor = adc_read(); // Leitura do sinal da entrada A0
sprintf(ADC_value_buffer,"ADC 0:%d ",adc0_valor);
ssd1306_write_text(display_buffer, 0, 0, ADC_value_buffer);
tensao = 3.3*adc0_valor / 4095.0;
sprintf(ADC_value_buffer, "%2f", tensao);
ssd1306_write_text(display_buffer, 0, 9, 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
4.3V
COM
3.3V
GND
GND
GND