/*******************************************************************************
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: 17/04/2025
Software License Agreement: Somente para fins didativos
*******************************************************************************
File Description: Controla Saídas Digitais e PWM - Já com Multicore
*
Change History:
1.0 12/09/2025 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 "ssd1306.h"
#include "pico/time.h"
#include "pico/multicore.h"
//#include "pcf8574.h"
#include "hardware/pwm.h"
#include "hardware/clocks.h"
#include "pwm_fatec.h"
//====================================================================
// Definicoes do Projeto
//====================================================================
#define IN_74LS245 15 //Configura o SN74LS245 como entrada B->A.
#define botao_B1 22 //GPIO22.
#define PWM_PIN 9
//==================================================================
// Protótipos das Funções
static void core1_entry(void);
//===================================================================
// Variáveis Globais
//===================================================================
// Buffer de RAM de tela
uint8_t display_buffer[128 * SSD1306_HEIGHT / 8] = {0};
//===============================================================================================
void main(void)
{
gpio_init(IN_74LS245);
gpio_set_dir(IN_74LS245, GPIO_OUT);
gpio_put(IN_74LS245, 0);
// 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);
bool boot = gpio_get(botao_B1);
if(boot == 0) {reset_usb_boot(0, 0);}
// Inicializa a UART com baud rate de 115200 e Sensor Ultrassom
stdio_init_all();
// 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, 0, 24, "PWM= ");
ssd1306_send_data(display_buffer, 128 * SSD1306_HEIGHT / 8);
// Ativa o Core 1 para cuidar do temporizador e das interrupções associadas
//multicore_launch_core1(core1_entry);
sleep_ms(2000);
pwm_init_pin(PWM_PIN);
while (true)
{
for (uint8_t i = 0; i <= 100; i += 1)
{
pwm_set_duty_percent(PWM_PIN, i);
ssd1306_write_text(display_buffer, 48, 24, " %"); //Limpa local do buffer
ssd1306_int_number(display_buffer, 48, 24, i, 3); //Converte ASCII para display
// Atualiza o display com o conteúdo do buffer
ssd1306_send_data(display_buffer, 128 * SSD1306_HEIGHT / 8);
sleep_ms(200);
bool stop = gpio_get(botao_B1);
while(!stop)
{
stop = gpio_get(botao_B1);
}
}
sleep_ms(1000);
for (int8_t i = 100; i >= 0; i -= 1)
{
pwm_set_duty_percent(PWM_PIN, i);
ssd1306_write_text(display_buffer, 48, 24, " %"); //Limpa local do buffer
ssd1306_int_number(display_buffer, 48, 24, i, 3); //Converte ASCII para display
// Atualiza o display com o conteúdo do buffer
ssd1306_send_data(display_buffer, 128 * SSD1306_HEIGHT / 8);
sleep_ms(200);
bool stop = gpio_get(botao_B1);
while(!stop)
{
stop = gpio_get(botao_B1);
}
}
sleep_ms(1000);
}
}
//============================================================================================================================================
//******************************************************************************************************************************************/
// /* CORE 1 */
//*****************************************************************************************************************************************/
static void core1_entry(void)
{
//=================================================================================================================
// ÁREA DAS INTERRUPÇÕES E FUNÇÕES
//================================================================================================================
while (true)
{
//tight_loop_contents(); //Evita otimização do compilador para While vazio
sleep_ms(100);
}
}