Flutter + ESP32 = Verificador de temperatura ambiente!

Tempo de leitura: 3 minutes

Nosso projeto visa a concepção de um sistema simples de medição e leitura de temperatura, que seja aplicável de forma prática em todas as residências. O sistema permite ler a temperatura dos cômodos da casa usando um aplicativo de telefone transparente. A principal suposição do nosso sistema é sinalizar um alarme via SFM-27-11 quando a temperatura ultrapassar 30 graus.

O módulo ESP32-DevKit WiFi é responsável por processar os dados do sensor para controle de temperatura e a capacidade de enviá-los para o servidor usando uma conexão de internet WiFi e salvá-los no servidor firebase

Usando o aplicativo no telefone, você pode verificar facilmente a temperatura na sala.

Diagrama de conexão do ESP-32

Módulo de programação – Cliente Firebase ESP-32

A idéia principal é instalar uma biblioteca de suporte ao cliente firebase em nosso módulo ESP-32.

Em seguida, precisamos programar o módulo ESP-32 para poder enviar dados para o servidor firebase.

// Inclui biblioteca WiFi
#include <Arduino.h>
#if defined(ESP32) || defined(PICO_RP2040)
#include <WiFi.h>
#elif defined(ESP8266)
#include <ESP8266WiFi.h>
#endif

// Inclui a biblioteca Firebase (esta biblioteca)
#include <Firebase_ESP_Client.h>

// Definir o objeto Firebase Data
FirebaseData fbdo;

// Definir os dados FirebaseAuth para dados de autenticação
FirebaseAuth auth;

// Definir os dados FirebaseConfig para dados de configuração
FirebaseConfig config;

// Atribui o host do projeto e a chave de API
config.host = FIREBASE_HOST;

config.api_key = API_KEY;

// Atribui as credenciais de login do usuário
auth.user.email = USER_EMAIL;
auth.user.password = USER_PASSWORD;

// Inicializa a biblioteca com o Firebase authen e config.
Firebase.begin(&config, &auth);

// Opcional, defina a reconexão AP em setup()
Firebase.reconnectWiFi(true);

// Opcional, defina o número de tentativas de erro
Firebase.RTDB.setMaxRetry(&fbdo, 3);

// Opcional, defina o número de filas retomáveis por erro
Firebase.RTDB.setMaxErrorQueue(&fbdo, 30);

// Opcional, use solicitações HTTP GET e POST clássicas.
// Esta opção permite que as funções get e delete (requisições HTTP PUT e DELETE) funcionem para
// dispositivo conectado atrás do Firewall que permite apenas requisições GET e POST.
Firebase.RTDB.enableClassicRequest(&fbdo, true);

#if definido(ESP8266)
// Opcional, defina o tamanho do BearSSL WiFi para receber e transmitir buffers
// Firebase pode não suportar a fragmentação de transferência de dados, você pode precisar reservar o buffer para corresponder
// os dados a serem transportados.
fbdo.setBSSLBufferSize(1024, 1024); // tamanho mínimo é 512 bytes, tamanho máximo é 16384 bytes
#fim se


// Opcional, defina o tamanho do buffer de resposta HTTP
// Evita falta de memória para carga útil grande, mas os dados podem ser truncados e não podem determinar seu tipo.
fbdo.setResponseSize(1024); // tamanho mínimo é 1024 bytes

Na imagem anexa, podemos ver o código conectando a comunicação serial. Em seguida, tentei conectar-me ao roteador e ao cliente firebase. Se tudo correr bem, conseguimos nos comunicar com o banco de dados firebase. Todas as mensagens serão exibidas no console.

O problema que encontramos com a leitura de temperatura analógica. O ESP-32 possui pinos DIGITAIS. Então, usando a função analógica para digital (ADC) e a temperatura de referência.

// Leia LM38_Sensor1 ADC Pin
LM35_Raw_Sensor1 = analogRead(LM35_Sensor1);
// Calibre o ADC e Pege a Voltagem (Em mV)
Voltage = readADC_Cal(LM35_Raw_Sensor1);
// TempC = Voltage(mV) / 10
LM35_TempC_Sensor1 = Voltage / 10;

Usamos a função readADC_cal para substituir o valor lido do PIN-out

uin32_t readADC_Cal(int ADC_Raw)
{
    esp_adc_cal_characteristics_t adc_chars;
    
    esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100, &adc_chars);
    return(esp_adc_cal_raw_to_voltage(ADC_Raw, &adc_chars);
}

Que converte o valor apropriado para Temperatura.

Para gerenciar o buzzer, utilizamos a biblioteca EasyBuzzer, após atingir uma temperatura superior a 30 graus, o buzzer liga automaticamente, sinalizando um alarme de que a temperatura está muito alta.

if(LM35_TempC_Sensor1 > 30.0) {
   EasyBuzzer.beep(frequency, 100);
} else {
   EasyBuzzer.stopBeep();
}

Cada dado que será lido do módulo ESP-32 será salvo no Firebase Realtime DataBase.

o ler dados do servidor Implementamos um aplicativo de flutter simples

Não tenho mais o código fonte, estou tentando refazer, pois deu errado no AndroidStudio, e perdi, estou refazendo em VsCode