Início da firmware no núcleo¶
Nesta página, você cria um projeto de firmware, coloca o ESP32 no estado Online no portal e verifica que a parte de rede funciona. Sensores e lógica de aquecimento serão adicionados nos próximos passos.
A abordagem é construída na fachada iDryer::Link. Você descreve o dispositivo com uma estrutura iDryer::Config, chama link.begin() e link.loop() — o núcleo cuida de toda a conexão de rede sozinho.
1. Prepare as ferramentas¶
Você vai precisar:
- VS Code com extensão PlatformIO;
- Cabo USB;
- Rede Wi-Fi
2.4 GHz(ESP32 não funciona com redes apenas5 GHz).
O que é firmware do controlador e como ele entra na placa — Firmware do controlador.
2. Crie um projeto¶
No PlatformIO, um projeto é uma pasta com estrutura fixa. Crie uma pasta de projeto (por exemplo my-cabinet) e abra-a em VS Code. Dentro devem haver esses arquivos:
my-cabinet/
├── platformio.ini # configurações de build (preencheremos na etapa 4)
├── include/
│ └── secrets.h # login e senha Wi-Fi (etapa 3)
├── lib/
│ └── idryer-core/ # biblioteca de núcleo (symlink ou cópia)
└── src/
└── main.cpp # código do dispositivo: Config + setup() + loop()
Todos os fragmentos de código abaixo vão para esses arquivos — cada etapa indica onde. Crie as pastas include/, lib/ e src/ manualmente, se não existirem.
Coloque a biblioteca idryer-core em lib/ — PlatformIO encontra bibliotecas lá automaticamente. A forma mais fácil é fazer um symlink para a biblioteca baixada:
Isso também é necessário para a geração de menu (capítulo 6) — o hook procura o gerador dentro de lib/idryer-core/.
3. Crie secrets.h¶
Copie o exemplo secrets.h.example da biblioteca para include/secrets.h do seu projeto e especifique os dados da sua rede:
Adicione include/secrets.h ao .gitignore para que a senha não vá para o repositório.
4. Configure platformio.ini¶
Preencha platformio.ini na raiz do projeto:
[env:cabinet]
platform = espressif32
framework = arduino
board = esp32-c3-devkitm-1
lib_deps =
bblanchon/ArduinoJson @ ^6.21.0
knolleary/PubSubClient
densaugeo/base64 @ ^1.4.0
links2004/WebSockets @ ^2.4.0
https://github.com/jnthas/Improv-WiFi-Library.git
build_flags =
-DIDRYER_API_BASE='"https://portal.idryer.org/api"'
-DMQTT_BROKER='"mqtt.idryer.org"'
-DMQTT_PORT=8883
-DMQTT_USE_TLS=1
Substitua board pela sua placa (por exemplo, esp32-s3-devkitc-1). Você não precisa especificar idryer-core em lib_deps — ela está em lib/ (etapa 2).
Por que todas essas dependências
ArduinoJson, PubSubClient, base64, WebSockets e Improv-WiFi-Library são necessários para a própria biblioteca idryer-core (MQTT, acesso WebSocket em LAN, Wi-Fi provisioning). Sem qualquer um deles a build cai com erro como ... .h: No such file. Os sinalizadores MQTT_BROKER e MQTT_PORT também são obrigatórios — sem eles o núcleo não compila ('MQTT_BROKER' was not declared).
5. Descreva o dispositivo em Config¶
A seguir tudo acontece em um arquivo — src/main.cpp. Abra-o e escreva o código desta e das próximas etapas.
iDryer::Config é o passaporte do dispositivo. Os sinalizadores has* dizem ao portal o que o dispositivo tem e determinam quais campos de telemetria são publicados.
Para o gabinete aquecido no topo de src/main.cpp
#include <iDryer.h>
static const iDryer::Config CFG = {
.deviceType = iDryer::DeviceType::Dryer,
.unitsCount = 1,
// Periféricos:
.hasHeater = true, // aquecedor controlado
.hasFan = true, // ventilador
.hasAirTemp = true, // temperatura do ar (SHT31)
.hasAirHumidity = true, // umidade do ar (SHT31)
.hasHeaterTemp = true, // temperatura do aquecedor (termistor)
// Períodos de autopublicação:
.telemetryPeriodMs = 5000,
.statusPeriodMs = 10000,
// Identificação no portal:
.hardwareVersion = "1.0",
.firmwareVersion = "0.1.0",
.model = "DIY Storage Cabinet",
};
static iDryer::Link s_link(CFG);
Sinalizadores has* — é um contrato com o portal
Um campo de telemetria cujo sinalizador correspondente é false não é publicado. Por exemplo, sem hasAirHumidity = true, a umidade não vai para a nuvem, mesmo que você escreva no código. Inclua apenas o que fisicamente existe no dispositivo.
Lista de componentes e sinalizadores — Composição do sistema.
6. Função main mínima¶
No mesmo arquivo após o bloco Config, adicione as funções setup() e loop(). Para o primeiro lançamento é suficiente iniciar o link e rodá-lo em loop():
Isto é suficiente para o dispositivo se conectar ao Wi-Fi e ir para o portal. Sensores serão adicionados na etapa Sensores.
Completo src/main.cpp após este capítulo¶
Pegue ambos os blocos acima em um arquivo — este é todo o src/main.cpp nesta etapa:
#include <iDryer.h>
static const iDryer::Config CFG = {
.deviceType = iDryer::DeviceType::Dryer,
.unitsCount = 1,
.hasHeater = true,
.hasFan = true,
.hasAirTemp = true,
.hasAirHumidity = true,
.hasHeaterTemp = true,
.telemetryPeriodMs = 5000,
.statusPeriodMs = 10000,
.hardwareVersion = "1.0",
.firmwareVersion = "0.1.0",
.model = "DIY Storage Cabinet",
};
static iDryer::Link s_link(CFG);
void setup() {
Serial.begin(115200);
s_link.begin();
}
void loop() {
s_link.loop();
}
O capítulo anterior mostra o que adicionar e o src/main.cpp completo após as mudanças, para que você sempre veja o quadro geral, não fragmentos dispersos.
7. Flash¶
8. Abra Serial Monitor¶
Sequência esperada no log:
[CLOUD] Connecting to WiFi...
[CLOUD] WiFi connected, IP: 192.168.1.42
[CLOUD] Provisioning device...
[CLOUD] PIN: 1234567 (expires in 600s)
Se o dispositivo parou na linha PIN: ... — é normal. Vá para vinculação.
9. Vincule o dispositivo ao portal¶
- Abra portal.idryer.org.
- Vá para a seção Add device.
- Digite o PIN do Serial Monitor.
Após vinculação o dispositivo muda para o status Online. No log aparece:
Verificação de resultado¶
Nesta etapa o dispositivo deve estar Online no portal. Dados de sensores ainda não há — é esperado. Se o dispositivo não se conecta:
- verifique que a rede é
2.4 GHze a senha emsecrets.hestá correta; - verifique alimentação ESP32 (quedas durante boot Wi-Fi são causa comum de reinicializações);
- veja Erros de potência e Erros de controlador.
O que vem a seguir¶
A parte de rede funciona. Vá para Sensores: vamos conectar SHT31 e termistor e ver seus dados no portal.