Contador de Pessoas com ESP32 e Sensor VL53L5CX integrado ao Home Assistant
AUTOMAÇÃO

Contador de Pessoas com ESP32 e Sensor VL53L5CX integrado ao Home Assistant

Jun 2026 ASN Web 5 acessos

Esse projeto permite detectar entrada e saída de pessoas em um ambiente, podendo ser usado para automações como:


Materiais necessários


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:

O valor do contador é enviado diretamente para o Home Assistant via REST API.


Ligação do sensor VL53L5CX no ESP32

Sensor VL53L5CXESP32
GNDGND
3V3V3
SDAGPIO21
SCLGPIO22
LIGAÇÃO DOS PINOS

O pino INT não é necessário neste projeto.


Instalar bibliotecas no Arduino IDE

No Arduino IDE instale as seguintes bibliotecas:


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:


Autor

Projeto desenvolvido por ASN Web

Especialista em automação residencial com Home Assistant e Inteligência Artificial.

Compartilhar