EntrarComeçar grátis
← Voltar pra Página Inicial

Exemplo ESP32 + Arduino

Código pronto pra colar no ESP32 — conecta no Wi-Fi, autentica, envia telemetria a cada 5s.

Pré-requisitos

  • Arduino IDE 2.x (ou PlatformIO)
  • Board: ESP32 Dev Module (ou similar)
  • Bibliotecas: WiFi.h (built-in), PubSubClient, ArduinoJson
  • Um device cadastrado no painel (guia) com Access Token em mãos

Código completo

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

// ===== Configuração =====
const char* WIFI_SSID     = "SUA_REDE";
const char* WIFI_PASSWORD = "SUA_SENHA";

const char* MQTT_HOST     = "lab.curtocircuito.com.br";
const uint16_t MQTT_PORT  = 1883;
const char* ACCESS_TOKEN  = "COLE_O_ACCESS_TOKEN_DO_DEVICE_AQUI";
const char* CLIENT_ID     = "esp32-sala-01";

const uint32_t PUBLISH_INTERVAL_MS = 5000;

// ===== Globals =====
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
uint32_t lastPublish = 0;

// ===== Callbacks =====
void onMqttMessage(char* topic, byte* payload, unsigned int length) {
  // Recebe RPC do painel: ex. ligar LED, atualizar config
  StaticJsonDocument<256> doc;
  if (deserializeJson(doc, payload, length)) return;

  const char* method = doc["method"];
  Serial.printf("[RPC] method=%s\n", method);

  // Exemplo: setLed
  if (strcmp(method, "setLed") == 0) {
    bool state = doc["params"]["state"];
    digitalWrite(2, state ? HIGH : LOW);

    // Responde no topic correspondente
    String reqTopic = String(topic);
    String reqId = reqTopic.substring(reqTopic.lastIndexOf('/') + 1);
    String respTopic = "v1/devices/me/rpc/response/" + reqId;
    mqttClient.publish(respTopic.c_str(), "{\"success\":true}");
  }
}

void connectWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Conectando WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.printf("\nIP: %s\n", WiFi.localIP().toString().c_str());
}

void connectMqtt() {
  mqttClient.setServer(MQTT_HOST, MQTT_PORT);
  mqttClient.setCallback(onMqttMessage);
  while (!mqttClient.connected()) {
    Serial.print("Conectando MQTT...");
    if (mqttClient.connect(CLIENT_ID, ACCESS_TOKEN, NULL)) {
      Serial.println(" ok");
      mqttClient.subscribe("v1/devices/me/rpc/request/+");

      // Publica atributo inicial (versão firmware)
      StaticJsonDocument<128> attrs;
      attrs["firmwareVersion"] = "1.0.0";
      attrs["interval"] = PUBLISH_INTERVAL_MS / 1000;
      char buf[128];
      size_t n = serializeJson(attrs, buf);
      mqttClient.publish("v1/devices/me/attributes", buf, n);
    } else {
      Serial.printf(" falhou (rc=%d), retry em 2s\n", mqttClient.state());
      delay(2000);
    }
  }
}

float readTemperature() {
  // Exemplo: leitura mock; troque pelo seu sensor (DHT22, BME280, etc.)
  return 22.0 + (random(0, 100) / 100.0) * 5.0;
}

float readHumidity() {
  return 55.0 + (random(0, 100) / 100.0) * 10.0;
}

void publishTelemetry() {
  StaticJsonDocument<128> doc;
  doc["temperature"] = readTemperature();
  doc["humidity"] = readHumidity();
  doc["uptime"] = millis() / 1000;

  char buf[128];
  size_t n = serializeJson(doc, buf);
  if (mqttClient.publish("v1/devices/me/telemetry", buf, n)) {
    Serial.printf("[MQTT] publish ok: %s\n", buf);
  } else {
    Serial.println("[MQTT] publish FAIL");
  }
}

// ===== Setup / Loop =====
void setup() {
  Serial.begin(115200);
  pinMode(2, OUTPUT);
  connectWiFi();
  connectMqtt();
  lastPublish = millis() - PUBLISH_INTERVAL_MS;
}

void loop() {
  if (!mqttClient.connected()) connectMqtt();
  mqttClient.loop();

  if (millis() - lastPublish >= PUBLISH_INTERVAL_MS) {
    lastPublish = millis();
    publishTelemetry();
  }
}

Como usar

  1. Cole o código numa nova sketch Arduino IDE
  2. Substitua WIFI_SSID, WIFI_PASSWORD, ACCESS_TOKEN pelos seus valores
  3. Selecione board ESP32, conecte via USB, faça upload
  4. Abra o Serial Monitor (115200 baud) — você vê "Conectando WiFi", "Conectando MQTT", "publish ok" a cada 5s
  5. No painel, abra o device → aba Última telemetria → deve aparecer temperature, humidity, uptime

Customizando

Sensor real (DHT22)

Instale a lib DHT sensor library (Adafruit). Substitua readTemperature() e readHumidity() pelas leituras do DHT.read().

Frequência menor (economia de bateria)

Aumente PUBLISH_INTERVAL_MS e use esp_deep_sleep_start() entre publicações. Cada deep sleep força reconexão Wi-Fi/MQTT — custa ~1-2s de uptime.

OTA (atualização remota)

Suportado via TB. Detalhes em Funcionalidades avançadas → OTA no painel. (Doc dedicada em breve.)

Troubleshooting

"Conectando MQTT... falhou (rc=-2)"

Sem Wi-Fi ou DNS. Verifique sinal e roteador.

"Conectando MQTT... falhou (rc=4)"

Bad credentials. Access Token errado.

"Conectando MQTT... falhou (rc=5)"

Not authorized. Device pode ter sido deletado ou suspenso (limite de plano).

Próximos passos