#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/adc.h"
#include "ssd1306.h"
//====================================================================
// Definicoes do Projeto
//====================================================================
#define oscilador 14 //GPIO14
#define botao_B1 22 //GPIO22
//===================================================================
// Variáveis Globais
//===================================================================
// Buffer de RAM de tela
uint8_t display_buffer[128 * SSD1306_HEIGHT / 8] = {0};
//===============================================================================================
int main() {
//===============================================================================================
// Define o buffer do display
uint32_t adc_value = 0;
uint16_t porcentagem=0;
uint16_t porcentagem_b=0;
uint16_t porcentagem_c=0;
uint16_t porcentagem_d=0;
// Inicializa a interface I2C e o display
SSD1306_init();
// Limpa o buffer
ssd1306_clear_buffer(display_buffer);
ssd1306_send_data(display_buffer, 128 * SSD1306_HEIGHT / 8);
sleep_ms(2000);
//===============================================================================================
// Escreve texto no Inicial no Buffer do Display
ssd1306_write_text(display_buffer, 32, 0, "FATEC");
ssd1306_write_text(display_buffer, 10, 8, "SANTO ANDRE");
ssd1306_write_text(display_buffer, 0, 24, "ADC0= ");
ssd1306_write_text(display_buffer, 0, 32, "Y%= ");
ssd1306_send_data(display_buffer, 128 * SSD1306_HEIGHT / 8);
//==================================================================================================
// Inicializa o ADC
adc_init();
// Configura os pinos GPIO 26, 27 e 28 para ADC
adc_gpio_init(26); // ADC0 no GPIO 26
//==================================================================================================================
// PROGRAMA PRINCIPAL
//==================================================================================================================
while (true) {
ssd1306_write_text(display_buffer, 48, 24, " "); //Limpa local do buffer
ssd1306_int_number(display_buffer, 48, 24, adc_value, 8); //Converte ASCII para display
ssd1306_write_text(display_buffer, 56, 32, " ."); //Limpa local do buffer
ssd1306_int_number(display_buffer, 56, 32, porcentagem, 8);
ssd1306_write_text(display_buffer, 88, 32, " %"); //Limpa local do buffer
ssd1306_int_number(display_buffer, 88, 32, porcentagem_d, 8);
// Atualiza o display com o conteúdo do buffer
ssd1306_send_data(display_buffer, 128 * SSD1306_HEIGHT / 8);
sleep_ms(1);
//Lê o novo valor na entrada analógica 0
adc_select_input(0); // Seleciona o canal 0, correspondente ao GPIO26
adc_value = adc_read(); // Lê o valor do ADC
porcentagem=(adc_value*100/4095);
porcentagem_b=porcentagem*100;
porcentagem_c=(adc_value*10000/4095);
porcentagem_d=porcentagem_c - porcentagem_b;
sleep_ms(100);
}
}