0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32设计的人体健康检测仪

DS小龙哥-嵌入式技术 2023-06-23 10:41 次阅读

一、项目介绍

当前文章介绍基于STM32设计的人体健康检测仪。设备采用STM32系列MCU作为主控芯片,配备血氧浓度传感器(使用MAX30102血氧浓度检测传感器)、OLED屏幕和电池供电等外设模块。设备可以广泛应用于医疗、健康等领域。可以帮助医生和病人更好地了解病情变化,提高治疗效果和生活质量。设备也可以用于健康管理、运动监测等场景,帮助用户了解自己的身体状况,保持健康的生活方式。

在项目中,使用了KEIL作为开发平台和工具,通过血氧模块采集人体的心跳和血氧浓度参数,并通过OLED屏幕显示现在的心跳和血氧浓度。同时,通过指标分析,提供采集到的数据与正常指标比对,分析被检测人员的健康状态。采集的数据可通过蓝牙或者WIFI传递给手机APP进行处理,方便用户随时了解自己的身体状况。

本设计采用STM32为主控芯片,搭配血氧浓度传感器和OLED屏幕,实现了人体健康数据的采集和展示,并对采集到的数据进行分析,判断被检测人员的健康状态。同时,设计使用蓝牙或WiFi将采集到的数据传递给手机APP进行处理。

image-20230618132149185

image-20230618132108207

二、项目设计思路

2.1 硬件设计

(1)主控芯片:STM32系列MCU,负责驱动其他外设模块;

(2)血氧浓度传感器:使用MAX30102血氧浓度检测传感器,用于采集人体的心跳和血氧浓度参数;

(3)OLED屏:用于显示现在的心跳和血氧浓度;

2.2 软件设计

(1) 通过血氧模块采集人体的心跳和血氧浓度参数;

(2) 通过OLED屏显示现在的心跳和血氧浓度;

(3) 对采集到的数据进行指标分析,将采集到的数据与正常指标比对,分析被检测人员的健康状态;

(4) 采集的数据可通过蓝牙或WiFi传递给手机APP进行处理。

2.3 技术实现

(1)设计采用AD8232心电图(ECG)模块和MAX30102血氧模块采集心跳和血氧浓度参数,并通过I2C接口连接主控芯片STM32。

(2)OLED屏使用I2C接口与主控芯片STM32连接。

(3)采集到的数据通过算法进行指标分析,将采集到的数据与正常指标比对,判断被检测人员的健康状态。

(4)设备通过蓝牙或WiFi将采集到的数据传递给手机APP进行处理。

三、代码设计

3.1 MAX30102血氧模块代码

I2C协议代码:

#define MAX30102_I2C_ADDR 0xAEvoid MAX30102_I2C_Init(void)
 {
     GPIO_InitTypeDef  GPIO_InitStructure;
     I2C_InitTypeDef   I2C_InitStructure;
 ​
     /* Enable GPIOB clock */
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
     /* Enable I2C1 and I2C2 clock */
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1 | RCC_APB1Periph_I2C2, ENABLE);
 ​
     // Configure I2C SCL and SDA pins
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // Open-drain output
     GPIO_Init(GPIOB, &GPIO_InitStructure);
 ​
     // Configure I2C parameters
     I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
     I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
     I2C_InitStructure.I2C_OwnAddress1 = 0x00;
     I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
     I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
     I2C_InitStructure.I2C_ClockSpeed = 100000; // 100KHz
     I2C_Init(I2C1, &I2C_InitStructure);
 ​
     // Enable I2C
     I2C_Cmd(I2C1, ENABLE);
 }
 ​
 void MAX30102_I2C_WriteReg(uint8_t reg, uint8_t value)
 {
     while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
 ​
     I2C_GenerateSTART(I2C1, ENABLE);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 ​
     I2C_Send7bitAddress(I2C1, MAX30102_I2C_ADDR, I2C_Direction_Transmitter);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
 ​
     I2C_SendData(I2C1, reg);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 ​
     I2C_SendData(I2C1, value);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 ​
     I2C_GenerateSTOP(I2C1, ENABLE);
 }
 ​
 uint8_t MAX30102_I2C_ReadReg(uint8_t reg)
 {
     uint8_t value;
 ​
     while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
 ​
     I2C_GenerateSTART(I2C1, ENABLE);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 ​
     I2C_Send7bitAddress(I2C1, MAX30102_I2C_ADDR, I2C_Direction_Transmitter);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
 ​
     I2C_SendData(I2C1, reg);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 ​
     I2C_GenerateSTART(I2C1, ENABLE);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 ​
     I2C_Send7bitAddress(I2C1, MAX30102_I2C_ADDR, I2C_Direction_Receiver);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
 ​
     I2C_AcknowledgeConfig(I2C1, DISABLE);
     value = I2C_ReceiveData(I2C1);
 ​
     I2C_GenerateSTOP(I2C1, ENABLE);
 ​
     return value;
 }
 ​
 void MAX30102_I2C_ReadArray(uint8_t reg, uint8_t* data, uint8_t len)
 {
     while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
 ​
     I2C_GenerateSTART(I2C1, ENABLE);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 ​
     I2C_Send7bitAddress(I2C1, MAX30102_I2C_ADDR, I2C_Direction_Transmitter);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
 ​
     I2C_SendData(I2C1, reg);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 ​
     I2C_GenerateSTART(I2C1, ENABLE);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 ​
     I2C_Send7bitAddress(I2C1, MAX30102_I2C_ADDR, I2C_Direction_Receiver);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
 ​
     while(len > 1)
     {
         I2C_AcknowledgeConfig(I2C1, ENABLE);
         while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
         *data++ = I2C_ReceiveData(I2C1);
         len--;
     }
 ​
     I2C_AcknowledgeConfig(I2C1, DISABLE);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
     *data++ = I2C_ReceiveData(I2C1);
 ​
     I2C_GenerateSTOP(I2C1, ENABLE);
 }

