#include "pico/stdlib.h"
#include "ssd1306.h"
#include "hardware/i2c.h"
#include <string.h>
#define LED_R_PIN 13
#define LED_G_PIN 11
#define LED_B_PIN 12
#define BTN_A_PIN 5
const uint I2C_SDA = 14;
const uint I2C_SCL = 15;
int A_state = 0; // Botao A está pressionado?
// Função para exibir a mensagem com 3 linhas
void mostrarMensagem(char *linha1, char *linha2, char *linha3) {
uint8_t ssd[ssd1306_buffer_length];
memset(ssd, 0, sizeof(ssd));
struct render_area frame_area = {
.start_column = 0,
.end_column = ssd1306_width - 1,
.start_page = 0,
.end_page = ssd1306_n_pages - 1
};
calculate_render_area_buffer_length(&frame_area);
int y = 0;
// Desenha a primeira linha centralizada
int x = (ssd1306_width - strlen(linha1) * 6) / 2; // Calcula a posição X para centralizar
ssd1306_draw_string(ssd, x, y, linha1);
render_on_display(ssd, &frame_area);
// Desenha a segunda linha centralizada
y = 10; // Mover para a próxima linha
x = (ssd1306_width - strlen(linha2) * 6) / 2;
ssd1306_draw_string(ssd, x, y, linha2);
render_on_display(ssd, &frame_area);
// Desenha a terceira linha centralizada
y = 20; // Mover para a linha 3
x = (ssd1306_width - strlen(linha3) * 6) / 2;
ssd1306_draw_string(ssd, x, y, linha3);
render_on_display(ssd, &frame_area);
}
void SinalAberto() {
gpio_put(LED_R_PIN, 0);
gpio_put(LED_G_PIN, 1);
gpio_put(LED_B_PIN, 0);
mostrarMensagem("SINAL ABERTO", "ATRAVESSAR", "COM CUIDADO");
}
void SinalAtencao() {
gpio_put(LED_R_PIN, 1);
gpio_put(LED_G_PIN, 1);
gpio_put(LED_B_PIN, 0);
mostrarMensagem("SINAL DE", "ATENCAO", "PREPARE-SE");
}
void SinalFechado() {
gpio_put(LED_R_PIN, 1);
gpio_put(LED_G_PIN, 0);
gpio_put(LED_B_PIN, 0);
mostrarMensagem("SINAL", "FECHADO", "AGUARDE");
}
int WaitWithRead(int timeMS) {
for (int i = 0; i < timeMS; i = i + 100) {
A_state = !gpio_get(BTN_A_PIN);
if (A_state == 1) {
return 1;
}
sleep_ms(100);
}
return 0;
}
int main() {
stdio_init_all(); // Inicializa o sistema de entrada/saída
// Inicialização do i2c (I2C1)
i2c_init(i2c1, 400000); // Inicializa I2C1 com clock de 400 kHz
gpio_set_function(I2C_SDA, GPIO_FUNC_I2C); // Define pino SDA para I2C
gpio_set_function(I2C_SCL, GPIO_FUNC_I2C); // Define pino SCL para I2C
gpio_pull_up(I2C_SDA); // Ativa o resistor pull-up no pino SDA
gpio_pull_up(I2C_SCL); // Ativa o resistor pull-up no pino SCL
// Inicializa o display OLED SSD1306
ssd1306_init();
// INICIANDO LEDS
gpio_init(LED_R_PIN);
gpio_set_dir(LED_R_PIN, GPIO_OUT);
gpio_init(LED_G_PIN);
gpio_set_dir(LED_G_PIN, GPIO_OUT);
gpio_init(LED_B_PIN);
gpio_set_dir(LED_B_PIN, GPIO_OUT);
// INICIANDO BOTÃO
gpio_init(BTN_A_PIN);
gpio_set_dir(BTN_A_PIN, GPIO_IN);
gpio_pull_up(BTN_A_PIN);
while (true) {
SinalAberto();
A_state = WaitWithRead(8000); // espera com leitura do botão
if (A_state) { // Alguém apertou o botão - sai do semáforo normal
SinalAtencao();
sleep_ms(5000);
SinalFechado();
sleep_ms(10000);
} else { // Ninguém apertou o botão - continua no semáforo normal
SinalAtencao();
sleep_ms(2000);
SinalFechado();
sleep_ms(8000);
}
}
return 0;
}
Loading
pi-pico-w
pi-pico-w