|

制作一个WIFI版睡眠监测器,支持手机联动

之前在北京参加工作的时候,当时智能硬件正流行,微信也在那一年开始做微信物联网,基于微信公众号的物联网平台使用蓝牙连接,我当时负责微信公众号对接蓝牙只能手环的前后端开发任务。如今智能硬件已经沉淀了一批又一批,留给用户使用的产品警告各种捶打,已经是能真真切切满足需求的东西。而我做这个小项目,主要是因为手头有一些空闲的硬件模块,到时可以快速的搭建一个原型出来,验证一下想法。

这个小项目的开发的前后端都相对简单。前端提供一个可视化的用户界面,后端提供数据的速写接口。这里后端我使用的是PHP + MySQL 组合,使用 Nginx 做代理,部署在 Ubuntu 系统中。前端使用 Framework7 移动端Web框架,睡眠数据在前端完成计算,不用记录历史。

前端 UI

作为设计出身,UI这一块要拿捏的死死的,不能难堪丑陋,不难丢设计的脸。这里我借鉴了 迷雾森林 的视觉感受,使用 深色浅色黄色 作为主要表现色。其中的表意为:

  • 深色:深睡眠;
  • 浅色:浅睡眠;
  • 黄色:活动,即还入睡或未睡着。

界面上半部从左到右表示一个睡眠周期,一把就是一个夜晚,三种三色的交替变化代表了不同时间段的睡眠情况。例如下面两张图,是不同睡眠周期下识别到的睡眠简报以及统计出来的睡眠情况。

可以看出来这两次入睡时间基本都在晚上十一点以后,醒来时间基本都在八点左右(周六周日),从图上来看,因为深色居多,浅色比较少,黄色只有零星一点,所以睡眠质量总体是不错的。第二张图可以看出来半夜有一次起夜,因为出现了一端很窄的黄柱,那是我去上了个厕所。

从设计上来看,UI可以直观的体现想要体现的效果了。

概念和原理

这里要说一下睡眠数据如何采集和识别。

活动检测

活动检测是原理。

我们可以大体想一下,当一个人深睡的时候,应该是处于相对比较静止的姿态中,或者有规律的微小变化中(呼吸会引起腹部的起伏)。浅睡相比于深睡,规律性减弱,睡眠姿态的噪点将更多,动作幅度也更大。除了睡眠状态以外的,基本都是活动状态,比如半夜睡不舒服了翻个身,或者起来上厕所,或者被子掉了捡被子等,当深睡眠之间夹杂了一个很短暂的高噪点的时候,这个噪点就可以忽略,除非有连续一段时间的不规律高噪点,这个时候我们就可以认为是处在活动状态。

上面就是对睡眠数据的大致判断和分类思路,剩下的就是来采集到睡眠的数据。什么样的传感器才能采集到人体的姿态数据?我们不可能给人的胳膊腿都绑上传感器,所以最简单的办法就是在枕边或者枕头放一个传感器,只要人的身体有活动,头部就一定会有活动,这个活动也会传递到传感器上被感知到。

所以问题就变成了,用什么样的传感器来采集活动数据?这个问题是不是听起来非常耳熟,另外一个类似的问题是,用什么样的传感器来采集步数?

监测睡眠和计步在这个时候就变成了一种问题,睡眠问题甚至可能比计步问题更简单。同样的,对于获取姿态,可选的传感器有如下几种:

  • 三轴加速度计(例如LIS3DH或ADXL345);
  • 六轴陀螺仪(例如MPU6050);
  • 三轴磁场传感器(例如HMC5883,这个可能一般都想不到)。

无论用那种传感器,最终目的是获取噪点的变化情况,所以只要是一个静止时数据波动不大,稍有扰动就能记录噪声的传感器即可,因为手头正好有几个LIS3DH三轴加速度计,所以就用它实现活动检测。

说到这里,也就能理解为什么小米手环除了能计步,还能记录睡眠情况了吧!

体动数

体动数是概念。

我们需要在平滑的数据中找到噪点,并根据噪点的情况记录体动。体动有两个关键值:

  • 体动幅度;
  • 体动持续时间。

这两个关键值可以通过传感器的连续测量来获得。体动幅度用来判断睡眠活动的剧烈程度,体动持续时间用来判断睡眠过程中活动的时间,这两个值相结合就能大致粗略的判断出处于那种活动下。

我使用ESP8266作为主控MCU,通过LIS3DH连续采集当前的姿态,用来判断当前体动数的具体值,一次体动数完成后,将数据通过HTTP接口上传到服务器,有后端的接口将数据入库保存。第二天我睡醒以后,通过Web拉取数据,分析昨晚的睡眠情况,绘制睡眠图并统计睡眠数据,至此这个小项目就做完了。

我介绍项目的时候很少贴代码,是因为我觉得思路比代码更重要,当理解一个问题的解决思路的时候,实现过程基本都是信手拈来。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注