MAX30102的初始化函数和数据获取函数:

void MAX30102_Init(void)
 {
     MAX30102_I2C_Init();
 ​
     // Reset the device
     MAX30102_I2C_WriteReg(0x09, 0x40);
     HAL_Delay(100);
     MAX30102_I2C_WriteReg(0x09, 0x00);
 ​
     // Set FIFO average to 4 samples
     MAX30102_I2C_WriteReg(0x08, 0x03);
 ​
     // Set LED pulse amplitude
     MAX30102_I2C_WriteReg(0x0C, 0x1F);
     MAX30102_I2C_WriteReg(0x0D, 0x1F);
 ​
     // Set sample rate to 100Hz
     MAX30102_I2C_WriteReg(0x0F, 0x04);
 ​
     // Enable the red LED only
     MAX30102_I2C_WriteReg(0x11, 0x02);
 ​
     // Read the temperature value to start a reading
     MAX30102_I2C_ReadReg(0x1F);
 }
 ​
 uint32_t MAX30102_GetHeartRate(void)
 {
     uint8_t buffer[MAX30102_FIFO_DEPTH*4];
     MAX30102_Data sensor_data = {0};
     uint16_t ir_value;
     uint16_t red_value;
     uint8_t byte_count, fifo_overflow;
 ​
     // Check if any data is available in FIFO
     byte_count = MAX30102_I2C_ReadReg(0x06) - MAX30102_I2C_ReadReg(0x04);
     if(byte_count > 0)
     {
         fifo_overflow = MAX30102_I2C_ReadReg(0x09) & 0x80;
 ​
         // Read the data from FIFO
         MAX30102_I2C_ReadArray(0x07, buffer, byte_count);
 ​
         // Parse the data
         for(int i=0; i< byte_count; i+=4)
         {
             ir_value = ((uint16_t)buffer[i] < < 8) | buffer[i+1];
             red_value = ((uint16_t)buffer[i+2] < < 8) | buffer[i+3];
 ​
             // Update the sensor data
             MAX30102_UpdateData(&sensor_data, ir_value, red_value);
         }
 ​
         if(!fifo_overflow && MAX30102_CheckForBeat(sensor_data.IR_AC_Signal_Current))
         {
             return MAX30102_HeartRate(sensor_data.IR_AC_Signal_Previous, 16);
         }
     }
 ​
     return 0;
 }

数据处理函数:

