Sensor de movimento PIR HC-SR501 que liga a lâmpada inteligente Avant Neo quando você chega, mantém acesa enquanto você está no ambiente e desliga sozinha quando você sai — em tempo real, via SinricPro e Alexa.
- Detecta presença com o sensor PIR e liga a luz na hora.
- Mantém acesa enquanto houver movimento (o timer reinicia a cada detecção).
- Desliga sozinha após alguns segundos sem movimento (tempo configurável).
- Tempo real via WebSocket do SinricPro — sem cota mensal de requisições.
- Autônomo: roda em qualquer fonte 5V/USB, sem PC. Reconecta o Wi-Fi sozinho.
- Reutilizável: pinos, tempos e credenciais ficam isolados em 2 arquivos.
flowchart LR
PIR[" PIR HC-SR501"] -->|GPIO4 HIGH| ESP[" ESP32 (C3/S3)"]
ESP -->|WebSocket| SP[" SinricPro"]
SP -->|Sensor de movimento| AL[" Alexa"]
AL -->|Rotina liga/desliga| LUZ[" Luz Avant Neo"]
O ESP envia motion=detected ao detectar movimento e motion=notDetected após
LIGHT_ON_SECONDS parado. A Alexa reage a esses estados com duas Rotinas
(ligar / desligar a lâmpada).
O HC-SR501 (jumper em H, tempo no mínimo) estica qualquer gatilho —
inclusive um pico de ruído RF/térmico — num pulso HIGH de ~1,2 s. Por isso
confirmar movimento só pela presença do sinal (ou pela sua duração) deixa a luz
acender sozinha. A confirmação exige um de dois critérios, que o ruído não
satisfaz:
- Retrigger real — um
HIGHcontínuo porPIR_RETRIGGER_MS(presença de verdade segura o OUT alto por vários segundos; o ruído fica em ~1,2 s); ou - Dois pulsos na janela —
PIR_PULSES_TO_CONFIRMpulsos válidos (cada um ≥PIR_MIN_PULSE_MS) dentro dePIR_PULSE_WINDOW_MS.
Um pulso isolado de ~1,2 s é registrado como PULSO isolado e ignorado.
Um resumo periódico ([STATS]) conta ruídos × confirmações para calibrar.
| Componente | Detalhe |
|---|---|
| Placa | ESP32-C3 Super Mini (testado) · ESP32-S3 (compatível) |
| Sensor | Módulo PIR HC-SR501 |
| Lâmpada | Avant Neo (Tuya/Smart Life) já integrada à Alexa |
| Extra | Mini protoboard e jumpers |
| HC-SR501 | ESP32 | Observação |
|---|---|---|
| VCC | 5V (VBUS/VIN) | No 3V3 o sensor não dispara direito |
| GND | GND | — |
| OUT | GPIO4 | Saída já é 3,3V, segura para o GPIO |
| Ajuste | Posição | Por quê |
|---|---|---|
| Tempo (Tx) | Mínimo (anti-horário) | Quem conta o tempo é o firmware |
| Sensibilidade (Sx) | ~2/3 do curso | Pega bem sem disparo falso |
| Jumper | H (repetível) | Mantém OUT alto enquanto há movimento |
Foto do meu sensor como referência da posição real dos 2 trimpots e do jumper.
- ESP-IDF v5.5 (guia de instalação)
- arduino-esp32
3.3.10— baixado automaticamente (main/idf_component.yml) - SinricPro
4.1.0, WebSockets2.6.1, ArduinoJson7.4.2— já incluídos emcomponents/como componentes ESP-IDF (cada um com sua licença).
O core Arduino entra como componente do ESP-IDF: você usa o fluxo
idf.pynormal, mas com as APIs do Arduino (WiFi, SinricPro) por dentro.
1. Credenciais — copie o template e preencha com os seus dados:
cp main/secrets.h.example main/secrets.h#define WIFI_SSID "SEU_WIFI"
#define WIFI_PASS "SUA_SENHA"
#define APP_KEY "..." // SinricPro
#define APP_SECRET "..."
#define MOTIONSENSOR_ID "..."2. Parâmetros (opcional) — em main/app_config.h:
#define PIR_GPIO 4 // pino do sensor (mude p/ outra placa)
#define LIGHT_ON_SECONDS 30 // tempo aceso após o último movimento
#define PIR_WARMUP_SECONDS 30 // aquecimento do PIR no boot
#define PIR_RETRIGGER_MS 1800 // HIGH contínuo que confirma sozinho
#define PIR_PULSES_TO_CONFIRM 2 // nº de pulsos válidos p/ confirmar
#define PIR_MIN_PULSE_MS 200 // duração mínima de um pulso válido
#define PIR_PULSE_WINDOW_MS 10000 // janela p/ os pulsos acima3. SinricPro + Alexa
- Em sinric.pro, crie um dispositivo Motion Sensor e copie
APP_KEY,APP_SECRETe oDevice ID. - No app da Alexa, ative a skill SinricPro e faça Discover Devices.
- Crie 2 Rotinas: quando detectar movimento → ligar a Avant; quando não detectar → desligar.
# ESP32-C3
idf.py set-target esp32c3
idf.py build
idf.py -p PORTA flash monitor
# ESP32-S3
idf.py set-target esp32s3
idf.py -p PORTA flash monitorNo Windows, use o ESP-IDF PowerShell e a porta tipo
COM5. Sair do monitor:Ctrl + ].
I app: Wi-Fi OK em 1799 ms | IP: 192.168.1.104 | RSSI: -51 dBm
I app: [NUVEM] Conectado ao SinricPro!
I app: Sensor pronto. Monitorando movimento no GPIO4.
W app: PULSO isolado: 1245 ms (gap de 10745 ms desde o pulso anterior).
I app: [STATS] ultimos 60 s: 0 glitch(es), 1 pulso(s) isolado(s), 0 confirmacao(oes).
I app: Movimento CONFIRMADO (HIGH retriggerado). Enviando motion=detected (ligar)...
I app: Sem movimento por 30 s. Enviando motion=notDetected (desligar)...
O WebSocket roda sem TLS (porta 80) — definido por SINRICPRO_NOSSL em
components/SinricPro/CMakeLists.txt — porque o
WiFiClientSecure do arduino-esp32 trava o handshake TLS neste build. As mensagens
continuam assinadas por HMAC (o APP_SECRET nunca trafega e há proteção
anti-replay), então o controle continua autenticado.
- ESP32-C3 — Datasheet (PDF)
- ESP32-S3 — Datasheet (PDF)
- HC-SR501 — Pinagem e datasheet (Components101)
- arduino-esp32 · SinricPro SDK · ESP-IDF
.
├── main/
│ ├── main.cpp # lógica (setup/loop)
│ ├── app_config.h # pino e tempos
│ ├── secrets.h.example # modelo de credenciais
│ └── idf_component.yml # dependência arduino-esp32
├── components/ # SinricPro, WebSockets, ArduinoJson
├── docs/ # imagens e esquemático
├── partitions.csv # app de 3 MB
└── sdkconfig.defaults # configs (PSK, cert bundle, Arduino...)
MIT — use, modifique e compartilhe à vontade. As bibliotecas em
components/ mantêm suas licenças originais.




