/*******************************************************************************
FileName: main.c
Dependencies: Veja a secao de includes
Processor: Raspberry Pico
Compiler: SDK 1.5.1
Company: FATEC Santo Andre
Author: Brenda Biasso; Gabriel Mendes; Nathan Santana Soares; Rafael Adolfo.
Date: 17/10/2025
Software License Agreement: Somente para fins didativos
*******************************************************************************
File Description: Leitura do Sensor ACT
*
Change History:
1.0 12/09/2024 Versao inicial (Prof. Edson Kitani).
2.0 17/10/2025 Inclusao de estimativa de temperatura.
*******************************************************************************/
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/adc.h"
#include <string.h>
#include <assert.h>
#include <ctype.h>
#include "pico/bootrom.h"
#include <math.h>
#include "ssd1306.h"
//====================================================================
// Definicoes do Projeto
//====================================================================
#define botao_B1 22 //GPIO22
#define IN_74LS245 15 //Configura o SN74LS245 como entrada B->A.
#define OUT_H 1
#define OUT_L 0
//===================================================================
// Variáveis Globais
//===================================================================
// Buffer de RAM de tela
uint8_t display_buffer[128 * SSD1306_HEIGHT / 8] = {0};
//===============================================================================================
void main(void)
{
// Define variáveis
uint16_t adc_value = 0;
uint32_t adc_pol = 0;
uint32_t adc_pol_a = 0;
uint32_t mantissa = 0;
// Inicializa a UART com baud rate de 115200
stdio_init_all();
// Configura o pino 22 do botão B1 para função inicial de Boot
gpio_init(botao_B1);
gpio_set_dir(botao_B1, GPIO_IN);
gpio_init(IN_74LS245);
gpio_set_dir(IN_74LS245, GPIO_OUT);
gpio_put(IN_74LS245, OUT_L);
bool boot = gpio_get(botao_B1);
if(boot == 0) {reset_usb_boot(0, 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 buffer
ssd1306_write_text(display_buffer, 32, 0, "FATEC");
ssd1306_write_text(display_buffer, 10, 8, "SANTO ANDRE");
ssd1306_write_text(display_buffer, 0, 24, "Pct:");
ssd1306_write_text(display_buffer, 88, 24, "%");
ssd1306_send_data(display_buffer, 128 * SSD1306_HEIGHT / 8);
sleep_ms(2000);
// Inicializa o ADC
adc_init();
// Configura os pinos GPIO 26, 27 e 28 para ADC
adc_gpio_init(26); // ADC0 no GPIO 26
adc_select_input(0); // Seleciona o canal 0, correspondente ao GPIO26
adc_read();
while (true)
{
adc_value = adc_read(); // Lê o valor do ADC
adc_pol = 100*adc_value/4095;
adc_pol *= 10;
adc_pol_a = (1000*adc_value)/4095;
mantissa = adc_pol_a - adc_pol;
printf("mantissa %d \n", mantissa);
ssd1306_write_text(display_buffer, 48, 24, " "); //Limpa local do buffer
if(adc_pol_a<10)
{
ssd1306_int_number(display_buffer, 82, 24, adc_pol_a, 6); //Converte ASCII para display
ssd1306_write_text(display_buffer, 76, 24, ".");
ssd1306_int_number(display_buffer, 82, 24, mantissa, 6); //Converte ASCII para display
ssd1306_write_text(display_buffer, 90, 24, " ");
}
if(adc_pol_a<100)
{
ssd1306_int_number(display_buffer, 64, 24, adc_pol_a, 6); //Converte ASCII para display
ssd1306_write_text(display_buffer, 74, 24, ".");
ssd1306_int_number(display_buffer, 82, 24, mantissa, 6); //Converte ASCII para display
ssd1306_write_text(display_buffer, 90, 24, " ");
}
if(adc_pol_a<1000)
{
ssd1306_int_number(display_buffer, 56, 24, adc_pol_a, 6); //Converte ASCII para display
ssd1306_write_text(display_buffer, 74, 24, ".");
ssd1306_int_number(display_buffer, 82, 24, mantissa, 6); //Converte ASCII para display
ssd1306_write_text(display_buffer, 90, 24, " ");
}
else
{
ssd1306_int_number(display_buffer, 48, 24, adc_pol_a, 6); //Converte ASCII para display
ssd1306_write_text(display_buffer, 74, 24, ".");
ssd1306_int_number(display_buffer, 82, 24, mantissa, 6); //Converte ASCII para display
ssd1306_write_text(display_buffer, 90, 24, " ");
}
ssd1306_send_data(display_buffer, 128 * SSD1306_HEIGHT / 8);
sleep_ms(100);
}
}