0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32設(shè)計(jì)的人體健康檢測(cè)儀

DS小龍哥-嵌入式技術(shù) ? 2023-06-23 10:41 ? 次閱讀

一、項(xiàng)目介紹

當(dāng)前文章介紹基于STM32設(shè)計(jì)的人體健康檢測(cè)儀。設(shè)備采用STM32系列MCU作為主控芯片,配備血氧濃度傳感器(使用MAX30102血氧濃度檢測(cè)傳感器)、OLED屏幕和電池供電等外設(shè)模塊。設(shè)備可以廣泛應(yīng)用于醫(yī)療、健康等領(lǐng)域。可以幫助醫(yī)生和病人更好地了解病情變化,提高治療效果和生活質(zhì)量。設(shè)備也可以用于健康管理、運(yùn)動(dòng)監(jiān)測(cè)等場(chǎng)景,幫助用戶了解自己的身體狀況,保持健康的生活方式。

在項(xiàng)目中,使用了KEIL作為開發(fā)平臺(tái)和工具,通過血氧模塊采集人體的心跳和血氧濃度參數(shù),并通過OLED屏幕顯示現(xiàn)在的心跳和血氧濃度。同時(shí),通過指標(biāo)分析,提供采集到的數(shù)據(jù)與正常指標(biāo)比對(duì),分析被檢測(cè)人員的健康狀態(tài)。采集的數(shù)據(jù)可通過藍(lán)牙或者WIFI傳遞給手機(jī)APP進(jìn)行處理,方便用戶隨時(shí)了解自己的身體狀況。

本設(shè)計(jì)采用STM32為主控芯片,搭配血氧濃度傳感器和OLED屏幕,實(shí)現(xiàn)了人體健康數(shù)據(jù)的采集和展示,并對(duì)采集到的數(shù)據(jù)進(jìn)行分析,判斷被檢測(cè)人員的健康狀態(tài)。同時(shí),設(shè)計(jì)使用藍(lán)牙或WiFi將采集到的數(shù)據(jù)傳遞給手機(jī)APP進(jìn)行處理。

image-20230618132149185

image-20230618132108207

二、項(xiàng)目設(shè)計(jì)思路

2.1 硬件設(shè)計(jì)

(1)主控芯片:STM32系列MCU,負(fù)責(zé)驅(qū)動(dòng)其他外設(shè)模塊;

(2)血氧濃度傳感器:使用MAX30102血氧濃度檢測(cè)傳感器,用于采集人體的心跳和血氧濃度參數(shù);

(3)OLED屏:用于顯示現(xiàn)在的心跳和血氧濃度;

2.2 軟件設(shè)計(jì)

(1) 通過血氧模塊采集人體的心跳和血氧濃度參數(shù);

(2) 通過OLED屏顯示現(xiàn)在的心跳和血氧濃度;

(3) 對(duì)采集到的數(shù)據(jù)進(jìn)行指標(biāo)分析,將采集到的數(shù)據(jù)與正常指標(biāo)比對(duì),分析被檢測(cè)人員的健康狀態(tài);

(4) 采集的數(shù)據(jù)可通過藍(lán)牙或WiFi傳遞給手機(jī)APP進(jìn)行處理。

2.3 技術(shù)實(shí)現(xiàn)

(1)設(shè)計(jì)采用AD8232心電圖(ECG)模塊和MAX30102血氧模塊采集心跳和血氧濃度參數(shù),并通過I2C接口連接主控芯片STM32。

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

(3)采集到的數(shù)據(jù)通過算法進(jìn)行指標(biāo)分析,將采集到的數(shù)據(jù)與正常指標(biāo)比對(duì),判斷被檢測(cè)人員的健康狀態(tài)。

(4)設(shè)備通過藍(lán)牙或WiFi將采集到的數(shù)據(jù)傳遞給手機(jī)APP進(jìn)行處理。

三、代碼設(shè)計(jì)

3.1 MAX30102血氧模塊代碼

I2C協(xié)議代碼:

#define MAX30102_I2C_ADDR 0xAE
 ?
 void 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的初始化函數(shù)和數(shù)據(jù)獲取函數(shù):

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;
 }

數(shù)據(jù)處理函數(shù):

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顯示屏驅(qū)動(dòng)代碼

I2C協(xié)議代碼:

