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
- Cole o código numa nova sketch Arduino IDE
- Substitua
WIFI_SSID,WIFI_PASSWORD,ACCESS_TOKENpelos seus valores - Selecione board ESP32, conecte via USB, faça upload
- Abra o Serial Monitor (115200 baud) — você vê "Conectando WiFi", "Conectando MQTT", "publish ok" a cada 5s
- 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
- Crie um dashboard pra visualizar a telemetria
- Configure alarmes — receba alerta quando temp > X