首页/作品列表/魔盒魔盒告诉我,哪儿不用排队?
魔盒魔盒告诉我,哪儿不用排队?
11650 0
主要内容

项目目标

项目基于一个现实问题:在宿舍里的时候,不知道超市,教室,食堂的人流情况,想选择人少的时候去;不知道那里的温湿度情况,想了解应该穿多厚的衣服。 通过传感器信息,外部API调用,给用户提供公共场所的信息。(建立多度等级,在云端分析人流多少,是否拥挤;温湿度如何,怎样着装较好。)方便用户判断何时前往,如何规划时间。如果项目顺利,还可能额外加上预约排队系统。

项目原理

通过传感器与云端通信,以及云端的简单代码,动态反应焦点场所的人流大小。

硬件组装

内部硬件调试

功能实现

硬件端关键代码
#define HOST_NAME "api.heclouds.com" //定义域名,定义云端硬件编码。对于不同的硬件端,这里的DEVICEID不同
#define DEVICEID "23343719"
#define PROJECTID "102517"
#define HOST_PORT (80)
String apiKey="EvldL=Gho20lXXcXT0r=dCRxznk=";
char buf[20];
sensor_tem = SHT2x.readT() ; //读取温度
sensor_hum = SHT2x.readRH();//读取相对湿度
sensor_voi = analogRead(A0);//读取声音
float temp= sensor_voi;
sensor_voi=map(sensor_voi,0,1023,0,5);
db = (20*log(10)) * (sensor_voi/1.0);//此处是想将声音传感器的信号转化为分贝,但是由于声音传感器敏感度较低,真正实现的时候并没有用这个数据
sensor_voi=temp;//重新使用声音传感器的原始数据
sensor_pir=digitalRead(PIR_PIN);
dtostrf(sensor_tem, 2, 1, sensor_tem_c);
dtostrf(sensor_hum, 2, 1, sensor_hum_c);
dtostrf(sensor_voi, 3, 1, sensor_voi_c);
dtostrf(db,3,1,db_c);
dtostrf( sensor_pir, 2, 1, sensor_pir_c);//将数据转化为字符串,便于上传

微信小程序端关键代码
//
var length = app.globalData.voice.datapoints.length;
//获得长度,以进行下一步处理
const voice_i=0.3;
const PIR_i = 0.7;//声音和红外传感器的比例系数
const voice_rate =2;
const PIR_rate = 100;//声音和红外传感器的放大系数,使数值判断更易
const judge_L=58;//超过这个值,显示现场人流较为拥挤
const judge_M = 40;//超过这个值,显示现场人流正常
var judge=0;
for (var i = 0; i < length; i++) {
voice=voice+parseFloat(app.globalData.voice.datapoints[i].value);
PIR = PIR + parseFloat(app.globalData.PIR.datapoints[i].value);
Humidity = Humidity + parseFloat(app.globalData.Humidity.datapoints[i].value);
Temperature = Temperature + parseFloat(app.globalData.Temperature.datapoints[i].value);
}//获得各个数据之和
voice =voice/length;
PIR = PIR / length;
Humidity = Humidity/length;
app.globalData.Humidity =Humidity;
Temperature = Temperature/length;
app.globalData.in_temp = Temperature;
app.globalData.in_humi = Humidity;//计算平均数,给全局变量赋值
judge = PIR * PIR_rate * PIR_i +voice*voice_rate*voice_i;
//对红外线感应器和声音感应器的数据进行加权计算,获得判断依据

项目演示

onenet云端测试结果


微信小程序端基础逻辑编写

微信小程序手机端显示效果


备注:此处以超市为例,但是对食堂,教室依然基本适用。由于数据采集是在超市进行的,所以扩展到食堂,教室时,可能需要对计算时的比例权重进行修改。

项目展示


团队故事

1.该项目原本的核心硬件应该是Sensor-Ultrasonic,用超声波测距测量队伍的长度。但是在具体实现的时候出现了三个问题。一是我们希望最终的硬件终端可以用在多个场景下,而不仅限于超市。但在例如教室,图书馆的场景下,“队伍”的检测显然不能为人流的多少提供依据。二是Sensor-Ultrasonic的探测距离 仅为10cm-180cm,不符合实际要求。三是该传感器在Mcookie的线上店并没有售卖,传感器的获得难度很大,所以最终放弃了这个选择。   
2.在硬件部分成型的时候,我们发现放置在Base板上的传感器并不稳定,而且朝向也难以控制。所以萌生了外部包装的想法。在https://wiki.microduino.cn 上,我们发现它的许多实例,例如分贝检测仪,有较为成熟的木质外部包装。原来的想法是看能不能买到相应的材料自己DIY,但是又一次在淘宝店告知没有售卖。于是我们改装了几个小盒子,把传感器,Microduino-Module BM Shield这些固定在外面,而把核心模块放在里面。于是我们得到了上文的那个U—get 小盒子。这个过程挺像C++中的类,留一定的接口在外部,封装好核心的功能,用户不必在意内部是如何实现这个功能的。因为以前手工制作接触的少,以为会有不少的困难,但是宋岩熠同学出色的完成了这个任务。 
3.对于微信小程序,我们的理解是它是一个轻量级的应用。腾讯本身也给它加了一些限制,比如规定页面路径只能是五层。所以团队讨论的时候决定并不把重点放在小程序的复杂度上,尽量做到越简单越好,本身这个项目也只是为了完成用户打开就能轻松的看到某个地方人流的拥挤程度。但是也因为这个决定,最终小程序的界面看起来还是有点简陋。本来应该多花些功夫在页面的美化上的。  
4.在“摆弄”声音传感器的时候我们遇到了点困难。我们手里的声音传感器好像有点问题,实际数据与理论数据不太匹配,而且敏感度很低。这导致在将传感器的模拟信号通过计算得到分贝的时候,总是得不到合适的数据。由于时间紧,我们选择了比较“粗暴”的解决方案。有两个同学分别在超市人流高峰期和低谷期采集了一定量的数据,我们对数据进行了一定的处理,并最终依次设置了多度等级。也就是说,该项目的声音部分的处理基本是依靠实践而不是理论解决的。也正是因为此,在最后计算的时候我们只给予了声音 30%的权重。 
5.原本是想在小程序里面将人流分布情况作成热力图的形式。但是发现微信小程序的接口使用,与普通的网页还是有不小的区别,热力图插件并不能很好的用上。所以最后我们用画布的形式,结合判断条件,用色块来显示人流的多少,最终效果其实也是挺不错的。  
6.最后,端到端真的挺神奇的。当你坐在宿舍里,望着数据从超市那边喷涌而来,心里还是挺爽的。“不出家门而天下知”。随着物联网的飞速发展,空间上的差距会变得越来越小。我们对世界的认知,也会被遍布各地的各式各样的传感器再次刷新。






所需硬件
暂无数据!
代码展示

1. 人流检测

编程语言: C/C++(Arduino)

软件工具:Arduino IDE 1.6.9


附件下载
  • 资料展示
  • uget-a-small-program-master.zip
0
大牛,别默默的看了,快登录帮我点评一下吧!

立即注册