void MAX30102_UpdateData(MAX30102_Data* data, uint16_t ir_value, uint16_t red_value)
 {
     int32_t ir_val_diff = ir_value - data- >IR_AC_Signal_Current;
     int32_t red_val_diff = red_value - data- >Red_AC_Signal_Current;
 ​
     // Update IR AC and DC signals
     data- >IR_AC_Signal_Current = (ir_val_diff + (7 * data- >IR_AC_Signal_Previous)) / 8;
     data- >IR_DC_Signal_Current = (ir_value + data- >IR_AC_Signal_Current + (2 * data- >IR_DC_Signal_Current)) / 4;
     data- >IR_AC_Signal_Previous = data- >IR_AC_Signal_Current;
 ​
     // Update Red AC and DC signals
     data- >Red_AC_Signal_Current = (red_val_diff + (7 * data- >Red_AC_Signal_Previous)) / 8;
     data- >Red_DC_Signal_Current = (red_value + data- >Red_AC_Signal_Current + (2 * data- >Red_DC_Signal_Current)) / 4;
     data- >Red_AC_Signal_Previous = data- >Red_AC_Signal_Current;
 ​
     // Update IR and Red AC signal peak-to-peak values
     if(data- >IR_AC_Signal_Current > data- >IR_AC_Max)
         data- >IR_AC_Max = data- >IR_AC_Signal_Current;
     else if(data- >IR_AC_Signal_Current < data- >IR_AC_Min)
         data- >IR_AC_Min = data- >IR_AC_Signal_Current;
 ​
     if(data- >Red_AC_Signal_Current > data- >Red_AC_Max)
         data- >Red_AC_Max = data- >Red_AC_Signal_Current;
     else if(data- >Red_AC_Signal_Current < data- >Red_AC_Min)
         data- >Red_AC_Min = data- >Red_AC_Signal_Current;
 }
 ​
 uint8_t MAX30102_CheckForBeat(int32_t ir_val)
 {
     static uint8_t beat_detection_enabled = 1;
     static uint32_t last_beat_time = 0;
     static int32_t threshold = 0x7FFFFF;
 ​
     uint32_t delta_time;
     int32_t beat_amplitude;
 ​
     if(beat_detection_enabled)
     {
         // Increment the beat counter
         MAX30102_beat_counter++;
 ​
         // Calculate the threshold value
         threshold += (ir_val - threshold) / 8;
 ​
         // Check if a beat has occurred
         if(ir_val > threshold && MAX30102_beat_counter > 20)
         {
             delta_time = micros() - last_beat_time;
             last_beat_time = micros();
             beat_amplitude = ir_val - threshold;
             if(delta_time < 1000 || delta_time > 2000 || beat_amplitude < 20 ||
             beat_amplitude > 1000) { return 0; }
                    // Reset the beat counter and set the threshold value
         MAX30102_beat_counter = 0;
         threshold = ir_val;
 ​
         return 1;
     }
 }
 ​
 return 0;
 }
 ​
 uint32_t MAX30102_HeartRate(int32_t ir_val, uint8_t samples) { int32_t ir_val_sum = 0;
 // Calculate the sum of IR values
 for(int i=0; i< samples; i++)
 {
     ir_val_sum += MAX30102_IR_Sample_Buffer[i];
 }
 ​
 // Calculate the average IR value
 ir_val_sum /= samples;
 ​
 // Calculate the heart rate
 return (uint32_t)(60 * MAX30102_SAMPLING_FREQUENCY / (ir_val - ir_val_sum));
 }

3.2 OLED显示屏驱动代码

I2C协议代码:

#define SSD1306_I2C_ADDR 0x78void SSD1306_I2C_Init(void)
 {
     GPIO_InitTypeDef  GPIO_InitStructure;
     I2C_InitTypeDef   I2C_InitStructure;
 ​
     /* Enable GPIOB clock */
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
     /* Enable I2C1 and I2C2 clock */
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1 | RCC_APB1Periph_I2C2, ENABLE);
 ​
     // Configure I2C SCL and SDA pins
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // Open-drain output
     GPIO_Init(GPIOB, &GPIO_InitStructure);
 ​
     // Configure I2C parameters
     I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
     I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
     I2C_InitStructure.I2C_OwnAddress1 = 0x00;
     I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
     I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
     I2C_InitStructure.I2C_ClockSpeed = 100000; // 100KHz
     I2C_Init(I2C1, &I2C_InitStructure);
 ​
     // Enable I2C
     I2C_Cmd(I2C1, ENABLE);
 }
 ​
 void SSD1306_I2C_WriteReg(uint8_t reg, uint8_t value)
 {
     while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
 ​
     I2C_GenerateSTART(I2C1, ENABLE);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 ​
     I2C_Send7bitAddress(I2C1, SSD1306_I2C_ADDR, I2C_Direction_Transmitter);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
 ​
     I2C_SendData(I2C1, 0x00);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 ​
     I2C_SendData(I2C1, reg);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 ​
     I2C_SendData(I2C1, value);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 ​
     I2C_GenerateSTOP(I2C1, ENABLE);
 }
 ​
 void SSD1306_I2C_WriteArray(uint8_t* data, uint16_t len)
 {
     while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
 ​
     I2C_GenerateSTART(I2C1, ENABLE);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
 ​
     I2C_Send7bitAddress(I2C1, SSD1306_I2C_ADDR, I2C_Direction_Transmitter);
     while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
 ​
     while(len--)
     {
         I2C_SendData(I2C1, *data++);
         while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
     }
 ​
     I2C_GenerateSTOP(I2C1, ENABLE);
 }