#define SSD1306_I2C_ADDR 0x78
 ?
 void 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的初始化函數(shù)和數(shù)據(jù)更新函數(shù):

#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));
 }
 }

四、總結(jié)

本設(shè)計(jì)采用STM32為主控芯片,配合血氧濃度傳感器和OLED屏幕,實(shí)現(xiàn)了人體健康數(shù)據(jù)的采集和展示,并通過算法對(duì)采集到的數(shù)據(jù)進(jìn)行分析,判斷被檢測(cè)人員的健康狀態(tài)。同時(shí),設(shè)計(jì)使用藍(lán)牙或WiFi將采集到的數(shù)據(jù)傳遞給手機(jī)APP進(jìn)行處理。設(shè)計(jì)基本滿足了人體健康檢測(cè)儀的技術(shù)要求和環(huán)境要求。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16885

    瀏覽量

    349914
  • STM32
    +關(guān)注

    關(guān)注

    2264

    文章

    10854

    瀏覽量

    354289
  • 檢測(cè)儀
    +關(guān)注

    關(guān)注

    5

    文章

    4059

    瀏覽量

    42176
  • MAX30102
    +關(guān)注

    關(guān)注

    4

    文章

    13

    瀏覽量

    2577
  • 血氧傳感器
    +關(guān)注

    關(guān)注

    1

    文章

    12

    瀏覽量

    4282
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    人體生物信息檢測(cè)儀

    、任務(wù) 設(shè)計(jì)并制作人體生物信息檢測(cè)儀,人體生物信息包括脈搏和體表溫度。 二、要求 1、基本要求 (1)設(shè)計(jì)制作脈搏和溫度探測(cè)裝置,測(cè)量并顯示每分鐘脈搏次數(shù)和體表溫度,脈搏次數(shù)測(cè)量誤差≤±3次,體表溫度
    發(fā)表于 09-09 20:00

    3D-CELL健康檢測(cè)儀(12000元/臺(tái))

    3D-CELL健康檢測(cè)儀簡(jiǎn)介3D-CELL非線性分析健康管理系統(tǒng),是中國大易集團(tuán)于 2009年獨(dú)家引進(jìn)俄羅斯宇航局預(yù)測(cè)宇航員3—5年內(nèi)身體健康狀況的尖端科學(xué)技術(shù),并進(jìn)行源碼改進(jìn),改良漢
    發(fā)表于 10-29 18:05

    全息生物電檢測(cè)儀的工作原理是什么?

    全息生物電檢測(cè)儀根據(jù)博大精深的中醫(yī)理論,將人體臟腑在身體反射區(qū)上的穴位和手腕部脈搏信號(hào)和血信號(hào)變換成對(duì)應(yīng)的生物電數(shù)據(jù),并將此數(shù)據(jù)與計(jì)算機(jī)海量數(shù)據(jù)庫中的正常值加以對(duì)比,進(jìn)而確定被測(cè)者身體正常與否。全息生物健康
    發(fā)表于 11-04 09:10

    基于單片機(jī)的人體健康檢測(cè)系統(tǒng) 精選資料分享

    環(huán)境:widows10+keil5+C+AT89C52參考資料1.基于單片機(jī)的便攜式人體健康指標(biāo)檢測(cè)系統(tǒng)設(shè)計(jì),匯編實(shí)現(xiàn)2.基于單片機(jī)控制的人體健康
    發(fā)表于 07-19 07:58

    怎樣去設(shè)計(jì)基于嵌入式stm32的心率檢測(cè)儀

    資源分享:嵌入式stm32項(xiàng)目開發(fā) 心率檢測(cè)儀的設(shè)計(jì)與實(shí)現(xiàn)本課程主要基于心率檢測(cè)儀的設(shè)計(jì)與實(shí)現(xiàn)講解STM32開發(fā)技術(shù),STM32開發(fā)板廣泛應(yīng)
    發(fā)表于 08-03 06:11

    基于心率檢測(cè)儀的設(shè)計(jì)與實(shí)現(xiàn)講解STM32開發(fā)技術(shù)

    視頻教程免費(fèi)分享:嵌入式stm32項(xiàng)目開發(fā)之心率檢測(cè)儀的設(shè)計(jì)與實(shí)現(xiàn)本課程主要基于心率檢測(cè)儀的設(shè)計(jì)與實(shí)現(xiàn)講解STM32開發(fā)技術(shù),STM32開發(fā)
    發(fā)表于 08-03 06:44

    基于STM32的人體檢測(cè)系統(tǒng)設(shè)計(jì)

    STM32人體檢測(cè)(體溫、心率、心跳、跌倒檢測(cè))+zigbee筆者前言在閑魚有緣結(jié)識(shí)的一個(gè)哥們,幫助做的基于STM32人體檢測(cè)系統(tǒng),我負(fù)責(zé)硬
    發(fā)表于 08-04 06:21

    怎樣去設(shè)計(jì)一種STM32的心率檢測(cè)儀

    STM32是什么?怎樣去設(shè)計(jì)一種STM32的心率檢測(cè)儀?
    發(fā)表于 09-28 08:12

    如何利用STM32單片機(jī)實(shí)現(xiàn)顏色檢測(cè)儀設(shè)計(jì)

    9、基于STM32單片機(jī)的顏色檢測(cè)儀設(shè)計(jì)文章目錄9、基于STM32單片機(jī)的顏色檢測(cè)儀設(shè)計(jì)引言1、系統(tǒng)概述1.1、設(shè)計(jì)任務(wù)1.2、設(shè)計(jì)要求2、方案設(shè)計(jì)與論證2.1、芯片選擇方案2.2 、
    發(fā)表于 11-30 06:34

    基于STM32空氣質(zhì)量檢測(cè)儀原理圖

    STM32空氣質(zhì)量檢測(cè)儀原理圖STM32空氣質(zhì)量檢測(cè)儀原理圖STM32空氣質(zhì)量檢測(cè)儀原理圖
    發(fā)表于 10-29 18:22 ?351次下載

    基于ZigBee的人體健康監(jiān)測(cè)系統(tǒng)設(shè)計(jì).pdf

    基于ZigBee的人體健康監(jiān)測(cè)系統(tǒng)設(shè)計(jì)
    發(fā)表于 05-07 11:40 ?45次下載

    病害肉檢測(cè)儀的使用方法

    病害肉檢測(cè)儀使用說明書。病害肉檢測(cè)儀【恒美儀器HM-BR12】可以對(duì)肉類進(jìn)行快速的檢測(cè),辨別出病害肉與健康肉。日常飲食中我們可以從肉類中獲取充足的蛋白質(zhì)以補(bǔ)充
    發(fā)表于 09-26 10:58 ?630次閱讀

    基于單片機(jī)的人體健康檢測(cè)系統(tǒng)

    環(huán)境:widows10+keil5+C+AT89C52參考資料1.基于單片機(jī)的便攜式人體健康指標(biāo)檢測(cè)系統(tǒng)設(shè)計(jì),匯編實(shí)現(xiàn)2.基于單片機(jī)控制的人體健康
    發(fā)表于 11-12 15:51 ?70次下載
    基于單片機(jī)<b class='flag-5'>的人體</b><b class='flag-5'>健康</b><b class='flag-5'>檢測(cè)</b>系統(tǒng)

    簡(jiǎn)單介紹氨氣檢測(cè)儀是什么

    一般在我們的生活環(huán)境中可能會(huì)存在一些氨氣,但氣體濃度值超過了人體可以承受的范圍后,就會(huì)對(duì)我們的健康造成影響。所以為了可以避免人體受到氨氣的影響,一般九可以采用氨氣檢測(cè)儀對(duì)當(dāng)前環(huán)境進(jìn)行
    發(fā)表于 02-09 16:08 ?584次閱讀

    氮?dú)?b class='flag-5'>檢測(cè)儀簡(jiǎn)介

    氮?dú)?b class='flag-5'>檢測(cè)儀是一種用于測(cè)量氮?dú)鉂舛然虻獨(dú)庠谄渌麣怏w中的含量的儀器??紤]到氮?dú)庠诟鞣N工業(yè)和醫(yī)療應(yīng)用中的廣泛使用,準(zhǔn)確地檢測(cè)其濃度對(duì)于確保生產(chǎn)質(zhì)量、環(huán)境保護(hù)和人體健康至關(guān)重要。 1. 氮?dú)?/div>
    的頭像 發(fā)表于 09-08 14:52 ?1620次閱讀