?看到一个思路:利用手机蓝牙信号的采集判断客流量
用ESP32采集一下蓝牙信号的Mac地址,统计总数,时间段,重复频率等等,基本可以准确的判断一个地方客流量,这比找个人去数人头来的靠谱得多,也不用装个摄像头折腾一个人性物体识别(当然视频识别有更广泛的意义,例如性别和年龄段)。
虽然esp32折腾了很久,但是蓝牙模块很少直接用,注意调库不算用。
出于好奇就折腾了一番,原本是好奇这个蓝牙信号采集到底能收集到那些信息,最后却折腾到另外一个事情上了:蓝牙信号强度。
利用一个ESP32模块去采集另外一个模块的蓝牙信号强度。
这是一米五距离的强度
这是0.5米内的信号强度
当然这里采集双方都是esp32模块,注意信号强度是通过负值来体现的。 -59>-70 也确实体现了信号更强。
这个思路的拓展就是可以通过信号强度来大概判断设备的位置:
举例,我手机不知道放哪里了,又找不到第二个手机拨打一下,于是就可以通过这个设备查找手机蓝牙,然后依照蓝牙设备的信号强度判断手机的距离:
#include <Arduino.h>
#include <TFT_eSPI.h>
#include "xfont.h"
#include <BluetoothSerial.h>
#include <BTScan.h>
TFT_eSPI tft;
BluetoothSerial BtSerial;
int scanTime = 5; // In seconds
void setup()
{
Serial.begin(115200);
Serial.println("Scanning...");
tft.begin();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_GREEN);
DrawStr2(tft, 10, 50, "开始扫描。。。", TFT_GREEN);
// BtSerial.
BtSerial.begin("ESP32蓝牙");
if (BtSerial.available())
{
Serial.print("蓝牙已经启动");
}
}
#define BT_DISCOVER_TIME 4000
void loop()
{
BTScanResults *pResults = BtSerial.discover(BT_DISCOVER_TIME);
pResults->getCount();
int bcnt = pResults->getCount();
if(bcnt>0)tft.fillScreen(TFT_BLACK);
for (int i = 0; i < bcnt; i++)
{
BTAdvertisedDevice *dev = pResults->getDevice(i);
String r = String(dev->getRSSI());
String n = String(dev->getName().c_str());
// if(n=="乌龙大法师")continue;
String display = "设备:" + n + " 强度:" + r;
DrawStr2(tft, 2, 2 + i * 18, display, TFT_GREEN);
}
BtSerial.discoverClear();
delay(20);
}
上面这段代码使用了自定义中文字库:
https://github.com/StarCompute/tftziku
扩展的思路就是可以用esp32 来做一个手机防丢设备,只要手机和esp模块信号丢失就可以蜂鸣报警,甚至可以不搜身的方式判断别人是否携带了我的手机。
如果做个APP也可以在手机反向查找esp32和其他蓝牙模块在哪里,触发一定条件后报警。
我靠,在写上面内容的时候,突然一下意识到 这可以做车辆计数啊,压根不用什么视频拍摄后用yolo来分析车辆和进行跟踪,要知道为了统计准确还需要划定区域。而现在你只要折腾一块esp32站到天桥上,等车辆经过采集其蓝牙设备信息就可以统计出车辆流量啊!
人类啊,你真可笑。