#include <stdio.h> // Inclui a biblioteca padrão de entrada e saída (para printf).
#include "pico/stdlib.h" // Inclui a biblioteca de utilitários específicos para o Raspberry Pi Pico.
#include "hardware/adc.h" // Inclui a biblioteca de controle de ADC (Conversor Analógico-Digital).
#include <math.h> // Biblioteca para funções matemáticas (log)
#define BETA 3950 // Coeficiente Beta do termistor (valor típico, verificar no datasheet)
#define R_SERIE 10000.0 // Resistência do resistor em série (ohms)
#define T0 298.15 // Temperatura de referência em Kelvin (25°C = 298.15K)
#define R0 10000.0 // Resistência do termistor a 25°C (10k ohms, verificar no datasheet)
// Definições dos pinos
#define TRIG_PIN 27 // Define o pino 27 como pino de TRIG (trigger) do sensor de distância.
#define ECHO_PIN 22 // Define o pino 22 como pino de ECHO (eco) do sensor de distância.
#define TEMP_SENSOR_PIN 28 // Define o pino 28 para o sensor de temperatura (potenciômetro).
#define BUZZER_PIN 17 // Define o pino 17 para o buzzer.
#define LED_RED_PIN 13 // Define o pino 13 para o LED vermelho.
#define LED_GREEN_PIN 14 // Define o pino 14 para o LED verde.
#define LED_BLUE_PIN 12 // Define o pino 12 para o LED azul.
// Função para medir a distância usando o sensor wokwi-hc-sr04
float measure_distance() {
// Envia um pulso de 10 microssegundos para o pino TRIG, acionando o sensor de distância.
gpio_put(TRIG_PIN, true);
sleep_us(10); // Espera 10 microssegundos.
gpio_put(TRIG_PIN, false); // Desativa o TRIG.
// Aguarda o ECHO ficar alto, indicando que o sinal de som foi emitido.
while (!gpio_get(ECHO_PIN));
absolute_time_t start_time = get_absolute_time(); // Armazena o tempo inicial.
// Aguarda o ECHO ficar baixo, indicando que o sinal de som foi refletido.
while (gpio_get(ECHO_PIN));
absolute_time_t end_time = get_absolute_time(); // Armazena o tempo final.
// Calcula a duração do pulso (tempo que levou para o sinal ir e voltar).
uint64_t pulse_duration = absolute_time_diff_us(start_time, end_time);
// Calcula e retorna a distância (em centímetros) com base no tempo do pulso.
return pulse_duration * 0.0343 / 2; // A velocidade do som no ar é cerca de 343 metros por segundo.
}
// Função para ler a temperatura do termistor NTC
//No wokwi ele vai ler a primeira temperatura a 24º. Só após mexer na barra da temperatura que ele
//faz a primeira leitura.
float read_temperature() {
adc_select_input(2); // Seleciona o canal ADC 2 (GPIO28 no Pico)
uint16_t raw_value = adc_read();
float voltage = raw_value * 3.3 / 4095.0;
if (voltage == 0 || voltage == 3.3) return -273.15; // Evita erros
float resistance = R_SERIE * (voltage / (3.3 - voltage));
float temperature = 1.0 / ((1.0 / T0) + (1.0 / BETA) * log(resistance / R0));
return temperature - 273.15; // Converte para Celsius
}
// Função para acionar o LED RGB (para sinalizar o status)
void set_led_color(bool red, bool green, bool blue) {
gpio_put(LED_RED_PIN, red); // Aciona ou desativa o LED vermelho.
gpio_put(LED_GREEN_PIN, green); // Aciona ou desativa o LED verde.
gpio_put(LED_BLUE_PIN, blue); // Aciona ou desativa o LED azul.
}
int main() {
stdio_init_all(); // Inicializa o sistema de entrada e saída (necessário para usar printf).
// Define os estados iniciais
gpio_put(BUZZER_PIN, false);
set_led_color(false, false, false);
sleep_ms(2000); // Aguarda estabilização dos sensores
// Configuração dos pinos
gpio_init(TRIG_PIN); // Inicializa o pino TRIG.
gpio_set_dir(TRIG_PIN, GPIO_OUT); // Configura o pino TRIG como saída.
gpio_init(ECHO_PIN); // Inicializa o pino ECHO.
gpio_set_dir(ECHO_PIN, GPIO_IN); // Configura o pino ECHO como entrada.
gpio_init(BUZZER_PIN); // Inicializa o pino do buzzer.
gpio_set_dir(BUZZER_PIN, GPIO_OUT); // Configura o pino do buzzer como saída.
gpio_init(LED_RED_PIN); // Inicializa o pino do LED vermelho.
gpio_set_dir(LED_RED_PIN, GPIO_OUT);// Configura o pino do LED vermelho como saída.
gpio_init(LED_GREEN_PIN); // Inicializa o pino do LED verde.
gpio_set_dir(LED_GREEN_PIN, GPIO_OUT); // Configura o pino do LED verde como saída.
gpio_init(LED_BLUE_PIN); // Inicializa o pino do LED azul.
gpio_set_dir(LED_BLUE_PIN, GPIO_OUT); // Configura o pino do LED azul como saída.
adc_init(); // Inicializa o ADC (Conversor Analógico-Digital).
adc_gpio_init(TEMP_SENSOR_PIN); // Inicializa o pino do sensor de temperatura.
// Loop principal do programa
while (1) {
// Lê os valores do sensor de distância e do sensor de temperatura.
float distance = measure_distance();
float temperature = read_temperature();
// Exibe os valores de distância e temperatura no monitor serial.
printf("Distância: %.2f cm, Temperatura: %.2f °C\n", distance, temperature);
// Verifica se a distância é maior que 135 cm (indicando que a porta está aberta).
if (distance > 135.1) { // Porta aberta
set_led_color(true, false, false); // Acende o LED vermelho.
gpio_put(BUZZER_PIN, true); // Liga o buzzer.
sleep_ms(200); // Espera 200 ms.
gpio_put(BUZZER_PIN, false); // Desliga o buzzer.
sleep_ms(300); // Espera 300ms segundos (aguarda até o próximo ciclo).
}
// Verifica se a temperatura é maior que 15°C. Caso de Falta de energia.
else if (temperature > 10) { // Temperatura alta ou congelando
set_led_color(true, false, false); // Acende o LED vermelho.
gpio_put(BUZZER_PIN, true); // Liga o buzzer.
sleep_ms(200); // Espera 200 ms.
gpio_put(BUZZER_PIN, false); // Desliga o buzzer.
sleep_ms(300); // Espera 300 ms (intervalo antes do próximo ciclo).
}
// Verifica se a temperatura é menor que 3°C.Caso de problema no motor.
else if (temperature < 3) { // Temperatura alta ou congelando
set_led_color(false, false, true); // Acende o LED Azul.
gpio_put(BUZZER_PIN, true); // Liga o buzzer.
sleep_ms(200); // Espera 200 ms.
gpio_put(BUZZER_PIN, false); // Desliga o buzzer.
sleep_ms(300); // Espera 300 ms (intervalo antes do próximo ciclo).
}
// Tudo está OK.
else { // Tudo OK
set_led_color(false, true, false); // Acende o LED verde.
sleep_ms(200); // Espera 200 ms.
set_led_color(false, false, false); // Desliga o LED.
sleep_ms(300); // Espera 300 ms (intervalo antes do próximo ciclo).
}
}
return 0; // Fim do programa.
}
LED RGB
Colocado na parede
visivel para os cooperados
controle de distancia.
Fixado na Tampa do tanque
Controle de temperatura
fixado na lateral do tanque.
BUZZER
Fixado ao lado do LED
Raspberry
PI pico W