#include "pico/stdlib.h" // Funções padrão do Raspberry Pi Pico.
#include "hardware/i2c.h" // Biblioteca para comunicação I2C.
#include <stdio.h> // Funções de entrada/saída (printf).
// Configuração de pinos
// ======== BH1750 ========
#define I2C_PORT i2c0 // Define a porta I2C (i2c0).
#define BH1750_SDA 4 // Pino GPIO para SDA do BH1750.
#define BH1750_SCL 5 // Pino GPIO para SCL do BH1750.
// ======== Servo =========
#define PIN_SERVO 14 // Pino GPIO para o servo motor.
// Configurações do Sensor BH1750
#define BH1750_ADDR 0x23 // Endereço I2C do sensor de luz BH1750.
#define BH1750_CMD_START 0x10 // Comando para iniciar medição contínua alta resolução.
// Configurações do servo motor
#define DUTY_ABERTO 1000 // Pulso para servo na posição "ABERTO" (us).
#define DUTY_FECHADO 2000 // Pulso para servo na posição "FECHADO" (us).
#define PERIODO_SERVO 20 // Período de um ciclo do servo (ms).
void send_pulse(uint duty) // Envia um pulso para o servo motor.
{
gpio_put(PIN_SERVO, 1); // Coloca pino do servo em nível ALTO.
sleep_us(duty); // Mantém pino ALTO por 'duty' microssegundos.
gpio_put(PIN_SERVO, 0); // Coloca pino do servo em nível BAIXO.
sleep_ms(PERIODO_SERVO - (duty / 1000)); // Aguarda para completar o período.
}
void adjust_servo_motor(uint16_t lux_level) // Ajusta servo baseado na luminosidade.
{
uint duty_us; // Variável para o duty cycle em microssegundos.
if(lux_level > 300) // Se luminosidade alta, fecha persianas.
{
duty_us = DUTY_FECHADO; // Define pulso para "FECHADO".
printf("Fechando persianas.\n"); // Mensagem: fechando persianas.
} else { // Se luminosidade baixa, abre persianas.
duty_us = DUTY_ABERTO; // Define pulso para "ABERTO".
printf("Abrindo persianas\n"); // Mensagem: abrindo persianas.
}
for(int i = 0; i < 50; i++) // Envia pulso várias vezes para estabilizar.
{
send_pulse(duty_us); // Chama função de envio de pulso.
}
}
uint16_t bh1750_read() // Lê luminosidade do sensor BH1750.
{
uint8_t data[2]; // Buffer para dados lidos do sensor.
i2c_read_blocking(I2C_PORT, BH1750_ADDR, data, 2, false); // Lê 2 bytes do sensor.
return (data[0] << 8 | data[1]); // Combina bytes para valor 16 bits.
}
void bh1750_start_monitoring() // Envia comando para BH1750 iniciar medição.
{
uint8_t cmd = BH1750_CMD_START; // Comando de início de medição.
i2c_write_blocking(I2C_PORT, BH1750_ADDR, &cmd, 1, false); // Envia comando ao sensor.
}
void init_pins() // Inicializa pinos I2C e servo motor.
{
i2c_init(I2C_PORT, 100 * 1000); // Inicializa I2C com 100 kHz.
gpio_set_function(BH1750_SDA, GPIO_FUNC_I2C); // Configura SDA para I2C.
gpio_set_function(BH1750_SCL, GPIO_FUNC_I2C); // Configura SCL para I2C.
gpio_pull_up(BH1750_SDA); // Habilita pull-up no pino SDA.
gpio_pull_up(BH1750_SCL); // Habilita pull-up no pino SCL.
gpio_init(PIN_SERVO); // Inicializa pino do servo motor.
gpio_set_dir(PIN_SERVO, GPIO_OUT); // Define pino do servo como SAÍDA.
}
int main() { // Função principal do programa.
stdio_init_all(); // Inicializa console serial.
init_pins(); // Inicializa pinos e periféricos.
bh1750_start_monitoring(); // Inicia monitoramento de luminosidade.
while (true) { // Loop infinito de operação.
uint16_t lux = bh1750_read(); // Lê nível de luminosidade.
printf("Luminosidade: %d lux\n", lux); // Imprime luminosidade no console.
adjust_servo_motor(lux); // Ajusta servo conforme luminosidade.
sleep_ms(1000); // Pausa por 1 segundo.
}
}