UC00643

Internet of Things (IoT)

ESP32, MQTT, dashboards cloud

Curso profissional · 25h · Dispositivos conectados

Plano

  1. IoT — o que é e onde está
  2. Hardware: ESP32 / ESP8266
  3. WiFi + HTTP
  4. MQTT — protocolo IoT
  5. Dashboards: ThingSpeak, Adafruit IO
  6. Home Assistant
  7. Segurança IoT
  8. Projecto integrado

Bloco 1 · IoT

O que é IoT

  • Objectos físicos conectados à internet.
  • Sensores + actuadores + processamento + rede.
  • Mercado: 30B+ dispositivos em 2026.
  • Sectores: smart home, agricultura, indústria 4.0, saúde, cidades.

Exemplos: lâmpada Philips Hue, termostato Nest, contador de electricidade smart, tracker GPS de pet.

Stack IoT típico

Sensores → MCU (ESP32) → WiFi/4G → Internet → Cloud
                                                 ↓
                                              Dashboard
                                              Alertas
                                              ML

Esta UC: foco em device → cloud.

Bloco 2 · ESP32 / ESP8266

Hardware IoT principal

  • ESP8266 (€3): WiFi, simples, 1MB flash.
  • ESP32 (€8): WiFi + Bluetooth, dual-core, mais memória.
  • ESP32-S3 / C3 (€10): novas variantes.
  • Arduino Uno R4 WiFi (€30): mais lento mas Arduino-compatible.

Esta UC: ESP32 DevKit (DevKit V1 é o mais comum, US$5-10).

Setup ESP32 no Arduino IDE

  1. File → Preferences → Additional Boards URL:
    https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
  2. Tools → Boards → Boards Manager → "esp32" → install.
  3. Tools → Board → ESP32 → "ESP32 Dev Module".
  4. Tools → Port → seleccionar.

Drivers USB (CP210x ou CH340) podem ser necessários no PC.

Hello world WiFi

#include <WiFi.h>

const char* SSID = "minha-rede";
const char* PASS = "minha-pass";

void setup() {
  Serial.begin(115200);
  WiFi.begin(SSID, PASS);
  Serial.print("A conectar");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nConectado!");
  Serial.print("IP: ");
  Serial.println(WiFi.localIP());
}

void loop() {}

Bloco 3 · HTTP

HTTP GET — consumir API

#include <WiFi.h>
#include <HTTPClient.h>

void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin("http://wttr.in/Lisbon?format=%t");
    int code = http.GET();
    
    if (code > 0) {
      String body = http.getString();
      Serial.println(body);
    }
    http.end();
  }
  delay(60000);   // cada 60s
}

HTTP POST — enviar dados

http.begin("https://meu-server.pt/api/leitura");
http.addHeader("Content-Type", "application/json");

String body = "{\"temp\":";
body += temperatura;
body += "}";

int code = http.POST(body);
http.end();

Útil para enviar leituras a um backend custom.

Bloco 4 · MQTT

O que é

MQTT = Message Queue Telemetry Transport. Protocolo leve para IoT.

  • Pub/sub model (não request/response).
  • Broker central (servidor MQTT) faz routing.
  • Mensagens organizadas em topics (/casa/sala/temperatura).
  • Eficiente em rede (pequenos pacotes).
  • TLS opcional para segurança.

Brokers: Mosquitto (open source), HiveMQ, AWS IoT Core, Adafruit IO.

Conceito

Sensor   ─[publish topic=sala/temp value=21]→  Broker
                                                 ↓
                                       (encaminha para subscribers)
                                                 ↓
                                              Dashboard
                                              App móvel
                                              Outro device

ESP32 + MQTT (PubSubClient)

#include <WiFi.h>
#include <PubSubClient.h>

WiFiClient espClient;
PubSubClient mqtt(espClient);

void setup() {
  // WiFi setup...
  mqtt.setServer("broker.hivemq.com", 1883);   // broker público
}

void loop() {
  if (!mqtt.connected()) {
    mqtt.connect("esp32-client-aulify-123");
  }
  mqtt.loop();
  
  static unsigned long t = 0;
  if (millis() - t > 5000) {
    t = millis();
    float temp = analogRead(A0) * 0.1;
    char buf[10];
    dtostrf(temp, 6, 2, buf);
    mqtt.publish("aulify/sala/temp", buf);
  }
}

Subscribe