SSD1306的初始化函数和数据更新函数:

#define SSD1306_WIDTH 128
 #define SSD1306_HEIGHT 64
 #define SSD1306_BUFFER_SIZE (SSD1306_WIDTH*SSD1306_HEIGHT/8)uint8_t SSD1306_Buffer[SSD1306_BUFFER_SIZE];
 ​
 void SSD1306_Init(void)
 {
     SSD1306_I2C_Init();
 ​
     // Turn display off
     SSD1306_DisplayOff();
 ​
     // Set the clock to a high value for faster data transfer
     SSD1306_I2C_WriteReg(0x0F, 0x80);
 ​
     // Set multiplex ratio to default value (63)
     SSD1306_I2C_WriteReg(0xA8, 0x3F);
 ​
     // Set the display offset to 0
     SSD1306_I2C_WriteReg(0xD3, 0x00);
 ​
     // Display start line is 0
     SSD1306_I2C_WriteReg(0x40, 0x00);
 ​
     // Set segment remap to inverted
     SSD1306_I2C_WriteReg(0xA1, 0xC0);
 ​
     // Set COM output scan direction to inverted
     SSD1306_I2C_WriteReg(0xC8, 0xC0);
 ​
     // Disable display offset shift
     SSD1306_I2C_WriteReg(0xD7, 0x9F);
 ​
     // Set display clock divide ratio/oscillator frequency to default value (8/0xF0)
     SSD1306_I2C_WriteReg(0xD5, 0xF0);
 ​
     // Enable charge pump regulator
     SSD1306_I2C_WriteReg(0x8D, 0x14);
 ​
     // Set memory addressing mode
     // Set the display to normal mode (not inverted)
 SSD1306_I2C_WriteReg(0xA6, 0xA6);
 ​
 // Set the contrast to a default value of 127
 SSD1306_I2C_WriteReg(0x81, 0x7F);
 ​
 // Turn the display back on
 SSD1306_DisplayOn();
 ​
 // Clear the display buffer
 SSD1306_ClearBuffer();
 ​
 // Update the display with the cleared buffer
 SSD1306_UpdateDisplay();
 }
 ​
 void SSD1306_UpdateDisplay(void) { uint8_t column, page;
 }for(page=0; page< 8; page++)
 {
     SSD1306_I2C_WriteReg(0xB0+page, 0x00);
     SSD1306_I2C_WriteReg(0x10, 0x00);
     SSD1306_I2C_WriteReg(0x00, 0x00);
 ​
     for(column=0; column< SSD1306_WIDTH; column++)
     {
         SSD1306_I2C_WriteArray(&SSD1306_Buffer[column + page*SSD1306_WIDTH], 1);
     }
 }
 }
 void SSD1306_ClearBuffer(void) { memset(SSD1306_Buffer, 0x00, sizeof(SSD1306_Buffer)); }
 ​
 void SSD1306_SetPixel(uint8_t x, uint8_t y, uint8_t color) { if(x >= SSD1306_WIDTH || y >= SSD1306_HEIGHT) { return; }
 }if(color)
 {
     SSD1306_Buffer[x + (y/8)*SSD1306_WIDTH] |= (1 < < (y%8));
 }
 else
 {
     SSD1306_Buffer[x + (y/8)*SSD1306_WIDTH] &= ~(1 < < (y%8));
 }
 }

四、总结

本设计采用STM32为主控芯片,配合血氧浓度传感器和OLED屏幕,实现了人体健康数据的采集和展示,并通过算法对采集到的数据进行分析,判断被检测人员的健康状态。同时,设计使用蓝牙或WiFi将采集到的数据传递给手机APP进行处理。设计基本满足了人体健康检测仪的技术要求和环境要求。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16984

    浏览量

    350273
  • STM32
    +关注

    关注

    2266

    文章

    10870

    浏览量

    354759
  • 检测仪
    +关注

    关注

    5

    文章

    4069

    浏览量

    42207
  • MAX30102
    +关注

    关注

    4

    文章

    13

    浏览量

    2586
  • 血氧传感器
    +关注

    关注

    1

    文章

    12

    浏览量

    4286
