#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "ss_oled.h"
#define DHT_PIN 27 // Pino de Dados // Definições do pino do DHT22
#define LED_PIN 10 // Definições do pino do led
#define SDA_PIN 16 // Define o pino 16 como o pino de dados (SDA) da comunicação I2C.
#define SCL_PIN 17 //Define o pino 17 como o pino de clock (SCL) da comunicação I2C.
#define RESET_PIN -1
int rc;
SSOLED oled;
static uint8_t ucBuffer[1024];
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
// Funções auxiliares para ler o DHT22
void delay_us(uint32_t us) {
busy_wait_us(us);
}
int dht22_read(uint8_t pin, float* temperature, float* humidity) {
uint8_t data[5] = {0};
uint8_t i, j;
gpio_init(pin); // Inicializa o pino do DHT22
gpio_set_dir(pin, GPIO_OUT);// Define o pino como saída
gpio_put(pin, 0);// Coloca o pino em nível baixo (inicia comunicação com o sensor)
delay_us(18000); // Espera 18ms para início
gpio_set_dir(pin, GPIO_IN); // Muda o pino para leitura (entrada)
delay_us(40); // Aguarda 40us para começar a leitura
if (gpio_get(pin) == 0) { // Espera o sinal de resposta do DHT22
delay_us(80); // // Aguarda 80us para o sinal do DHT
if (gpio_get(pin) == 1) {
delay_us(80); // Aguarda transição para a leitura de dados
// Lê os 40 bits de dados (5 bytes)
for (j = 0; j < 5; j++) {
data[j] = 0;
for (i = 0; i < 8; i++) {
while (gpio_get(pin) == 0) {} // Espera pela transição
delay_us(40); // Espera 40us
if (gpio_get(pin) == 1) {
data[j] |= (1 << (7 - i)); // Define o bit
}
while (gpio_get(pin) == 1) {} // Aguarda a transição
}
}
// Verifica a soma de verificação
if (data[4] == (data[0] + data[1] + data[2] + data[3]) & 0xFF) {
// Temperatura
*humidity = (float)(data[0] << 8 | data[1]) / 10; // Calcula umidade
*temperature = (float)(data[2] << 8 | data[3]) / 10; // Calcula temperatura
return 1; // Sucesso
}
}
}
return 0; // Falha na leitura
}
int main() {
stdio_init_all(); // Inicializa a comunicação serial
printf("Iniciando sensor DHT22...\n");
gpio_init(LED_PIN); // Inicializa o pino do LED (para controle de estado de alerta)
gpio_set_dir(LED_PIN, GPIO_OUT); // Define o pino do LED como saída
// Inicializa o display OLED
rc = oledInit(&oled, OLED_128x64, 0x3c, 0, 0, 1, SDA_PIN, SCL_PIN, RESET_PIN, 1000000L);
if (rc != OLED_NOT_FOUND) // Se o OLED não for encontrado, nada é feito (pode ser um ponto para falha)
{}
oledFill(&oled, 0, 1); // Preenche a tela OLED com uma cor de fundo (0: preto, 1: branco)
while (true) { // Laço infinito que ficará verificando as leituras do sensor continuamente
float temperature, humidity; // Variáveis para armazenar os dados de temperatura e umidade
// Lê os dados do sensor DHT22 (temperatura e umidade)
if (dht22_read(DHT_PIN, &temperature, &humidity)) {
printf("Temperatura: %.2f°C\n", temperature); // Exibe a temperatura no console
printf("Umidade: %.2f%%\n", humidity); // Exibe a umidade no console
// Verificação das condições ideais
if (temperature < 18) {
printf("Alerta: Temperatura abaixo do ideal! (%.2f°C)\n", temperature);
oledWriteString(&oled, 0, 0, 2, "Temp Baixa!", FONT_NORMAL, 0, 1);
gpio_put(LED_PIN, 1); // Aciona LED de alerta
}
else if (temperature > 27) {
printf("Aviso: Temperatura acima do ideal! (%.2f°C)\n", temperature);
oledWriteString(&oled, 0, 0, 2, "Temp Alta!", FONT_NORMAL, 0, 1);
gpio_put(LED_PIN, 1); // Aciona LED de alerta
}
else {
gpio_put(LED_PIN, 0); // Mantém o LED desligado se estiver normal
oledWriteString(&oled, 0, 0, 2, "Temp Normal!", FONT_NORMAL, 0, 1);
}
if (humidity < 40) {
printf("Aviso: Umidade muito baixa! (%.2f%%)\n", humidity);
oledWriteString(&oled, 0, 0, 3, "Umid. Baixa!", FONT_NORMAL, 0, 1);
gpio_put(LED_PIN, 1);
}
else if (humidity > 60) {
printf("Aviso: Umidade muito alta! (%.2f%%)\n", humidity);
oledWriteString(&oled, 0, 0, 3, "Umid. Alta!", FONT_NORMAL, 0, 1);
gpio_put(LED_PIN, 1); // Aciona LED de alerta
}
else {
gpio_put(LED_PIN, 0); // Mantém o LED desligado se estiver normal
oledWriteString(&oled, 0, 0, 3, "Umid. Normal!", FONT_NORMAL, 0, 1);
}
// Pequeno delay para evitar atualização excessiva
sleep_ms(1000);
} else {
printf("Falha na leitura do sensor DHT22\n"); // se tiver alguma falha na leitura do sensor
}
sleep_ms(2000); // Aguarda 2 segundos antes da próxima leitura
}
}