void callback(char* topic, byte* payload, unsigned int len) {
  String msg;
  for (int i = 0; i < len; i++) msg += (char)payload[i];
  
  Serial.print(topic);
  Serial.print(" → ");
  Serial.println(msg);
  
  if (String(topic) == "aulify/led" && msg == "on") {
    digitalWrite(LED_BUILTIN, HIGH);
  }
}

void setup() {
  // ...
  mqtt.setCallback(callback);
  mqtt.subscribe("aulify/led");
}

Bloco 5 · Dashboards cloud

ThingSpeak

  • MathWorks (MATLAB).
  • Gratuito até 8 canais, 3M msgs/ano.
  • HTTP ou MQTT.
  • Gráficos automáticos + alertas.

Workflow:

  1. thingspeak.com → criar canal.
  2. Channel ID + Write API Key.
  3. ESP32 envia: https://api.thingspeak.com/update?api_key=XXX&field1=21.5.
  4. Dashboard auto-actualiza.

Adafruit IO

  • Adafruit.
  • Free tier: 30 dados/min, 30 dias storage.
  • MQTT amigável.
  • Dashboards visuais customizáveis.

URL: io.adafruit.com.

Blynk

  • App móvel + cloud.
  • Construção de UI por drag-and-drop.
  • Free tier limitado.
  • Excelente para projectos com smartphone control.

Home Assistant (self-hosted)

Plataforma open source, roda em casa (Raspberry Pi). Suporta:

  • MQTT.
  • Zigbee / Z-Wave (com USB stick).
  • 2000+ integrações.

Dashboards bonitas, automations powerful. Standard de facto em smart home enthusiast.

Bloco 6 · Sleep / consumo

Por que importa

ESP32 em uso normal: ~100-200mA. Bateria 2500mAh dura ~12-25h.

Deep sleep: ~10µA. Mesma bateria dura anos.

#include "esp_sleep.h"

void deepSleepFor(int seconds) {
  esp_sleep_enable_timer_wakeup(seconds * 1000000LL);
  esp_deep_sleep_start();
}

void setup() {
  // Ler sensor
  float t = ...;
  
  // Enviar
  publicarMQTT(t);
  
  // Dormir 5 min
  deepSleepFor(300);
}

void loop() {}  // nunca chega aqui

Após sleep, ESP32 reinicia setup() (perde RAM mas mantém RTC memory).

Bloco 7 · Segurança

Riscos comuns

  • Passwords default ("admin/admin").
  • Sem encriptação (MQTT plain text).
  • Firmware velho com vulnerabilidades conhecidas.
  • Default keys partilhadas entre devices.
  • WiFi WPA-PSK simples.

Botnets como Mirai infectaram milhões de devices IoT.

Best practices

  • HTTPS / MQTTS (TLS) sempre que possível.
  • Credenciais únicas por device.
  • OTA updates (Over-The-Air) para patches.
  • VLAN dedicada para IoT na rede de casa.
  • Não expor MQTT brokers publicamente sem auth.
  • Tokens em vez de passwords (Adafruit IO, AWS).
#include <WiFiClientSecure.h>

WiFiClientSecure secureClient;
secureClient.setCACert(rootCA);   // certificado
PubSubClient mqtt(secureClient);
mqtt.setServer("io.adafruit.com", 8883);   // MQTTS port

Bloco 8 · OTA updates

Actualizar firmware sem cabo

Após primeiro upload via USB, ESP32 pode aceitar uploads via WiFi:

#include <ArduinoOTA.h>

void setup() {
  // WiFi setup...
  
  ArduinoOTA.setHostname("estacao-meteo");
  ArduinoOTA.setPassword("ota-pass");
  ArduinoOTA.begin();
}

void loop() {
  ArduinoOTA.handle();
  // ... resto da app
}

No Arduino IDE: Tools → Port → vai aparecer "estacao-meteo (Network)".

Essencial em produção (não acessas device físico após instalar).

UC00643 · resumo

  • IoT = dispositivos físicos conectados à internet.
  • ESP32/ESP8266 = WiFi + Bluetooth baratos, Arduino-compatibles.
  • HTTP para APIs REST clássicas.
  • MQTT pub/sub para IoT em escala.
  • Dashboards cloud (ThingSpeak, Adafruit IO, Blynk) para visualizar.
  • Home Assistant para self-hosting completo.
  • Deep sleep = baterias duram meses/anos.
  • Segurança: TLS, credenciais únicas, OTA updates.