收藏 人收藏

    评论

    相关推荐

    人体生物信息检测仪

    、任务 设计并制作人体生物信息检测仪人体生物信息包括脉搏和体表温度。 二、要求 1、基本要求 (1)设计制作脉搏和温度探测装置,测量并显示每分钟脉搏次数和体表温度,脉搏次数测量误差≤±3次,体表温度
    发表于 09-09 20:00

    3D-CELL健康检测仪(12000元/台)

    3D-CELL健康检测仪简介3D-CELL非线性分析健康管理系统,是中国大易集团于 2009年独家引进俄罗斯宇航局预测宇航员3—5年内身体健康状况的尖端科学技术,并进行源码改进,改良汉
    发表于 10-29 18:05

    全息生物电检测仪的工作原理是什么?

    全息生物电检测仪根据博大精深的中医理论,将人体脏腑在身体反射区上的穴位和手腕部脉搏信号和血信号变换成对应的生物电数据,并将此数据与计算机海量数据库中的正常值加以对比,进而确定被测者身体正常与否。全息生物健康
    发表于 11-04 09:10

    基于单片机的人体健康检测系统 精选资料分享

    环境:widows10+keil5+C+AT89C52参考资料1.基于单片机的便携式人体健康指标检测系统设计,汇编实现2.基于单片机控制的人体健康
    发表于 07-19 07:58

    怎样去设计基于嵌入式stm32的心率检测仪

    资源分享:嵌入式stm32项目开发 心率检测仪的设计与实现本课程主要基于心率检测仪的设计与实现讲解STM32开发技术,STM32开发板广泛应
    发表于 08-03 06:11

    基于心率检测仪的设计与实现讲解STM32开发技术

    视频教程免费分享:嵌入式stm32项目开发之心率检测仪的设计与实现本课程主要基于心率检测仪的设计与实现讲解STM32开发技术,STM32开发
    发表于 08-03 06:44

    基于STM32的人体检测系统设计

    STM32人体检测(体温、心率、心跳、跌倒检测)+zigbee笔者前言在闲鱼有缘结识的一个哥们,帮助做的基于STM32人体检测系统,我负责硬
    发表于 08-04 06:21

    怎样去设计一种STM32的心率检测仪

    STM32是什么?怎样去设计一种STM32的心率检测仪
    发表于 09-28 08:12

    如何利用STM32单片机实现颜色检测仪设计

    9、基于STM32单片机的颜色检测仪设计文章目录9、基于STM32单片机的颜色检测仪设计引言1、系统概述1.1、设计任务1.2、设计要求2、方案设计与论证2.1、芯片选择方案2.2 、
    发表于 11-30 06:34

    基于STM32空气质量检测仪原理图

    STM32空气质量检测仪原理图STM32空气质量检测仪原理图STM32空气质量检测仪原理图
    发表于 10-29 18:22 353次下载

    基于ZigBee的人体健康监测系统设计.pdf

    基于ZigBee的人体健康监测系统设计
    发表于 05-07 11:40 45次下载

    病害肉检测仪的使用方法

    病害肉检测仪使用说明书。病害肉检测仪【恒美仪器HM-BR12】可以对肉类进行快速的检测,辨别出病害肉与健康肉。日常饮食中我们可以从肉类中获取充足的蛋白质以补充
    发表于 09-26 10:58 632次阅读

    基于单片机的人体健康检测系统

    环境:widows10+keil5+C+AT89C52参考资料1.基于单片机的便携式人体健康指标检测系统设计,汇编实现2.基于单片机控制的人体健康
    发表于 11-12 15:51 70次下载
    基于单片机<b class='flag-5'>的人体</b><b class='flag-5'>健康</b><b class='flag-5'>检测</b>系统

    简单介绍氨气检测仪是什么

    一般在我们的生活环境中可能会存在一些氨气,但气体浓度值超过了人体可以承受的范围后,就会对我们的健康造成影响。所以为了可以避免人体受到氨气的影响,一般九可以采用氨气检测仪对当前环境进行
    发表于 02-09 16:08 590次阅读

    氮气检测仪简介

    氮气检测仪是一种用于测量氮气浓度或氮气在其他气体中的含量的仪器。考虑到氮气在各种工业和医疗应用中的广泛使用,准确地检测其浓度对于确保生产质量、环境保护和人体健康至关重要。 1. 氮气
    的头像 发表于 09-08 14:52 1662次阅读