Plano de Estudo
Sistema de Monitoramento Ambiental com Alertas em Tempo Real
Arquitetura do Sistema
[Sensores] → [NodeMCU ESP32] → [MQTT Broker] → [InfluxDB]
↓ ↓
[Telegram Bot] [API Node.js] → [Dashboard React]
Passo a Passo Detalhado
1. Configurar o Hardware
- Conecte os sensores ao ESP32:
DHT22 → Pino D23 MQ-135 → Pino A0 (ADC) LDR → Pino A1 (ADC)
- Use um divisor de tensão para o LDR.
2. Programar o ESP32 (Arduino IDE)
- Leia os sensores e publique os dados via MQTT.
#include <WiFi.h> #include <PubSubClient.h> #include <DHT.h> // Configurações Wi-Fi e MQTT const char* SSID = "SUA_REDE"; const char* SENHA = "SENHA_REDE"; const char* MQTT_BROKER = "broker.hivemq.com"; const int MQTT_PORT = 1883; const char* TOPICO = "ambiente/sala01"; DHT dht(23, DHT22); WiFiClient espClient; PubSubClient client(espClient); void setup() { Serial.begin(115200); dht.begin(); conectarWiFi(); client.setServer(MQTT_BROKER, MQTT_PORT); } void loop() { if (!client.connected()) { reconectarMQTT(); } float temp = dht.readTemperature(); float umid = dht.readHumidity(); int qualidade_ar = analogRead(A0); int luminosidade = analogRead(A1); String payload = String(temp) + "," + String(umid) + "," + String(qualidade_ar) + "," + String(luminosidade); client.publish(TOPICO, payload.c_str()); delay(10000); // Publica a cada 10 segundos } void conectarWiFi() { /* ... */ } void reconectarMQTT() { /* ... */ }
3. Configurar o Broker MQTT e Banco de Dados
- Use Mosquitto (local) ou HiveMQ Cloud (gratuito para testes).
- Instale o InfluxDB via Docker:
docker run -p 8086:8086 -v influxdb:/var/lib/influxdb influxdb
- Crie um script Python para subscrever o tópico MQTT e salvar no InfluxDB:
from influxdb_client import InfluxDBClient import paho.mqtt.client as mqtt bucket = "ambiente" client = InfluxDBClient(url="http://localhost:8086", token="SEU_TOKEN", org="org") def on_message(client, userdata, msg): temp, umid, qualidade_ar, luminosidade = msg.payload.decode().split(',') data = f"ambiente,sensor=sala01 temperatura={temp},umidade={umid},qualidade_ar={qualidade_ar},luminosidade={luminosidade}" write_api.write(bucket=bucket, record=data) mqtt_client = mqtt.Client() mqtt_client.connect("broker.hivemq.com", 1883) mqtt_client.subscribe("ambiente/sala01") mqtt_client.on_message = on_message mqtt_client.loop_forever()
4. Desenvolver a API (Node.js)
- Crie endpoints para consultar dados históricos:
const express = require('express'); const { InfluxDB, flux } = require('@influxdata/influxdb-client'); const app = express(); const client = new InfluxDB({ url: 'http://localhost:8086', token: 'SEU_TOKEN' }); const queryApi = client.getQueryApi('org'); app.get('/dados', async (req, res) => { const query = flux`from(bucket: "ambiente") |> range(start: -1h) |> filter(fn: (r) => r._measurement == "ambiente")`; const dados = await queryApi.collectRows(query); res.json(dados); }); app.listen(3000, () => console.log('API rodando na porta 3000'));
5. Dashboard em React
- Use Chart.js para gráficos em tempo real:
import React, { useEffect, useState } from 'react'; import { Line } from 'react-chartjs-2'; const Dashboard = () => { const [dados, setDados] = useState([]); useEffect(() => { fetch('http://localhost:3000/dados') .then(res => res.json()) .then(data => setDados(data)); }, []); return ( <Line data={{ labels: dados.map(d => d._time), datasets: [{ label: 'Temperatura (°C)', data: dados.map(d => d._value), }] }} /> ); };
6. Alertas com Telegram Bot
- Crie um bot no Telegram via @BotFather.
- Use a biblioteca
node-telegram-bot-api
para enviar alertas quando os dados ultrapassarem limites:const TelegramBot = require('node-telegram-bot-api'); const bot = new TelegramBot('SEU_TOKEN', { polling: true }); // Exemplo de alerta de temperatura alta if (temp > 30) { bot.sendMessage(chatId, `ALERTA: Temperatura ${temp}°C na sala!`); }