基于大数据技术的慢性病食物预警与管理手表
作者:孙弘毅 学校:上海市杨思高级中学
1.背景介绍 在现代社会,由于个人生活节奏快、吃饭不规律,病程较长的慢性病已成为影响我国居民健康的主要问题之一。由于饮食习惯与工作压力等问题,慢性病在中国的流行态势更加严峻。具体来说,我国居民中糖尿病、高血压、心脏病等慢性疾病的发病率及发病人群都呈现爆炸式的增长。长期来看,这不仅影响患者的生活质量,也给我国医疗系统带来沉重负担。
在慢性病的发展程度上,我国的形势十分不容乐观。首先,2013年全国糖尿病患病率为9.7%,而到2020年,这一数字已上升至12.4%。令人担忧的是,尽管已有超过1.2亿中国人被诊断患有糖尿病,但许多患者并未意识到自己患病。这使得糖尿病的早期发现和管理难度增加。
与此同时,约有3亿人受到不同程度的高血压影响。高血压不仅是心血管疾病的重要风险因素,还与脑卒中(中风)、肾病等密切相关。然而,很多高血压患者未能有效控制血压,导致并发症发生率进一步上升。此外,心脏病在我国的发病率也在逐年攀升。目前,我国心血管疾病患者总数已超过3.3亿。每年因心血管疾病导致的死亡人数占总死亡人数的40%以上,已成为我国居民的主要死因之一。值得注意的是,急性心肌梗死的发病率也有所上升,且呈年轻化趋势。更可怕的是,慢性病通常具有隐蔽性和长期性,很多患者在早期难以察觉身体异常,等到出现症状时往往已经错过了最佳干预时机。与此同时,我在进行调研后发现,不健康的饮食,比如过量摄入高糖、高脂肪和高盐的食物,容易引发肥胖、糖尿病、心血管疾病等慢性病。健康的饮食,如多吃水果、蔬菜、全谷物,限制加工食品和高糖饮料的摄入,则有助于预防这些疾病。因此养成良好的饮食习惯,不仅可以保持健康体重,还能有效降低患慢性病的风险,让我们在未来生活中更加健康、充满活力。
因此,如何通过先进的技术手段实现慢性病的早期预警和监测,已成为提高人们健康水平的重要课题。现在,很多人因为学习或工作忙碌,常常忽视饮食,喜欢吃快餐、零食,导致摄入过多糖分、脂肪和盐,这样不健康的饮食习惯容易引发肥胖、糖尿病和心脏病等慢性病。如果能对自己的饮食进行科学监测,就可以及时发现饮食中存在的问题,合理调整饮食结构,实现营养均衡摄入,这不仅有助于保持健康体重,也能有效预防慢性病发生,延缓病程发展,让我们身体更健康,精力更充沛。
2.课题方案
首先,本课题计划使用ESP32单片机作为硬件载体,使用连接的实时摄像头去监测摄取的菜品类别,再通过天聚数行(TianAPI)提供的开源API获取对应食物的原材料及营养成分含量数据。然后,再去分析这些食品内所含的关键营养成分,并根据使用者的慢性病类型(如糖尿病、高血压等)进行健康风险预警。因此,本研究主要是基于食物成分的分析并结合硬件对使用者进行预警提示。其流程示意图如下:

2.1 慢性病患者需要关注的成分
针对高血压患者,需要非常注意食物中钠的含量。这是因为钠摄入过多是导致高血压与心脏病的主要因素之一,因其会增加血容量,导致血压升高。对于心脏病患者,需要严格控制钠、反式脂肪、饱和脂肪等营养成分。对于糖尿病患者,则需要严格控制碳水化合物与糖的摄取。
但是,由于国内各地饮食习惯各有不同。我们只针对几种类别进行提示,不限制使用者的摄入。我们监测的营养成分主要为钠、脂肪、碳水化合物与糖等基本营养成分。其具体细节如下表所示:

2.2 MPU6050加速度传感器
MPU-6050是一个带有3轴加速度计和3轴陀螺仪的模块。陀螺仪测量旋转速度(rad/s),这是角位置沿X、Y和Z轴(横滚、俯仰和偏航)随时间的变化,如下图所示。在本课题中,其被安装在使用者智能手表内,用于检测手腕的加速度方向与状态变化。当检测到加速度发生明显变化时,系统即判定使用者可能正在进行进食动作。随后会启动整个系统的判别机制,对摄入食物的营养成分进行监测与分析。

在硬件搭建方面,我们将MPU6050传感器与ESP32开发板进行物理连接,利用杜邦线通过I2C接口(SDA和SCL)实现连接。ESP32提供3.3V电压供电,GND引脚接地,SDA和SCL分别连接到ESP32的GPIO 21和GPIO 22引脚。在软件方面,首先,使用Micropython进行程序开发,使用machine模块来管理I2C通信。其次,编写初始化代码以确保MPU6050正确启动,并通过I2C读取数据。最后,在主循环中不断读取加速度和陀螺仪数据,并将其通过串口进行输出并进行判断。
MPU6050传感器示意图如下:
其物理连接如下:

其测试串口打印如下:

