#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/adc.h"
#include "hardware/gpio.h"
// Definições de pinos para o Wokwi
#define SOIL_MOISTURE_PIN 26 // Pino ADC para potenciômetro (simula sensor de umidade)
#define RAIN_SENSOR_PIN 16 // Pino GPIO para botão (simula sensor de chuva)
#define RELAY_PIN 18 // Pino GPIO para LED (simula relé)
#define STATUS_LED_PIN 25 // Pino GP25, LED interno do Pico W para status
// Limiares e constantes
#define SOIL_MOISTURE_THRESHOLD 3000 // Limiar de umidade (0-4095 no ADC)
#define IRRIGATION_DURATION_MS 10000 // 10 segundos de irrigação (simulado)
#define CHECK_INTERVAL_MS 60000 // Verifica a cada 60 segundos
// Estados globais
static uint32_t last_check_time = 0;
static uint32_t irrigation_count = 0; // Contador de irrigações
// Função para inicializar o hardware
void init_hardware(void) {
stdio_init_all(); // Inicializa saída serial para relatórios
// Configura ADC para potenciômetro (sensor de umidade)
adc_init();
adc_gpio_init(SOIL_MOISTURE_PIN);
adc_select_input(0); // Canal ADC0
// Configura GPIO para botão (sensor de chuva, entrada com pull-down)
gpio_init(RAIN_SENSOR_PIN);
gpio_set_dir(RAIN_SENSOR_PIN, GPIO_IN);
gpio_pull_down(RAIN_SENSOR_PIN); // Pull-down para estabilidade
// Configura GPIO para LED (simula relé, saída)
gpio_init(RELAY_PIN);
gpio_set_dir(RELAY_PIN, GPIO_OUT);
gpio_put(RELAY_PIN, 0); // Desliga o LED inicialmente
// Configura LED interno para status
gpio_init(STATUS_LED_PIN);
gpio_set_dir(STATUS_LED_PIN, GPIO_OUT);
// Relatório inicial
printf("=== Sistema de Irrigação Automatizada Iniciado ===\n");
printf("Limiar de Umidade: %d (0-4095)\n", SOIL_MOISTURE_THRESHOLD);
printf("Intervalo de Verificação: %d ms\n", CHECK_INTERVAL_MS);
printf("Duração da Irrigação: %d ms\n", IRRIGATION_DURATION_MS);
}
// Função para ler a umidade do solo (via potenciômetro)
uint16_t read_soil_moisture(void) {
adc_select_input(0);
return adc_read(); // Retorna valor ADC (0-4095)
}
// Função para ler o estado do sensor de chuva (via botão)
bool read_rain_sensor(void) {
return gpio_get(RAIN_SENSOR_PIN); // Retorna 0 (sem chuva) ou 1 (com chuva)
}
// Função para controlar a irrigação (simulada com LED) e gerar relatórios
void control_irrigation(bool irrigate) {
gpio_put(RELAY_PIN, irrigate ? 1 : 0); // Liga/desliga LED
if (irrigate) {
irrigation_count++; // Incrementa contador de irrigações
printf("----------------------------------------\n");
printf("IRRIGAÇÃO ATIVADA - Relatório #%u\n", irrigation_count);
printf("Hora: %lu ms (desde inicialização)\n", to_ms_since_boot(get_absolute_time()));
printf("Umidade do Solo: %u (abaixo de %d)\n", read_soil_moisture(), SOIL_MOISTURE_THRESHOLD);
printf("Chuva Detectada: Não\n");
printf("LED (Relé) LIGADO por %d ms...\n", IRRIGATION_DURATION_MS);
sleep_ms(IRRIGATION_DURATION_MS); // Simula irrigação por 10 segundos
gpio_put(RELAY_PIN, 0); // Desliga LED após o tempo
printf("LED (Relé) DESLIGADO - Irrigação Concluída.\n");
printf("----------------------------------------\n");
} else {
printf("----------------------------------------\n");
printf("NENHUMA IRRIGAÇÃO NECESSÁRIA\n");
printf("Hora: %lu ms (desde inicialização)\n", to_ms_since_boot(get_absolute_time()));
printf("Umidade do Solo: %u (acima de %d)\n", read_soil_moisture(), SOIL_MOISTURE_THRESHOLD);
printf("Chuva Detectada: %s\n", read_rain_sensor() ? "Sim" : "Não");
printf("LED (Relé) DESLIGADO.\n");
printf("----------------------------------------\n");
}
}
int main() {
init_hardware();
// Pisca o LED interno para indicar início da simulação
for (int i = 0; i < 3; i++) {
gpio_put(STATUS_LED_PIN, 1);
sleep_ms(200);
gpio_put(STATUS_LED_PIN, 0);
sleep_ms(200);
}
while (1) {
uint32_t current_time = to_ms_since_boot(get_absolute_time());
if ((current_time - last_check_time) >= CHECK_INTERVAL_MS) {
uint16_t moisture = read_soil_moisture();
bool raining = read_rain_sensor();
// Gera relatório periódico
printf("----------------------------------------\n");
printf("RELATÓRIO PERIÓDICO - %lu ms\n", current_time);
printf("Umidade do Solo: %u\n", moisture);
printf("Chuva Detectada: %s\n", raining ? "Sim" : "Não");
printf("Estado do Relé: %s\n", gpio_get(RELAY_PIN) ? "LIGADO" : "DESLIGADO");
printf("Total de Irrigações: %u\n", irrigation_count);
printf("----------------------------------------\n");
if (moisture < SOIL_MOISTURE_THRESHOLD && !raining) {
control_irrigation(true);
} else {
control_irrigation(false);
}
last_check_time = current_time;
}
// Pequeno delay para evitar sobrecarga do processador na simulação
sleep_ms(10);
}
return 0;
}3.3V
GND
GP26 – ADC0
Sensor de Umidade
Sensor de Chuva
3.3V
GP16 – GPIO
R1 – 220Ω
GP18 – GPIO
GND
R1 – 10kΩ
Relê