资料介绍
描述
使命
该项目始于将睡眠监测系统与机器学习能力相结合的想法。这个想法不仅是生成和可视化睡眠数据,而且最终创建一个人的睡眠预测。项目本身可以分解为以下三个目标:
- 拥有一个低调、电池供电的设备,可以在睡眠和环境温度时向 AWS 报告运动。
- 能够在 Web 应用程序中存储、处理和可视化传入的数据。
- 提出一个基于长期数据的可行模型,可以预测个人的睡眠模式
描述
首先我要说的是,这绝对是一项正在进行的工作,但我希望迄今为止在设备上完成的工作对处理 AWSIotEduKit 的其他人有用。在使命宣言中提到的目标中,只有一个已经实现,而且还是有点问题:
- 拥有一个低调、电池供电的设备,可以在睡眠和环境温度时向 AWS 报告运动。
因此,我将介绍正在使用的代码以及采样方法背后的一些逻辑,并将后两个要点留作进一步工作的悬念。
如前所述,所使用的设备是 AWS IoT EduKit,被选为亚马逊网络服务重塑健康空间竞赛的一部分。该设备可以安装在床架上,以监测房间状况和床上任何运动引起的振动。起初,我们的想法是测量尽可能多的参数:噪音、温度、旋转和加速度、湿度、压力、环境光……但是,为了简单起见,我从温度、加速度和旋转开始。这些是使用 EduKit 板载的 MPU6886芯片功能测量的。
MPU6886 的加速度计和陀螺仪测量值旨在作为床上运动的指示,这是我对睡眠质量的代表。在确定这个重要变量时,可能有多种方法可以采用,但市场上许多测量睡眠的商业产品都是通过测量运动来实现的。因此,这似乎是一个有效的、简约的解决方案,特别是因为这些功能已经存在于 EduKit 上。
代码
设备固件的框架是 EduKit GitHub 存储库中的 Blinky-Hello-World.c 示例。
所有的修改都在Blinky 项目的main.c中完成,同时在主目录下的CMakeLists.txt文件中进行了一个小修改:
set(COMPONENT_REQUIRES"nvs_flash""esp-aws-iot""esp-cryptoauthlib""core2forAWS""json")
包含“json”以提取用于打包要发送到 AWS 的有效负载的 JSON 库。
在 main.c 中,必须包含 cJSON.h:
#include"freertos/FreeRTOS.h"#include"freertos/task.h"#include"freertos/semphr.h"#include"freertos/event_groups.h"#include"esp_log.h"#include"cJSON.h"// Included for creating the JSON file payloads
接下来,需要定义一些参数以供稍后在代码中使用:
#defineSTARTING_ROOMTEMPERATURE0.0f/* The time between each MQTT message publish in milliseconds */#definePUBLISH_INTERVAL_MS5000/* The time between each sensor data gathering period (in seconds)*/#defineSENSOR_READING_AVERAGE_DELAY4.6/* The time between reading the sensor data once, before the next read (in seconds).This should be a factor of SENSOR_READING_AVERAGE_DELAY, otherwise you risk doing sensor readings beyond 5 seconds*/#defineSENSOR_READING_DELAY0.2/* Specify variable for keeping track of time in vTaskDelayUntil */TickType_txLastWakeTime;
并且需要初始化一些变量:
/* Initialize all the variables to be used for gathering sensor data and averages */floattemperature =0;floatgx =0;floatgy =0;floatgz =0;floatax =0;floatay =0;floataz =0;floatavg_temperature =0;floatavg_gx =0;floatavg_gy =0;floatavg_gz =0;floatavg_ax =0;floatavg_ay =0;floatavg_az =0;floatSum_Temperature =0;floatSum_Gyro_x =0;floatSum_Gyro_y =0;floatSum_Gyro_z =0;floatSum_Accel_x =0;floatSum_Accel_y =0;floatSum_Accel_z =0;
接下来,我创建了一个名为 sensorData() 的函数,用于实际从 MPU6886 中提取数据,并在将其发送到发布之前对其进行处理。这确实是代码的核心。为了减少发布频率以及随后的 AWS MQTT 费用,此功能将定期向 AWS 报告特定时间段内的平均值,但不经常报告。该函数将指针类型变量作为输入,因此当它被调用时,这些地址的平均值可以用于未来的操作。及时收集数据以适应发布频率窗口。我们需要在那个时间段内的数据总和,所以这些值首先被初始化。
voidsensorData(float*Avg_Gyro_x,float*Avg_Gyro_y,float*Avg_Gyro_z,float*Avg_Accel_x,float*Avg_Accel_y,float*Avg_Accel_z,float*Avg_Temperature){/* Reset all summing variables and the counter to zero */Sum_Temperature =0;Sum_Gyro_x =0;Sum_Gyro_y =0;Sum_Gyro_z =0;Sum_Accel_x =0;Sum_Accel_y =0;Sum_Accel_z =0;intcount_i =0;
需要以对手头任务有意义的方式对数据进行平均。对于温度,只需将一段时间内的测量值相加,然后除以测量次数就足够了。
然而,运动数据有点棘手。由于振动可能对每个正值都有一个紧密匹配的负旋转/加速度,因此不能只添加这些值 - 它们必须是无符号的。此外,因为我们希望无运动和大运动之间的传播范围很广,所以测量值在求和之前先平方。这允许更明显地检测微弱运动,以及更强烈地指示大运动。
/* Create a basictimer to control the data collection loop, reporting averages according to SENSOR_READING_AVERAGE_DELAY */clock_t begin_Time = clock();while( ((unsigned long) (clock() - begin_Time)/CLOCKS_PER_SEC) < SENSOR_READING_AVERAGE_DELAY){MPU6886_GetTempData(&temperature);Sum_Temperature += (temperature* 1.8) + 32 - 80;/*Taking the square of each value so that averaging makes more sense with both positives and negatives coming in,and so motion is weighted more (trying topick up smaller motion)*/MPU6886_GetAccelData(&ax,&ay,&az);Sum_Accel_x += ax*ax;Sum_Accel_y += ay*ay;Sum_Accel_z += az*az;MPU6886_GetGyroData(&gx,&gy,&gz);Sum_Gyro_x += gx*gx;Sum_Gyro_y += gy*gy;Sum_Gyro_z += gz*gz;count_i++;/* To keep from accumulating huge numbersin the Sum_xxx variables, the while loop below delays for SENSOR_READING_DELAYThis is probably not the best implementation, but should work for the sleep monitor's purposes*/clock_t start_Time = clock();while( ((unsigned long) (clock() - start_Time)/CLOCKS_PER_SEC) < SENSOR_READING_DELAY){}}
请注意这部分代码中计时器的实现。一个 while 循环跟踪平均周期约 4-5 秒,另一个 while 循环在每次测量之间提供延迟,以免淹没设备内存。为这些计时器选择的值是 4.6 秒(总收集时间)和 0.2 秒(延迟)。4.6s 允许测量后的时间每 5 秒平均、打包和发布数据。
**对其他制造商的警告:有人怀疑定时器实现(while 循环而不是警报或中断)在设备运行一段时间后导致 malloc 错误。
采集数据后,需要打包发布。这是在 publisher() 函数中完成的。创建一个 JSON 有效负载,其中包含所有温度、加速度和陀螺仪测量值。然后使用服务质量 1 发送消息,以便设备需要来自 AWS 的 ack 以确认接收。
staticvoid publisher(AWS_IoT_Client *client,char*base_topic, uint16_t base_topic_len){IoT_Publish_Message_Params paramsQOS1;paramsQOS1.qos = QOS1;paramsQOS1.isRetained =0;cJSON *payload = cJSON_CreateObject();cJSON *temperature_value = cJSON_CreateNumber(avg_temperature);cJSON_AddItemToObject(payload,"temperature_value",temperature_value);cJSON *accel_x_value = cJSON_CreateNumber(avg_ax);cJSON *accel_y_value = cJSON_CreateNumber(avg_ay);cJSON *accel_z_value = cJSON_CreateNumber(avg_az);cJSON_AddItemToObject(payload,"accel_x_value",accel_x_value);cJSON_AddItemToObject(payload,"accel_y_value",accel_y_value);cJSON_AddItemToObject(payload,"accel_z_value",accel_z_value);cJSON *gyro_x_value = cJSON_CreateNumber(avg_gx);cJSON *gyro_y_value = cJSON_CreateNumber(avg_gy);cJSON *gyro_z_value = cJSON_CreateNumber(avg_gz);cJSON_AddItemToObject(payload,"gyro_x_value",gyro_x_value);cJSON_AddItemToObject(payload,"gyro_y_value",gyro_y_value);cJSON_AddItemToObject(payload,"gyro_z_value",gyro_z_value);constchar*JSONPayload = cJSON_Print(payload);paramsQOS1.payload = (void*) JSONPayload;paramsQOS1.payloadLen = strlen(JSONPayload);// Publish and check if "ack" was sent from AWS IoT CoreIoT_Error_t rc = aws_iot_mqtt_publish(client, base_topic, base_topic_len, ¶msQOS1);if (rc == MQTT_REQUEST_TIMEOUT_ERROR) {ESP_LOGW(TAG, "QOS1 publish ack not received.");rc = SUCCESS;}}
最后要考虑的代码是在 aws_iot_task 中调用这两个函数,并设置 5 秒计时器。为此,在 app_main 中,唤醒时间被初始化,以便与 vTaskDelayUntil() 一起使用,这将在上次执行后等待 5 秒,然后再次开始 aws_iot_task while 循环(如果连接到 AWS,则无限期运行的循环是好的)。
app_main 补充:
/* Initialize the tick time for use in vTaskDelayUntil*/xLastWakeTime= xTaskGetTickCount();
以及 aws_iot_task 循环中的 publisher()、sensorData() 和 vTaskDelayUntil():
sensorData(&avg_gx, &avg_gy, &avg_gz, &avg_ax, &avg_ay, &avg_az, &avg_temperature);publisher(&client, base_publish_topic, BASE_PUBLISH_TOPIC_LEN);vTaskDelayUntil(&xLastWakeTime,pdMS_TO_TICKS(PUBLISH_INTERVAL_MS));
这样做是为了代码。值得注意的是,时序实现似乎并没有理论上的那么精确。数据最终被打包并发送到 AWS。
示例数据
以下是设备放置在床头板顶部的示例,在 (1)最小限度地移动和 (2)辗转反侧:
无动作示例 -
{"temperature_value": 25.075153350830078,"accel_x_value": 0.0004551649035420269,"accel_y_value": 0.00015581845946144313,"accel_z_value": 1.1685764789581299,"gyro_x_value":17.144529342651367,"gyro_y_value":0.4716217517852783,"gyro_z_value":23.804603576660156}
辗转反侧的例子——
{"temperature_value": 24.038557052612305,"accel_x_value": 0.0009434580570086837,"accel_y_value": 0.0001554012269480154,"accel_z_value": 1.16836678981781,"gyro_x_value":137.39096069335938,"gyro_y_value":19.99363136291504,"gyro_z_value":565.6026000976562}
向前进
显然,在这个概念上还有大量工作要做。我确实设法完成了大部分设备固件,并创建/证明了一种测量睡眠运动和环境条件的方法。然而,预测睡眠的新概念仍然需要数据工程和应用程序工作。未来的工作将包括:
- 在 AWS IoT 分析中存储数据
- 创建 Web 应用程序,或利用 AWS 服务来可视化和关联睡眠数据
- 执行机器学习模型以提供睡眠预测并改进数据表示。
- 使用AWS的IoT环境站第2部分0次下载
- 连接到AWSIoT的RIOT-OS应用程序0次下载
- Buddy:建立在AWSEdukit上的智能设备0次下载
- 联发科linkIt One的AWSIoT黑客系列开源分享0次下载
- 使用RIOT-OS的基于AWS的IoT虚拟环境站0次下载
- 睡眠监测传感器
- 如何使用MQTT将嵌入式系统连接到AWSIoTCore0次下载
- 适用于ESP32的AWSIoTArduino库1次下载
- 用于PICIoT和AVRIoT的AWS应用程序0次下载
- 适用于AWSIoTEduKit的追踪器0次下载
- 基于AWSIoTEduKit构建Pandemic智能系统0次下载
- 智能AWSIoTPT系统是增强锻炼的解决方案1次下载
- 睡眠质量监测器开源分享7次下载
- 调整AVR-IoTWG的用途以连接到AWS10次下载
- 嵌入式教学平台EDUKIT-IV实验丛书62次下载
- 基于正压睡眠呼吸机硬件设计方案484次阅读
- 小森睡眠闹钟荣获多项国家外观设计专利和发明专利授权698次阅读
- IoT传感器节点的节能方案1056次阅读
- 基于单片机和无线通信实现智能睡眠呼吸监测与报警系统4016次阅读
- IoT系统架构和网络类别3257次阅读
- 智能手表显示的睡眠数据可信吗1w次阅读
- 亚马逊AWS的云计算有什么愿景5870次阅读
- 米尔科技 BeetleIoT评估板概述1006次阅读
- 光传感器在盐密在线监测系统中应用1662次阅读
- 基于单片机的水情监测系统设计方案8108次阅读
- 一种智能终端的睡眠监测系统,能够采集人体睡眠脑电信号9052次阅读
- 盲点监测系统的利与弊2.4w次阅读
- 全球首款便携式非穿戴睡眠监测器RestOn拆解1.3w次阅读
- STM32进入和退出睡眠模式1.1w次阅读
- 解析基于NB-IoT的智慧路灯系统的架构 并介绍实际应用案例9951次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB |532次下载 |免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB |339次下载 |免费
- 3TC358743XBG评估板参考手册
- 1.36 MB |330次下载 |免费
- 4DFM软件使用教程
- 0.84 MB |295次下载 |免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB |227次下载 |免费
- 6迪文DGUS开发指南
- 31.67 MB |194次下载 |免费
- 7元宇宙底层硬件系列报告
- 13.42 MB |182次下载 |免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB |178次下载 |免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB |234315次下载 |免费
- 2555集成电路应用800例(新编版)
- 0.00 MB |33566次下载 |免费
- 3接口电路图大全
- 未知 |30323次下载 |免费
- 4开关电源设计实例指南
- 未知 |21549次下载 |免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB |15349次下载 |免费
- 6数字电路基础pdf(下载)
- 未知 |13750次下载 |免费
- 7电子制作实例集锦 下载
- 未知 |8113次下载 |免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB |6656次下载 |免费
总榜
- 1matlab软件下载入口
- 未知 |935054次下载 |免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB |537798次下载 |免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 |420027次下载 |免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB |234315次下载 |免费
- 5Altium DXP2002下载入口
- 未知 |233046次下载 |免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 |191187次下载 |免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M |183279次下载 |免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 |138040次下载 |免费
评论
查看更多