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!`);
    }
    

7.4k xp

Criado em 26/01/2025

Após a data de criação, o autor ou autora do plano de estudos pode ter feito atualizações no conteúdo

O que é este plano de estudo?

Planos de estudo são sequências de cursos e outros conteúdos criados por alunos e alunas da Alura para organizar seus estudos. Siga planos que te interessem ou crie o seu próprio.

Passo a passo

  1. 1

    Conteúdo do plano