Ir ao conteúdo

Posts recomendados

Postado

Estou tentando detectar o sinal bluetooth low energy da minha placa JDY-24M com o ESP32 e por meio desse sinal identificar a distância do sinal, pois pretendo fazer um portão automático.
Então o esquema seria: quando chegar próximo ao portão o ESP32 detecta o sinal iBeacon do JDY-24M que já está configurado e por meio de uma API verifica se está autorizado a entrar, se sim, abre o portão.

Mas até agora não consegui sucesso no código, já tenho todo o círcuito montado, falta apenas o código.

  • Curtir 1
  • Membro VIP
Postado

 

17 horas atrás, Adriano carlos disse:

JDY-24M com o ESP32

Lembrando que o esp32 é programado na plataforma arduina, acho que o google jdy-24m arduino (clique) deve te orientar o bastante. Caso prefira, publique seu fonte, seu esquema elétrico, com sucessos e derrotas, mostre o que sabe, o que fez, o que entendeu, o que não e o que etc

 

17 horas atrás, Adriano carlos disse:

identificar a distância do sinal,

Legal este lance do

17 horas atrás, Adriano carlos disse:

iBeacon

https://pt.wikipedia.org/wiki/IBeacon

Postado

@.if código que estou usando como base:
 

#include <BLEDevice.h>

#include <BLEScan.h>

#include <BLEAdvertisedDevice.h>

int scanTime = 10;  // Tempo de escaneamento em segundos

const int TX_POWER = -70;  // TxPower esperado do iBeacon (geralmente entre -59 e -65 dBm a 1 metro)

const float ENV_FACTOR = 3.0;  // Fator ambiental (3.0 para ambientes fechados)

#define RSSI_SAMPLE_COUNT 5  // Número de leituras para calcular a média

int rssiSamples[RSSI_SAMPLE_COUNT] = {0};

int sampleIndex = 0;

bool bufferFull = false;

float calculateDistance(int rssi) {

  return pow(10, (TX_POWER - rssi) / (10.0 * ENV_FACTOR));

}

class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks {

  void onResult(BLEAdvertisedDevice advertisedDevice) {

    if (advertisedDevice.haveManufacturerData()) {

      String manufacturerData = advertisedDevice.getManufacturerData();

      if (manufacturerData.length() >= 22) {

        char uuid[33];

        for (int i = 4; i < 20; i++) {

          sprintf(&uuid[(i - 4) * 2], "%02X", (uint8_t)manufacturerData[i]);

        }

        uuid[32] = '\0';

        int rssi = advertisedDevice.getRSSI(); // Obtém o RSSI do iBeacon

        // Armazena RSSI na lista para média

        rssiSamples[sampleIndex] = rssi;

        sampleIndex = (sampleIndex + 1) % RSSI_SAMPLE_COUNT;

        if (sampleIndex == 0) bufferFull = true;

        if (bufferFull) {

          // Calcula média do RSSI quando já tiver 5 leituras

          int sum = 0;

          for (int i = 0; i < RSSI_SAMPLE_COUNT; i++) {

            sum += rssiSamples[i];

          }

          float avgRSSI = (float)sum / RSSI_SAMPLE_COUNT;

          float distance = calculateDistance(avgRSSI);

          // Exibe a distância estimada se estiver dentro de 5 metros

          if (distance <= 5.0) {

            Serial.print("UUID: ");

            Serial.print(uuid);

            Serial.print(" | RSSI Médio: ");

            Serial.print(avgRSSI);

            Serial.print(" dBm | Distância estimada: ");

            Serial.print(distance, 2);

            Serial.println(" metros");

          }

        }

      }

    }

  }

};

void setup() {

  Serial.begin(115200);

  BLEDevice::init("");

  BLEScan* pBLEScan = BLEDevice::getScan();

  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());

  pBLEScan->setActiveScan(true);

  pBLEScan->start(scanTime, false);

}

void loop() {

  BLEDevice::getScan()->start(scanTime, false);

}

Quero ler uma distância de 5 metros ou menos, nos meus testes, em ambientes fechados, ocorreram esses retornos:

 

UUID: 6F00F1F670C144329902876A9FC9EE8A | RSSI Médio: -68.40 dBm | Distância estimada: 0.86 metros

UUID: 01062000F38F020900E928815558C7F4 | RSSI Médio: -70.00 dBm | Distância estimada: 1.00 metros

UUID: 01062000F38F020900E928815558C7F4 | RSSI Médio: -71.60 dBm | Distância estimada: 1.08 metros

UUID: 6F00F1F670C144329902876A9FC9EE8A | RSSI Médio: -69.40 dBm | Distância estimada: 0.93 metros

Apenas o UUID 6F00F1F670C144329902876A9FC9EE8A importa, ele está a pouco mais de 1 metro de distância da ESP32, fiz um código para ler tanto longa distância (5 metros) quanto curta distância (1 metro ou menos)

  • Membro VIP
  • Solução
Postado

Da hora. Estima a distância pela intensidade do sinal. Não entendo muito de c++ malemá de C mas tenta colocar a leitura da "posição" dos seus dispositivos dentro do loop e ande com eles pelo o ambiente pra ver se varia ou fica coerente. Mas parece que

1 hora atrás, Adriano carlos disse:

EE8A | RSSI Médio: -68.40 dBm | Distância estimada: 0.86 metros

1 hora atrás, Adriano carlos disse:

EE8A | RSSI Médio: -69.40 dBm | Distância estimada: 0.93 metros

está quase coerente ou aceitável...

1 hora atrás, Adriano carlos disse:

EE8A importa, ele está a pouco mais de 1 metro

.. já que pode haver perdas/interferências no sistema e que não se pode exigir muita precisão. Com relação aos 5 metros, não entendi muito bem.. não mede? mede errado? o sinal some? Estude melhor a tal função da estimativa da distância. Talvez você tenha que fazer ajustes no setup e/ou analisar melhor os dados.

Ah sim.. um insight me apareceu agora... pesquise se você precisa fazer algum tipo de "calibração".. p.ex. você coloca a 1m de distância e informa o sistema que aqueles db correspondem a 1m. A partir daí, o dado recebido é comparado com este que você guardou p.ex. numa eeprom. ... bem .. isso foi só literal intuição mesmo.. vulgo chute..😁

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...