/*******************************************************************************
FileName: main.c
Dependencies: Veja a secao de includes
Processor: Raspberry Pico
Compiler: SDK 1.5.1
Company: FATEC Santo Andre
Author: Prof. Edson Kitani
Date: 12/09/2024
Software License Agreement: Somente para fins didativos
*******************************************************************************
File Description: Leitura do Sensor ACT
*
Change History:
1.0 12/09/2024 Versao inicial
*******************************************************************************/
#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 tensao = 0;
uint32_t resistencia_ntc = 1;
int64_t temperatura=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, "ACT = ");
ssd1306_write_text(display_buffer, 0, 32, "E = mV");
ssd1306_write_text(display_buffer, 0, 40, "R = R");
ssd1306_write_text(display_buffer, 0, 48, "T = C");
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_read();
adc_select_input(0); // Seleciona o canal 0, correspondente ao GPIO26
while (true)
{
adc_value = adc_read(); // Lê o valor do ADC
ssd1306_write_text(display_buffer, 64, 24, " "); //Limpa local do buffer
ssd1306_int_number(display_buffer, 64, 24, adc_value, 5); //Converte ASCII para display
// Converte o valor para tensão (0 a 3,3V)
if(adc_value)
{
tensao = (((uint32_t)adc_value) * 3300) / 4095; // O "f" indica variável do tipo float printf("ADC Value: %u (Decimal), 0x%x (Hexadecimal)\n", adc_value, adc_value); printf("ADC Value: %u (Decimal), 0x%x (Hexadecimal)\n", adc_value, adc_value);
}
else
{
tensao=0;
}
ssd1306_write_text(display_buffer, 64, 32, " "); //Limpa local do buffer
ssd1306_int_number(display_buffer, 64, 32, (tensao), 5);
// Envia o valor do ADC e a tensão pela porta Serial
printf("Valor do ADC: %u (Decimal), 0x%x (Hexadecimal)\n", adc_value, adc_value);
printf("Tensao = %.8f V\n", tensao);
ssd1306_write_text(display_buffer, 64, 40, " "); //Limpa local do buffer
ssd1306_write_text(display_buffer, 64, 48, " "); //Limpa local do buffer
if(adc_value<3730)
{
if(adc_value!=0)
{
resistencia_ntc = ((2200*((uint32_t)adc_value))/(4095-(uint32_t)adc_value));
temperatura = (24588-(277*((uint64_t)(log((double)resistencia_ntc)))))/100;
ssd1306_write_text(display_buffer, 0, 40, "R = R");
ssd1306_write_text(display_buffer, 0, 48, "T = C");
ssd1306_int_number(display_buffer, 64, 40, resistencia_ntc, 6); //Converte ASCII para display
ssd1306_int_number(display_buffer, 64, 48, temperatura, 4); //Converte ASCII para display
printf("Resistencia = %.2f Ohm\n", resistencia_ntc);
printf("Temperatura = %.8f C\n", temperatura);
}
else
{
ssd1306_write_text(display_buffer, 64, 40, "Curto ");
ssd1306_write_text(display_buffer, 64, 48, "Falha ");
printf("Curto circuito \n");
}
}
else
{
printf("Circuito Aberto \n");
ssd1306_write_text(display_buffer, 64, 40, "Aberto ");
ssd1306_write_text(display_buffer, 64, 48, "Falha ");
}
// Atualiza o display com o conteúdo do buffer
ssd1306_send_data(display_buffer, 128 * SSD1306_HEIGHT / 8);
sleep_ms(1);
sleep_ms(500);
}
}