Contador de Pessoas com ESP32 e Sensor VL53L5CX integrado ao Home Assistant
Neste tutorial vamos criar um contador de pessoas inteligente utilizando um ESP32 e o sensor de distância VL53L5CX, integrando diretamente ao Home Assistant via API REST.
Esse projeto permite detectar entrada e saída de pessoas em um ambiente, podendo ser usado para automações como:
- Acender luz automaticamente quando alguém entra
- Apagar luz quando o ambiente fica vazio
- Monitorar ocupação de salas
- Automação inteligente de climatização
Materiais necessários
- ESP32 DevKit (ESP32-WROOM-32) INSTALAR O PROGRAMA NO PC PRA SUBIR O CÓDIGO
- Sensor ToF VL53L5CX (grid 8×8 ou 4×4)
- Jumpers
- Fonte USB 5V
- Home Assistant funcionando na rede
Como funciona o projeto
O sensor VL53L5CX possui uma matriz de medição de distância (grid), que permite detectar a posição de objetos no espaço.
O algoritmo analisa o centro da pessoa detectada e identifica o movimento:
- Movimento esquerda → direita = pessoa entrou
- Movimento direita → esquerda = pessoa saiu
O valor do contador é enviado diretamente para o Home Assistant via REST API.
Ligação do sensor VL53L5CX no ESP32
| Sensor VL53L5CX | ESP32 |
|---|---|
| GND | GND |
| 3V | 3V3 |
| SDA | GPIO21 |
| SCL | GPIO22 |
O pino INT não é necessário neste projeto.
Instalar bibliotecas no Arduino IDE
No Arduino IDE instale as seguintes bibliotecas:
- SparkFun VL53L5CX
- HTTPClient
- WiFi
Código completo do ESP32
#include <WiFi.h>
#include <HTTPClient.h>
#include <Wire.h>
#include <SparkFun_VL53L5CX_Library.h>
SparkFun_VL53L5CX sensor;
// WIFI
const char* ssid = “NOME REDE WIFI DA CASA”;
const char* password = “SENHA WIFI”;
// HOME ASSISTANT
const char* ha_url = “http://IP DO SEU HOME ASSISTANT:8123/api/states/sensor.people_count”;
const char* ha_token = “eyJh……………..SEU TOKEN, CRIE EM USUÁRIO NOVO TOKEN LONGO”;
// CONFIG SENSOR
const int detectionDistance = 700;
// CONTADOR
int people = 0;
// CONTROLE
unsigned long clearTimer = 0;
unsigned long lastCountTime = 0;
// ESTADOS
enum State {
IDLE,
SAW_LEFT,
SAW_RIGHT,
WAIT_CLEAR
};
State state = IDLE;
// ================= WIFI =================
void connectWiFi() {
WiFi.begin(ssid, password);
Serial.print(“Conectando WiFi”);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(“.”);
}
Serial.println(” OK”);
Serial.print(“IP: “);
Serial.println(WiFi.localIP());
}
// ================= ENVIO HA =================
void sendToHA() {
HTTPClient http;
http.begin(ha_url);
http.addHeader(“Authorization”, String(“Bearer “) + ha_token);
http.addHeader(“Content-Type”, “application/json”);
String payload = “{\”state\”: \”” + String(people) + “\”}”;
int httpCode = http.POST(payload);
Serial.print(“HTTP CODE: “);
Serial.println(httpCode);
http.end();
}
// ================= SETUP =================
void setup() {
Serial.begin(115200);
connectWiFi();
Wire.begin(21,22);
Wire.setClock(400000);
Serial.println(“Inicializando VL53L5CX”);
if(!sensor.begin()){
Serial.println(“Sensor não encontrado”);
while(1);
}
sensor.setResolution(4*4);
sensor.setRangingFrequency(5);
sensor.startRanging();
Serial.println(“Sensor pronto”);
}
// ================= LOOP =================
void loop(){
if(!sensor.isDataReady()) return;
VL53L5CX_ResultsData data;
sensor.getRangingData(&data);
int left = 0;
int right = 0;
for(int i=0;i<16;i++){
uint16_t d = data.distance_mm[i];
if(d > 80 && d < detectionDistance){
int col = i % 4;
if(col <=1) left++;
if(col >=2) right++;
}
}
bool leftDetected = left >=4;
bool rightDetected = right >=4;
switch(state){
case IDLE:
if(leftDetected && !rightDetected){
state = SAW_LEFT;
}
else if(rightDetected && !leftDetected){
state = SAW_RIGHT;
}
break;
case SAW_LEFT:
if(rightDetected){
if(millis() – lastCountTime > 2000){
people++;
Serial.print(“ENTROU | Total: “);
Serial.println(people);
sendToHA();
lastCountTime = millis();
}
state = WAIT_CLEAR;
clearTimer = millis();
}
break;
case SAW_RIGHT:
if(leftDetected){
if(millis() – lastCountTime > 2000){
if(people > 0) people–;
Serial.print(“SAIU | Total: “);
Serial.println(people);
sendToHA();
lastCountTime = millis();
}
state = WAIT_CLEAR;
clearTimer = millis();
}
break;
case WAIT_CLEAR:
if(!leftDetected && !rightDetected){
state = IDLE;
}
// destrava automaticamente se ficar preso
if(millis() – clearTimer > 2000){
state = IDLE;
}
break;
}
}
Criar o sensor no Home Assistant
No Home Assistant você pode criar o sensor via template, FILE EDITOR OU VIA DASHBOARD:
template:
- sensor:
- name: people_count
state: 0
Card para mostrar o contador
Para exibir o contador no dashboard do Home Assistant use um card:
type: entity
entity: sensor.people_count
name: Pessoas no ambiente
Automação exemplo
Acender luz quando houver pessoas:
alias: Luz automática sala
trigger:
- platform: numeric_state
entity_id: sensor.people_count
above: 0
action:
- service: light.turn_on
target:
entity_id: light.sala
Conclusão
Com este projeto você pode criar um sistema de detecção de ocupação muito mais preciso que sensores PIR.
O sensor VL53L5CX permite identificar direção e presença com grande precisão, sendo ideal para:
- Automação residencial avançada
- Controle de iluminação inteligente
- Monitoramento de ocupação
- Projetos de IoT
Autor
Projeto desenvolvido por ASN Web
Especialista em automação residencial com Home Assistant e Inteligência Artificial.
