Criando um sensor de ocupação com um ESP32 de US$ 5 e um banco de dados serverless
(matthew.science)- Quando o contrato com a Bluefox, que fornecia dados de lotação do restaurante universitário, acabou, foi criado um dispositivo para medir diretamente a tendência de ocupação no campus contando os aparelhos visíveis em pacotes de anúncio BLE
- Nos testes com notebook, em espaços pequenos, a quantidade de dispositivos BLE acompanhou rapidamente a lotação real, e em restaurantes maiores também correspondeu bem às mudanças de tendência nos horários de deslocamento antes e depois das aulas
- O Raspberry Pi Zero W acabou se mostrando difícil de usar como dispositivo de implantação por causa de Bluetooth no Linux, DBus, compilação cruzada e configuração de Wi-Fi headless, então a direção mudou para um ESP32 mais simples
- Placas ESP32-WROOM baratas ficaram instáveis por problemas de memória perto de 250 a 400 dispositivos, mas as Seeed Studio XIAO ESP32C3/S3 funcionaram de forma estável por longos períodos e aguentaram detectar até cerca de 1000 dispositivos
- A configuração final faz o ESP32 escanear a quantidade de dispositivos BLE e enviar os dados para Cloudflare Functions e D1, com visualização e previsão em Grafana e NeuralProphet, embora ainda faltem calibração de precisão e validação de privacidade
Os dados de lotação do restaurante universitário que desapareceram
- No primeiro ano da faculdade, a operadora do restaurante universitário era a Sodexo, que tinha contrato com a Bluefox e usava sensores de ocupação para mostrar quantas pessoas havia no restaurante
- Segundo materiais obtidos por meio de um pedido via FOIA, os dispositivos da Bluefox funcionavam contando os endereços MAC de smartphones em pacotes de anúncio Bluetooth
- Ao conectar as chamadas de API ao Grafana, era possível ver a lotação do restaurante em gráficos em tempo real e usar isso para evitar horários mais cheios
- Depois, a operadora do restaurante mudou para a Aramark, e como a Aramark não tinha um contrato para contagem de ocupação como o da Bluefox, os dados existentes desapareceram
Usando beacons BLE como indicador substituto do número de pessoas
- O ponto central do projeto era verificar quão bem a quantidade de beacons Bluetooth poderia servir como substituto do número real de pessoas e do tempo de permanência
- Algumas pessoas carregam vários dispositivos, como fones de ouvido e smartwatches
- Algumas pessoas não carregam dispositivos ou podem deixar o Bluetooth do celular desligado
- Para estimar o tempo de permanência, uma variável era saber se dava para usar a rotatividade (churn) dos endereços MAC únicos e qual seria o impacto da aleatorização de endereços MAC por fabricantes como Android e Apple
- Para enviar os dados a um servidor central, Wi-Fi era a escolha mais natural, mas nem todos os locais tinham um Wi-Fi fácil de usar
- LoRa também poderia ser uma opção dependendo da distribuição dos beacons, mas o alcance real varia muito conforme o ganho da antena e o local de instalação
- No armazenamento de dados, também entravam em consideração o uso ou não de um banco de dados de séries temporais e se, em previsões de tendência de longo prazo, seria possível excluir eventos especiais como fim de semana de homecoming ou semana de provas finais
Validação inicial com notebook
- O primeiro experimento foi um código simples que escaneava com o adaptador Bluetooth do notebook por
xsegundos, repetia a cadaysegundos e armazenava os dados em um banco SQLite - Foram coletados dados esperando com o notebook em vários lugares, como o restaurante universitário, Chick-Fil-A e Starbucks
- No Starbucks, que era um espaço pequeno e único, a contagem de dispositivos foi bastante precisa e pelo menos refletia rapidamente a tendência de ocupação
- Quando alguém entrava, o gráfico subia rapidamente
- Em espaços grandes como o restaurante universitário, não era possível contar diretamente o total de pessoas e também não estava claro o alcance do adaptador Bluetooth, mas o aumento de pessoas indo comer após o fim das aulas bateu bem com o aumento de beacons detectados
Por que a abordagem com Raspberry Pi Zero W travou
- O primeiro dispositivo pensado para implantação de longo prazo foi o Raspberry Pi Zero W, por ser pequeno, barato e ter Wi-Fi e Bluetooth
- O código foi reescrito em Rust para tentar lidar com situações como reinicialização, ausência de rede e perda do adaptador
- O processo de lidar com Bluetooth no Linux em um ambiente headless foi muito mais complexo do que o esperado
- Os bindings de DBus exigiam configuração relacionada a compilação cruzada
- Nem mesmo o Cross resolveu os problemas
- Depois de várias flags de compilador, perda de trabalho em Makefile e configuração de bridge com QEMU, o binário finalmente rodou no Pi
- Foram implementados conexão Wi-Fi, instalação das bibliotecas necessárias na inicialização, registro do executável como serviço e atualização automática, mas depois do boot real tudo ainda falhava
- Essa abordagem acabava arrastando um kernel Linux inteiro e muitas partes móveis, mesmo precisando apenas de Wi-Fi e Bluetooth confiáveis
Mudança para o ESP32
- No papel, o ESP32 reunia Wi-Fi, Bluetooth, baixo consumo de energia, baixo preço e tamanho pequeno
- Foi comprada na Amazon uma ESP32-WROOM-32 aleatória com display OLED
- A ideia era exibir dados em tempo real na tela
- Como o ecossistema Rust para ESP32 ainda não parecia maduro o suficiente, o código de coleta de dados foi reescrito em C++
- O OLED foi colocado para funcionar com a configuração
SSD1306Wire display(0x3c, 5, 4); - Foi pedido ao TI do campus o whitelist do endereço MAC, e Cloudflare Functions com banco de dados D1 foram usados como backend de coleta de dados
O problema de memória revelado na primeira implantação
- Um dispositivo de coleta foi instalado na biblioteca do campus, e foi confirmado pelo notebook que os dados estavam chegando
- Depois apareceram resultados estranhos, como se todas as pessoas tivessem saído da biblioteca, e a causa era a baixa especificação da placa ESP32 comprada aleatoriamente
- O dispositivo travava perto de 250 dispositivos
- No começo, suspeitou-se que o resultado estivesse sendo armazenado em um número de 1 byte, travando perto de 255
- Conferindo com
Serial.print, ele travava aleatoriamente em faixas parecidas, como 249 e 265, então não era apenas overflow de inteiro
- Durante o escaneamento, os resultados eram mantidos por inteiro em uma estrutura de dados, acumulando muita informação como intensidade de sinal, serviços anunciados e ID do fabricante, o que lotava a pequena RAM
- Na prática, o único valor necessário era a quantidade de dispositivos únicos, então manter a estrutura completa dos resultados era excessivo
Hash set feito à mão e seus limites
- Como solução, foi criada manualmente uma pequena estrutura de hash set em C++
- Em cada callback, o endereço MAC era inserido no hash set e a estrutura de resultados interna era esvaziada para liberar memória
- Isso teve a desvantagem de fazer a estrutura interna perder os dados usados para verificar duplicatas, o que fazia o callback disparar para cada pacote de anúncio BLE
- A verificação de duplicata ainda era feita no
addToSet - Mas callbacks duplicados aconteciam centenas de vezes, e a estrutura de resultados seguia sendo alocada e liberada, gerando churn no heap
- A verificação de duplicata ainda era feita no
- Mesmo assim, pareceu melhor verificar com frequência um hashmap com no máximo menos de 1000 itens do que continuar limitado perto de 250 pessoas
Escolhendo uma placa ESP32 mais estável
- Durante o recesso de outono, foi tentado um teste de longa duração de 5 dias, mas houve novo travamento perto de 400 dispositivos
- O problema aparecia após cerca de 3 horas de uso, e mesmo com reinicializações periódicas o escaneamento passava a retornar imediatamente apenas 0 dispositivos
- Várias placas foram testadas
- Seeed Studio XIAO ESP32S3/C3
- WaveShare ESP32S3 Zero
- ESP32-WROOM sem marca com OLED
- Orange Pi Zero W
- Raspberry Pi Zero W
- As únicas placas que funcionaram com estabilidade no longo prazo foram a XIAO ESP32C3/S3, e ambas tiveram desempenho aceitável
- A escolha final foi a XIAO ESP32C3
- A base em RISC-V agradou
- Era mais barata
- Ao trocar para uma placa de fabricante melhor, o SRAM aumentou, e foi possível voltar a usar a estrutura padrão de resultados em vez do hashmap feito à mão, reduzindo os travamentos
- Até cerca de 1000 dispositivos detectados não surgiram sinais de lentidão, e talvez também tenha havido redução no churn de heap e callbacks
Padrões de deslocamento vistos da janela do dormitório
- Depois de encontrar um dispositivo estável, ele foi levado para a janela do quarto no dormitório para facilitar repetições de implantação
- Nos dados de um dia, apareciam picos nos horários de troca de aula
- Mesmo estando no dormitório, o dispositivo não media principalmente apenas os moradores do dormitório
- Se medisse só os moradores, o esperado seria um pico máximo no início da manhã e depois queda ao longo do dia
- Por estar apontado para fora da janela, ele detectava principalmente estudantes se deslocando para dois prédios acadêmicos próximos
- O pico por volta de 7:50 coincidia com o período imediatamente anterior às aulas das 8h em Ewell Hall e Washington Hall
- Os picos de 8:50, 9:50 e 10:50 correspondiam, respectivamente, aos deslocamentos para as aulas das 9h, 10h e 11h
- O dispositivo pareceu adequado para acompanhar tendências de deslocamento de estudantes ao redor, e o alcance da antena pareceu chegar a cerca de 160 ft até Washington Hall e cerca de 100 ft até Ewell
- A altitude do 3º andar também parece ter ajudado no alcance de detecção
Previsão e tarefas de validação que ainda faltam
- Os dados coletados tinham muitas tendências horárias, diárias e semanais, então combinavam bem com previsão de séries temporais usando algo como o NeuralProphet
- Depois de adicionar a função de previsão, os resultados já previam bem as tendências diárias
- A expectativa era que tendências de longo prazo em escala semanal, mensal e sazonal convergissem quando houvesse dados suficientes
- Ainda restam muitas perguntas sem resposta
- Quão bem a quantidade de beacons BLE representa a população real
- Se seria possível criar um fator de correção, como
xbeacons equivalendo a aproximadamente0.7xpessoas, por causa de quem carrega vários dispositivos - Se, em um prédio de ciência da computação, o número de dispositivos seria alto em relação ao número de pessoas, ou baixo porque muita gente deixa o Bluetooth desligado
- Se prédios de funcionários teriam uma proporção menor por as pessoas carregarem menos dispositivos do que estudantes
- Se restaurantes teriam uma proporção menor do que salas de aula, por haver menos uso simultâneo de notebook, iPad e outros aparelhos
- Também restam formas de melhorar a precisão
- Definir um RSSI mínimo para excluir sinais fracos
- Filtrar para contar apenas IDs de fabricante da Apple e de fabricantes Android comuns
- O fato de Apple Watch, AirPods e MacBook ainda entrarem na contagem
- Se o método atual, que rastreia apenas a contagem bruta de beacons e não os endereços MAC reais, precisa de ruído adicional
- Se identificar um único usuário apenas pelo número de dispositivos é algo realisticamente possível
- A escolha da duração do escaneamento, já que se for curta demais pode não encontrar centenas de dispositivos, e se for longa demais pode contar dispositivos que já foram embora
- Um tempo de escaneamento dinâmico que termine quando não houver mudanças por certo período
Formas possíveis de implantação
- Há planos para validar os dados em locais onde a população real pode ser obtida com facilidade
- Academia com registro de entrada
- Restaurante universitário ou lugares como Starbucks com entradas limitadas
- Há discussões com professores sobre usos em comitês universitários ou possibilidades de pesquisa acadêmica
- Também está sendo considerada a venda para lojas físicas que queiram medir tendências de ocupação
- A configuração de uma unidade de implantação é relativamente bem empacotada
- Configurar o Wi-Fi nas definições
- Se houver portal, a rede faz whitelist do endereço MAC
- Em redes abertas ou com senha, a conexão é feita na inicialização
- Alterar machine ID e site ID nas definições
- Ligar o dispositivo em uma tomada central ou conveniente
- Configurar no backend um dashboard do Grafana para leitura de cada dispositivo
- Configurar um dashboard do Grafana separado para leitura das tendências previstas
1 comentários
Comentários do Hacker News
Transformei essa técnica em um negócio de verdade (occuspace.io) e já tentei responder à maior parte das perguntas levantadas
A quantidade de beacons BLE tem correlação muito alta com o número de pessoas presentes, mas como o coeficiente de correlação varia bastante entre restaurante, sala de aula e cada andar de biblioteca, é melhor usar também características mais complexas
Não considero preciso estimar o tempo de permanência pelo tempo em que um beacon BLE fica visível, porque o MAC Bluetooth é randomizado a cada 8 a 20 minutos dependendo do fabricante
Excluir RSSI fraco e contar apenas dispositivos próximos é uma boa ideia, mas o limiar muda conforme o tipo de espaço e a posição de instalação do sensor
Se o requisito original era “evitar lotação no restaurante”, talvez já baste saber aproximadamente se está mais vazio ou mais cheio
No negócio, fico curioso se os clientes realmente esperam alta precisão, se todos esperam isso ou só uma parte deles
Mesmo com a randomização dos endereços MAC, talvez não dê para identificar o tipo de dispositivo e contar só celulares, excluindo fones de ouvido e afins?
Parece que seria mais difícil porque o sinal se espalha mais longe, e estou tocando uma startup que precisa rastrear ocupação de quadras de tênis
Talvez dê para instalar dispositivos Bluetooth nos cantos do espaço externo e usar a intensidade do sinal deles como limiar
Talvez dê para fazer mais coisas rastreando e conectando Wi‑Fi, MACs de Wi‑Fi e informações de vídeo
Vale a pena conhecê-la como um dos concorrentes em potencial
Em um prédio universitário de STEM, pode haver mais de 3 dispositivos Bluetooth por pessoa, enquanto em outros lugares pode haver menos de 1
Excelente texto
Depois de testar Seeed Studio XIAO ESP32S3/C3, WaveShare ESP32S3 Zero, um ESP32-WROOM sem marca com OLED, Orange Pi Zero W e Raspberry Pi Zero W, foi dito que os únicos que funcionaram de forma estável no longo prazo, atualmente por cerca de um mês, foram os XIAO ESP32C3/S3, mas suspeito que possa ser problema de alimentação
A linha ESP32 pode ser sensível a variações de tensão durante transmissão, então recomendo fortemente adicionar um capacitor grande no trilho de alimentação
Tanto RPi quanto ESP podem ser chatos dependendo da fonte, do cabo e do comprimento do cabo, e o cartão SD do RPi é propenso a falhar com cortes repentinos de energia
Ainda assim, todos deveriam aguentar mais de um mês, e meus Pi e ESP já ficaram funcionando por vários meses
Tenho curiosidade sobre o resultado de colocar capacitores maiores nos outros ESP32 ou Pi
O ESP32 é usado de forma muito ampla, então o fato de o primeiro ESP32 de fabricante desconhecido que comprei não ter durado muito provavelmente foi a causa
Quando troquei por um produto de fabricante decente, o problema se resolveu e o ESP32 passou a funcionar bem
O Raspberry Pi na prática quase não funcionou, porque eu estava tornando complicada demais uma tarefa que só precisava fazer varredura Bluetooth e chamadas HTTP, e tentando administrar coisas demais
Como eu forneci 5V 1A direto da tomada para USB-C, não acho que tenha sido problema de alimentação, mas o Xiao ESP32-S3 também teve problemas intermitentes e, se bem me lembro, o núcleo Xtensa consome mais energia que o ESP32-C3 baseado em RISC-V, então vale verificar
De vez em quando eu atualizo com ESPHome, mas não houve nada de especial
Alguns fazem várias tarefas ao mesmo tempo; por exemplo, um deles é o proxy Bluetooth do home office e também controla uma fita de LEDs instalada ao longo do painel de parede Skadis
Uso produtos de marca aleatória comprados da empresa “AZDelivery” na Amazon, sem nenhum tratamento especial
Coloco em caixas impressas em 3D e normalmente deixo conectados a adaptadores de pelo menos 5V/1A com cabos curtos, em geral com menos de 30 cm
Só salva no disco quando você executa
lbu commit -d, e por padrão inicializa em algo parecido com um tempfsComo é um projeto de um universitário dentro da universidade e envolve algum nível de rastreamento de pessoas, é uma boa oportunidade para perguntar ao professor quais procedimentos de pesquisa com seres humanos seriam necessários caso isso seja pesquisa
Pode ser mais fácil perguntar ao professor do que ao IRB da universidade
O IRB pode se recusar a conversar alegando falta de jurisdição, ou pode reagir mal por você não ter falado antes
As políticas de privacidade e segurança da TI do campus também podem se aplicar
Sites, apps e dispositivos IoT comuns invadem muito mais a vida das pessoas, mas universidades às vezes têm o objetivo de tentar ser melhores do que o mundo lá fora
Não coloquei isso no texto porque talvez não dê certo
Os beacons estão sendo transmitidos, e provavelmente estão sendo coletados sem consentimento em quase todos os lugares a que vamos
Minha casa fica em um cruzamento, então muitos dispositivos Bluetooth se acumulam por perto com frequência, e por pura diversão já pensei em instalar um rastreador BLE para ver o que eu conseguiria coletar e o que daria para descobrir a partir dos dados
Por exemplo, tenho certeza de que existe correlação entre a piora da qualidade do ar dentro de casa e a chegada de dispositivos Bluetooth na região
A frase “nesses nerd snipes, não perder o embalo é fatalmente importante” foi engraçada
Meu cérebro nerd também já me convenceu várias vezes a gastar dinheiro com exatamente essa lógica
Com certeza existem períodos em que sinto mais vontade de tocar projetos e, especialmente no inverno, também faço mais projetos de eletrônica e jogo mais
Minha “temporada” de jogos também recomeçou na semana passada
A grande mudança de “o que eu quero fazer hoje?” para “o que eu estou no clima para fazer nesta temporada e tenho tempo para fazer?” tem muito a ver com envelhecer e ter filhos, mas os intervalos entre ter vontade e tempo para fazer esse tipo de projeto são tão grandes que, se eu perder o embalo, posso só voltar um ano depois ou nunca mais voltar
Tenho um projeto de eletrônica que comecei há pelo menos 10 anos, gastei um bom dinheiro nele e até hoje insisto que um dia vou terminar, então ele virou um projeto infame na família
Meu despertador é composto por um ESP32, uma matriz de LEDs bem grande, um buzzer e um sensor PIR
Ele não mostra as horas; avisa com o buzzer e piscando, clareia o quarto lentamente ou, à noite, depois de um certo tempo com todas as luzes apagadas, escurece devagar
Uma vantagem extra que descobri depois é que, mesmo sem o AP estar entre mim e o ESP, eu reflito RF o suficiente para que, só com os logs de RSSI, dê para saber não só quanto tempo fiquei na cama, mas até quando mudei de posição durante a noite
https://imgur.com/a/VixOlu5
Ao contrário do aviso, não há conteúdo sugestivo
O verde no meio é o RSSI, o amarelo embaixo é o sensor PIR, e a parte de cima mistura dados da Mi Band 3 com anotações do tempo em que eu estava na cama
Também é verdade que eu fiquei lendo notícias por muito tempo antes de dormir e antes de levantar
Fiquei curioso sobre como as pessoas organizam um projeto com ESP32 como se fosse um produto
Não estou falando de produção em massa, mas de querer transformá-lo em um dispositivo independente em vez de uma placa com um monte de fios saindo
Muitas páginas mostram só a placa nua, mas, na vida real, você precisa colocar isso em alguma embalagem
Para alguém de software como eu, é bem provável que seja preferível pagar um pouco mais por algo limpo e bem acabado em vez de ficar mexendo nisso tudo na mão
Se tiver uma impressora 3D, faça uma impressão 3D
Se trabalha com acrílico, um cortador a laser corta o formato e alguns furos viram uma caixa
Se não tiver nada disso e só quiser uma caixa mínima, pode usar uma Altoids Tin que custa uns 25 dólares por 12 unidades; ela vem com balas de menta inúteis, então é só jogar fora e colocar o projeto dentro
Se quiser algo um pouco melhor que uma lata de Altoids, compre um Hammond Enclosure
(https://www.hammfg.com/electronics/small-case)
No meu caso, talvez eu enrolasse tudo com fita isolante e depois com algo como silver tape, e então pintasse com marcador permanente
Normalmente eles vêm com algumas abas pré-perfuradas para parafusar a placa, e os furos externos para entrada e saída você faz conforme precisar
Alguns fabricantes estão abaixo, e, se você já estiver comprando placas de desenvolvimento ou outras peças, geralmente também dá para encontrar isso na adafruit ou na digikey e economizar no frete
https://www.hammfg.com/
https://www.budind.com/
http://takachi-enclosure.com/
https://www.adafruit.com/product/903
A maioria dos projetos que você vê não vira produto
São projetos pontuais de hackers; se outras pessoas acharem útil, ótimo, mas esse não é o objetivo, então não há necessidade de embalagem, e às vezes simplesmente enfiam tudo numa caixa
Se quiser algo com aparência melhor, vai precisar pedir para alguém projetar um case
Esse alguém pode ser você mesmo
O ESP32 foi projetado para ser fácil de colocar em produtos próprios, então o fluxo acaba sendo desenhar a placa e o case para combinarem entre si, comprar o chip ESP32 em quantidade e montá-lo na placa
As placas que você compra para prototipagem são oficialmente apenas placas de referência; não se espera que sejam o produto final para envio, mas na prática também é comum enviar a própria placa
Porque ela é pequena, barata, e alguém já fez por você o difícil trabalho de projetar a placa
Se o produto for suficientemente padronizado, talvez você possa pular essa etapa
Depois disso, entre em contato com fabricantes locais e com fabricantes de mercados maiores, peça amostras e verifique se tudo funciona direito
Se gostar, faça um pedido pequeno primeiro
Vale a pena projetar um processo de garantia de qualidade ou encontrar alguém que ajude nisso, para que o fabricante não envie 20% de produtos defeituosos
Coloque em lojas físicas ou crie um site e venda em portais como a Amazon
Converse com os clientes, ouça o feedback e vá melhorando um pouco cada etapa
Parece intimidador, mas, trabalhando em uma pequena startup de casa inteligente, aprendi que em Shenzhen existe toda uma indústria pronta para ajudar fundadores a transformar o produto dos sonhos em realidade, e você pode contratar pessoas para ajudar em cada etapa
Pela nossa experiência, os serviços na China foram muito melhores, mais baratos e mais rápidos do que as propostas europeias
O restante do recipiente vira o enclosure
Faço furos no recipiente para os cabos entrarem e saírem
Quando quero deixar um pouco mais bonito, uso um recipiente Tupperware
Não acompanhei completamente a questão de manter os dados na memória, e parece que isso já foi resolvido, mas para estimar o número de IDs únicos de beacons, parece que usar um algoritmo de estimativa de cardinalidade permitiria fazer isso com espaço constante
https://en.wikipedia.org/wiki/Count-distinct_problem
Eu estava pensando em levar isso para um jogo de futebol em breve e fazer um teste de estresse com a maior multidão de acesso rápido que eu conseguir
Se ele conseguir escanear milhares sem problemas, vou considerar isso bem robusto
Ainda assim, pesquisar uma estrutura de dados de estimativa de tamanho fixo parece realmente muito divertido, e com certeza vou olhar isso
Uma das coisas de que mais gosto neste projeto é poder explorar conceitos mais profundos e interessantes de ciência da computação sem a pressão de ter que fazer a solução mais fácil
Não estou desenvolvendo uma solução para entregar o quanto antes; estou apenas resolvendo uma necessidade minha
A parte de que “lidar com Bluetooth no Linux de forma headless é extremamente doloroso. As bindings de DBus exigiam magia de cross-compilation, e nem o Cross conseguiu resolver” foi exatamente a minha experiência também
Como eu estava trabalhando em outra coisa, acabei decidindo colocar os dois dispositivos na mesma rede Wi‑Fi e detectar por varredura de pi.local
Mas eu gostaria de entender como outras crates funcionam quando, sem a biblioteca, elas não falham no build e só crasham em tempo de execução
O autor parece ter sofrido porque tentou fazer isso em embarcado e teve que lidar com interfaces bem mais de baixo nível
Em linguagens de alto nível, isso é um problema resolvido há muito tempo
Se o rastreador acabou ficando na porta ao lado do computador, provavelmente já teria sido suficiente usar o próprio RPi rodando Python
https://github.com/home-assistant/core/blob/dev/homeassistan...
https://www.home-assistant.io/integrations/bluetooth_tracker...
Eles deveriam ter deixado claro que isso é para BLE
No começo, achei que fosse baseado em frequência cardíaca, calor, entrada/saída, ou alguma outra coisa mais física
Além disso, a sensibilidade de recepção do ESP32 é de cerca de -94 dBm, o que é bem ruim; a maioria dos dispositivos vai a -100, -102, ou até -104 dBm
Essa diferença é bem significativa
ESPresence é um projeto interessante e também funciona no ESP32-C3
Ele parece ter sido projetado mais para descobrir em qual cômodo algo está