为了简便计算,我们通过简单的阈值算法来判断进食动作。当手腕的加速度在某个时间段内超过一定的阈值时,即视为进食动作。设定加速度变化的阈值为a_threshold。在本研究中,我们设定 a_threshold = 1.5g,其中g为重力加速度。当加速度的模(即 |A|=sqrt(Ax^2 + Ay^2 + Az^2))超过该阈值时,视为发生进食动作,并开始进行拍摄画面的识别与判断。
2.2 单片机摄像头画面摄取
在画面摄取功能方面,我们直接采用了ESP32-CAM摄像头去进行开发,图像摄取。ESP32-CAM是一个开发板,它上面集成了Camera摄像头模块,所以可以直接用Micropython进行操作。然后,为了让电脑上的Thonny软件可以通过串口控制ESP32,需要安装指定的摄像头驱动。
其连接代码如下:
import camera
# 初始化摄像头camera.init(0, format=camera.JPEG, fb_location=camera.PSRAM)# 拍摄一张图片buf = camera.capture() # 大小是640x480
# 保存图片到文件with open("第一张图片.png", "wb") as f:
f.write(buf) # buf中的数据就是图片的数据,所以直接写入文件就行了
print("successful input")
其示意图如下:



装配与测试的使用效果如下:
2.3 食物营养成分分析
我们直接使用天聚数行的开放API接口对食物营养成分进行分析。根据官网介绍,这个API可以通过输入图像资源,识别近两千种常见食物的详细营养成分及100克以下的营养元素含量、热量(大卡)等三十多项参数。
其调用代码如下:
# -*- coding: utf-8 -*-
import http.client, urllib, json
conn = http.client.HTTPSConnection('apis.tianapi.com')
#接口域名params = urllib.
parse.urlencode({'key':'APIKEY','img':'base64'})headers = {'Content-type':'application/x-www-form-urlencoded'}
conn.request('POST','/imgnutrient/index',params,headers)
tianapi = conn.getresponse()
result = tianapi.read()
data = result.decode('utf-8')
dict_data = json.loads(data)
print(dict_data)
其具体测试与使用案例如下:
1)油条



2)番茄炒蛋



2.4震动电机模块
首先,针对识别出需要预警的食物,会通过震动手表来提示使用者:该食物是一个有风险的食物,需注意摄入量。我们直接采用迷你震动马达模块来实现震动功能开发。该震动马达模块与手机震动马达原理相同,震动效果明显,通过MOSFET放大驱动可直接由esp32单片机的数字接口控制,并支持PWM调节震动强度,方便实现灵活控制。
其结构如下所示:



其具体的连接形式如下:
将震动马达模块的“IN”引脚连接到ESP32的GPIO 15引脚。
将“VCC”引脚连接到ESP32的3.3V引脚。
将“GND”引脚连接到ESP32的GND引脚。
我们使用Micropython编写代码,通过PWM信号来调节震动马达的振动强度。该程序首先初始化了震动马达的控制引脚,并将PWM频率设置为1000Hz。通过set_vibration_intensity()函数,程序根据输入的占空比调节震动强度,占空比范围为0到1023,分别对应无震动到最大震动的强度。代码通过循环逐步增加和减少震动强度,实现渐强渐弱的震动效果。在判别使用者正在摄取危险食物时,直接进行震动提示。核心代码如下: from machine import Pin, PWM
from time import sleep
# 设置震动马达控制引脚,假设连接到GPIO 15
motor_pin = Pin(15, Pin.OUT)
# 初始化PWM,频率设置为1000Hz
pwm = PWM(motor_pin)
pwm.freq(1000)
# 函数:调节震动马达的强度def set_vibration_intensity(duty):
pwm.duty(duty)
# 设置PWM的占空比,范围0-1023,决定震动强度try:
while True:
# 增强震动强度
for i in range(0, 1024, 100):
set_vibration_intensity(i)
sleep(0.5)
# 减弱震动强度
for i in range(1023, -1, -100):
set_vibration_intensity(i)
sleep(0.5)
except KeyboardInterrupt:
# 停止程序时关闭PWM
pwm.deinit()
print("Vibration motor stopped.")
2.4语音播报提示
在本项目中,直接采用有源蜂鸣器进行强烈等级的预警。首先,将有源蜂鸣器的正极(VCC)连接到ESP32开发板的3.3V或5V供电引脚,负极(GND)连接到ESP32的GND引脚。然后,将蜂鸣器的信号引脚连接到ESP32的一个GPIO引脚(例如GPIO 15)。接着,在MicroPython中编写程序,通过设置GPIO引脚的高低电平来控制蜂鸣器的开关,利用高电平激活蜂鸣器预警。
蜂鸣器分为两种,有源与无源。有源的只需要设置对应引脚为低电平,就会发出声音,且仅一种音调。无源的需通过PWM来控制引脚,从而可发出不同的音调。为了简便开发,我们直接采用有源模式。其控制代码如下:
from machine
import Pinimport time
p15 = Pin(15, Pin.OUT)
for i in range(10):
p15.value(1)
# 不响
time.sleep(0.2)
p15.value(0)
# 响
time.sleep(0.2)
p15.value(1)
# 关闭
其连接示意图如下:
责任编辑:李银慧