資料介紹
描述
在這個項(xiàng)目中,我將向您展示如何使用 ESP32、MAX30100 和 Blynk 應(yīng)用程序制作基于物聯(lián)網(wǎng)的脈搏血氧儀。我們可以使用 Blynk 物聯(lián)網(wǎng)云平臺從世界任何地方監(jiān)控這些值。
由于有可用的在線數(shù)據(jù),因此該項(xiàng)目可用于在線監(jiān)測患者的健康狀況。
市場上的脈搏血氧儀非常昂貴,但有了這個簡單且低成本的脈搏血氧儀模塊,我們就可以制作自己的設(shè)備。因此,讓我們學(xué)習(xí)如何使用 ESP32 制作 MAX30100 脈搏血氧儀。
第 1 步:所需組件。
要制作這款基于物聯(lián)網(wǎng)的脈搏血氧儀,您需要很少的組件您可以從亞馬遜鏈接 (AFFILIATE LINK)ESP32 X1 _____________________________印度 /Amazon.com購買所有這些組件
OLED 顯示屏 X1 ______________________________印度 / Amazon.com脈搏血氧計(jì)傳感器 X1 _________________________印度 /Amazon.com 3D 打印盒 X1
只需收集上述所有組件。
第 2 步:MAX30100 脈搏血氧計(jì)傳感器的工作。
該傳感器有兩個 LED,一個發(fā)出紅光,另一個發(fā)出紅外光。脈率需要紅外線。但是,測量血液中的 SpO2 水平需要紅光和紅外光。
當(dāng)心臟泵血時,氧氣水平會增加,因?yàn)橛懈嗟难骸?/font>但是,當(dāng)心臟休息時,含氧血液會減少。因此,脈率是通過獲得含氧血液上升和下降之間的時間來確定的。
含氧血液吸收更多的紅外光并通過更多的紅光。但是,脫氧血液會吸收紅光并通過更多的紅外光。
基本上,MAX30100 傳感器讀取兩個光源的吸收水平并將它們存儲在可通過 I2C 引腳讀取的緩沖區(qū)中。
第 3 步:0.96 英寸 I2C OLED 顯示屏。
在顯示模塊中,我們將使用 0.96 英寸藍(lán)色 OLED 顯示模塊。
我們可以輕松地將該模塊與任何使用 SPI/I2C 協(xié)議的微控制器連接。
顯示器的分辨率為 128×64。
I2C OLED 顯示屏

OLED代表有機(jī)發(fā)光二極管。它是一種自發(fā)光技術(shù),由放置在陽極和陰極之間的微小多層有機(jī)薄膜組成。
與 LCD 技術(shù)不同,OLED 不需要背光。
OLED對于所有類型的顯示器都具有很高的應(yīng)用潛力。OLED 也被認(rèn)為是下一代平板顯示器的終極技術(shù)
第 4 步:連接 MAX30100 脈搏血氧儀與 ESP32。

該物聯(lián)網(wǎng)脈搏血氧儀的電路組件非常簡單。
OLED 顯示屏和 MAX30100 血氧計(jì)傳感器均可與 I2C 配合使用。因此,將兩個模塊的 I2C 引腳(SCL 和 SDA)與 ESP32 的 D21 和 D22 引腳連接。
同樣,為 VCC 提供 3.3V 電源并將兩個傳感器的 GND 引腳接地。基本上,您可以按照電路圖進(jìn)行連接。
我不會講太多細(xì)節(jié),我已經(jīng)在我們的博客上寫了一些信息。
5:為物聯(lián)網(wǎng)脈搏血氧儀設(shè)置 Blynk 應(yīng)用程序
現(xiàn)在從適用于 Android 和 iOS 的 Play 商店/應(yīng)用商店下載此 Blink 應(yīng)用程序。
現(xiàn)在,單擊新項(xiàng)目為您的項(xiàng)目命名。我讓“血氧計(jì)”選擇 ESP32 開發(fā)板和連接類型為 Wi-Fi。然后點(diǎn)擊創(chuàng)建。
現(xiàn)在單擊“+”號以添加小部件。
我們需要讀取 BPM 和 SpO2 的值。因此,選擇一對名為 Value Display & Gauge 的小部件。
順便說一句,您訪問我們的網(wǎng)站并從中掃描代碼,您將獲得一個預(yù)制的小部件,這對您來說很容易
單擊此處(為 IoT 脈搏血氧計(jì)設(shè)置 Blynk 應(yīng)用程序)
第 6 步:軟件和庫

硬件設(shè)置完成,現(xiàn)在我們需要將代碼上傳到 NodeMCU ESP8266-12E Board。但在此之前,您需要安裝一些庫。
庫文件可以從這里下載:
2. OLED庫
4.簡單眨眼
第 7 步:編碼
/*
  
  ## Hardware Connections (ESP32 <- OLED <- MAX 30102):
  -VIN = 3.3V
  -GND = GND
  -SDA = 21 (or SDA)
  -SCL = 22 (or SCL)
*/
/*================================================================================================================================== */
char auth[] = "qjZaiBBH26yK40yj29wXwZ8LXOoeQmtR";  
char ssid[] = "nextpcb";      // Your WiFi Name (SSID) (**case sensitive).
char pass[] = "111222444"   // Your WiFi Password.
/*================================================================================================================================== */
//DiY Projects Lab
#define BLYNK_PRINT Serial
#include  
#include  
#include  
#include  //OLED libraries 
#include  
#include  
#include "MAX30105.h" //sparkfun MAX3010X library
//#include "heartRate.h"
SimpleTimer timer;
MAX30105 particleSensor;
#define INTERVAL_MESSAGE2 60000
unsigned long time_2 = 0;
int period = 2000;
unsigned long time_now = 0;
double avered = 0;
double aveir = 0;
double sumirrms = 0;
double sumredrms = 0;
int i = 0;
int Num = 100; //calculate SpO2 by this sampling interval
int oxygen;
double ESpO2 = 95.0;    //initial value of estimated SpO2
double FSpO2 = 0.7;     //filter factor for estimated SpO2
double frate = 0.95;    //low pass filter for IR/red LED value to eliminate AC component
#define TIMETOBOOT 3000 // wait for this time(msec) to output SpO2
#define SCALE 88.0      //adjust to display heart beat and SpO2 in the same scale
#define SAMPLING 5      //if you want to see heart beat more precisely , set SAMPLING to 1
#define FINGER_ON 3000  // if red signal is lower than this , it indicates your finger is not on the sensor
#define MINIMUM_SPO2 0.0
const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE];    //Array of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last beat occurred
float beatsPerMinute;
int beatAvg;
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1    // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Declaring the display name (display)
//Logo2 and Logo3 are two bmp pictures that display on the OLED if called
static const unsigned char PROGMEM logo2_bmp[] =
{ 0x03, 0xC0, 0xF0, 0x06, 0x71, 0x8C, 0x0C, 0x1B, 0x06, 0x18, 0x0E, 0x02, 0x10, 0x0C, 0x03, 0x10,
  0x04, 0x01, 0x10, 0x04, 0x01, 0x10, 0x40, 0x01, 0x10, 0x40, 0x01, 0x10, 0xC0, 0x03, 0x08, 0x88,
  0x02, 0x08, 0xB8, 0x04, 0xFF, 0x37, 0x08, 0x01, 0x30, 0x18, 0x01, 0x90, 0x30, 0x00, 0xC0, 0x60,
  0x00, 0x60, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x1B, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x04, 0x00,
};
static const unsigned char PROGMEM logo3_bmp[] =
    {0x01, 0xF0, 0x0F, 0x80, 0x06, 0x1C, 0x38, 0x60, 0x18, 0x06, 0x60, 0x18, 0x10, 0x01, 0x80, 0x08,
     0x20, 0x01, 0x80, 0x04, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x08, 0x03,
     0x80, 0x00, 0x08, 0x01, 0x80, 0x00, 0x18, 0x01, 0x80, 0x00, 0x1C, 0x01, 0x80, 0x00, 0x14, 0x00,
     0x80, 0x00, 0x14, 0x00, 0x80, 0x00, 0x14, 0x00, 0x40, 0x10, 0x12, 0x00, 0x40, 0x10, 0x12, 0x00,
     0x7E, 0x1F, 0x23, 0xFE, 0x03, 0x31, 0xA0, 0x04, 0x01, 0xA0, 0xA0, 0x0C, 0x00, 0xA0, 0xA0, 0x08,
     0x00, 0x60, 0xE0, 0x10, 0x00, 0x20, 0x60, 0x20, 0x06, 0x00, 0x40, 0x60, 0x03, 0x00, 0x40, 0xC0,
     0x01, 0x80, 0x01, 0x80, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x30, 0x0C, 0x00,
     0x00, 0x08, 0x10, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x01, 0x80, 0x00};
#define USEFIFO
void setup()
{
  Serial.begin(115200);
  Serial.println("Initializing...");
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Start the OLED display
  display.display();
  display.clearDisplay();
  Blynk.begin(auth, ssid, pass);
  // Initialize sensor
  while (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
  {
    Serial.println("MAX30102 was not found. Please check wiring/power/solder jumper at MH-ET LIVE MAX30102 board. ");
    //while (1);
  }
  Serial.println("Place your index finger on the sensor with steady pressure.");
  //Setup to sense a nice looking saw tooth on the plotter
  byte ledBrightness = 255; // 0x7F Options: 0=Off to 255=50mA
  byte sampleAverage = 4;   //Options: 1, 2, 4, 8, 16, 32
  byte ledMode = 2;         //Options: 1 = Red only, 2 = Red + IR, 3 = Red + IR + Green
  int sampleRate = 400;     //1000 is best but needs processing power//Options: 50, 100, 200, 400, 800, 1000, 1600, 3200
  int pulseWidth = 411;     //Options: 69, 118, 215, 411
  int adcRange = 16384;     //Options: 2048, 4096, 8192, 16384
  // Set up the wanted parameters
  particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange); //Configure sensor with these settings
  particleSensor.enableDIETEMPRDY();
  timer.setInterval(500, sendUptime);
}
void sendUptime()
{
  Blynk.virtualWrite(V4, oxygen);
  //Blynk.virtualWrite(V5, beatAvg);
}
void loop()
{
  Blynk.run();
  timer.run(); // Initiates SimpleTimer
  uint32_t ir, red, green;
  double fred, fir;
  double SpO2 = 0; //raw SpO2 before low pass filtered
#ifdef USEFIFO
  particleSensor.check(); //Check the sensor, read up to 3 samples
  while (particleSensor.available())
  { //do we have new data
#ifdef MAX30105
    red = particleSensor.getFIFORed(); //Sparkfun's MAX30105
    ir = particleSensor.getFIFOIR();   //Sparkfun's MAX30105
#else
    red = particleSensor.getFIFOIR(); //why getFOFOIR output Red data by MAX30102 on MH-ET LIVE breakout board
    ir = particleSensor.getFIFORed(); //why getFIFORed output IR data by MAX30102 on MH-ET LIVE breakout board
#endif
    i++;
    fred = (double)red;
    fir = (double)ir;
    avered = avered * frate + (double)red * (1.0 - frate); //average red level by low pass filter
    aveir = aveir * frate + (double)ir * (1.0 - frate);    //average IR level by low pass filter
    sumredrms += (fred - avered) * (fred - avered);        //square sum of alternate component of red level
    sumirrms += (fir - aveir) * (fir - aveir);             //square sum of alternate component of IR level
    if ((i % SAMPLING) == 0)
    { //slow down graph plotting speed for arduino Serial plotter by thin out
      if (millis() > TIMETOBOOT)
      {
        if (ir < FINGER_ON)
          ESpO2 = MINIMUM_SPO2; //indicator for finger detached
        //float temperature = particleSensor.readTemperatureF();
        if (ESpO2 <= -1)
        {
          ESpO2 = 0;
        }
        if (ESpO2 > 100)
        {
          ESpO2 = 100;
        }
        oxygen = ESpO2;
        Serial.print(" Oxygen % = ");
        Serial.println(oxygen);
      }
    }
    if ((i % Num) == 0)
    {
      double R = (sqrt(sumredrms) / avered) / (sqrt(sumirrms) / aveir);
      // Serial.println(R);
      SpO2 = -23.3 * (R - 0.4) + 100;               //http://ww1.microchip.com/downloads/jp/AppNotes/00001525B_JP.pdf
      ESpO2 = FSpO2 * ESpO2 + (1.0 - FSpO2) * SpO2; //low pass filter
      //Serial.print(SpO2); Serial.print(","); Serial.println(ESpO2);
      sumredrms = 0.0;
      sumirrms = 0.0;
      i = 0;
      break;
    }
    particleSensor.nextSample(); //We're finished with this sample so move to next sample
    //Serial.println(SpO2);
  }
  long irValue = particleSensor.getIR();
  //Serial.println(irValue);
  if (irValue > 7000)
  {                                                     //If a finger is detected
    display.clearDisplay();                             //Clear the display
    display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE); //Draw the first bmp picture (little heart)
    display.setTextSize(2);                             //Near it display the average BPM you can display the BPM if you want
    display.setTextColor(WHITE);
    display.setCursor(50, 15);
    display.println("SpO2");
    display.setCursor(50, 50);
    //display.println(beatAvg);
    display.print(oxygen);
    display.println("%");
    display.display();
  }
  if (irValue == true)
  {
    display.clearDisplay();                             //Clear the display
    display.drawBitmap(0, 0, logo3_bmp, 32, 32, WHITE); //Draw the second picture (bigger heart)
    display.setTextSize(2);                             //And still displays the average BPM
    display.setTextColor(WHITE);
    display.setCursor(50, 15);
    display.println("SpO2");
    display.setCursor(50, 50);
    //display.println(beatAvg);
    display.print(oxygen);
    display.println("%");
    display.display();
   
  }
  if (irValue < 7000)
  { //If no finger is detected it inform the user and put the average BPM to 0 or it will be stored for the next measure
    //beatAvg=0;
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(30, 10);
    display.println("WiFi Connected ");
    display.setCursor(30, 25);
    display.println("Please Place ");
    display.setCursor(30, 4
    0);
    display.println("your Finger ");
    
    display.display();
  }
  if (millis() > time_2 + INTERVAL_MESSAGE2 && oxygen < 93)
  {
    time_2 = millis();
    Blynk.notify("Alert! Oxygen Saturation below 93% Detected");
    Serial.print("Alert called");
  }
#endif
}
		第 8 步:從 MAX30100 ESP32 輸出 Blynk 上的觀察值和讀取值

在 Android 應(yīng)用程序上,BPM 和 SpO2 值會在一秒鐘后上傳,您可以看到儀表和顯示參數(shù)的變化。
訪問我的網(wǎng)站DiY Projects Lab擁有超過 25 個很棒的詳細(xì)項(xiàng)目
第 9 步:DIY 和購買
我將我的血氧儀與專業(yè)血氧儀進(jìn)行了比較,它顯示出幾乎 99% 的準(zhǔn)確度。
謝謝 NextPCB:這個項(xiàng)目之所以順利完成,是因?yàn)橛?NextPCB 的幫助和支持。
伙計(jì)們,如果您有 PCB 項(xiàng)目,請?jiān)L問他們的網(wǎng)站并獲得令人興奮的折扣和優(yōu)惠券。
1. PCB 訂單最高可享受 30% 的折扣
2. PCBA 訂單最高 20% 折扣
?
- 使用MSP430的單芯片脈搏血氧儀設(shè)計(jì)
 - CN243-緊湊型扁平結(jié)構(gòu)脈搏血氧儀主系統(tǒng)
 - 智能脈搏血氧儀(IoT)的構(gòu)建
 - CN243 - 緊湊型扁平結(jié)構(gòu)脈搏血氧儀主系統(tǒng)
 - WizFi360 EVB Mini脈搏血氧儀開源
 - 用于健身和醫(yī)療應(yīng)用脈搏血氧儀 8次下載
 - 智能連接的脈搏血氧儀解決方案 6次下載
 - DIY心率監(jiān)測器和脈搏血氧儀
 - ESP8266脈搏血氧儀Blynk BPM
 - 如何快速設(shè)計(jì)脈搏血氧儀?德州儀器來支招!
 - 基于藍(lán)牙技術(shù)的便攜式脈搏血氧儀 56次下載
 - 指夾式脈搏血氧儀的拆解分析
 - 關(guān)于單片便攜式脈搏血氧飽和度測量儀的研制 49次下載
 - ADI病人監(jiān)護(hù)儀中的典型模塊 脈搏血氧儀解決方案 203次下載
 - 脈搏血氧飽和度檢測儀的研制
 
- YXC揚(yáng)興 有源石英晶體振蕩器,頻點(diǎn)24MHz,3225封裝,應(yīng)用于血氧儀 609次閱讀
 - ESP32能取代STM32嗎?哪個更好? 1.3w次閱讀
 - 血氧儀怎么看數(shù)據(jù)正常值是多少 1376次閱讀
 - ESP32-H2一款極低功耗的物聯(lián)網(wǎng)通信芯片 1970次閱讀
 - 如何將MAX30101WING脈搏血氧儀與MAX32630FTHR連接 1479次閱讀
 - 什么是ESP32-CAM攝像頭? 2.4w次閱讀
 - 如何使用MAX30102血氧心律脈搏傳感器量測心跳和血氧呢 6981次閱讀
 - 使用ESP32實(shí)現(xiàn)UDP通信的方法 6519次閱讀
 - ESP8266/ESP32自動下載原理 4741次閱讀
 - esp32物聯(lián)網(wǎng)的應(yīng)用實(shí)例 LoRa網(wǎng)關(guān)制作、觸屏DIY電視、Sygic導(dǎo)航HUD 6040次閱讀
 - 采用MSP430FG437微控制器實(shí)現(xiàn)非侵入式可視脈搏血氧計(jì)的設(shè)計(jì) 3747次閱讀
 - 采用ADuC7024精密模擬微控制器的ADI脈搏血氧儀解決方案 5275次閱讀
 - 血氧飽和度檢測儀移動采集終端的設(shè)計(jì)與實(shí)現(xiàn) 3253次閱讀
 - 便攜式脈動血氧計(jì)完整設(shè)計(jì)方案解析 3227次閱讀
 - 血氧探頭的工作原理 2.8w次閱讀
 
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
 - 1.06 MB | 532次下載 | 免費(fèi)
 - 2RK3399完整板原理圖(支持平板,盒子VR)
 - 3.28 MB | 339次下載 | 免費(fèi)
 - 3TC358743XBG評估板參考手冊
 - 1.36 MB | 330次下載 | 免費(fèi)
 - 4DFM軟件使用教程
 - 0.84 MB | 295次下載 | 免費(fèi)
 - 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
 - 6.40 MB | 227次下載 | 免費(fèi)
 - 6迪文DGUS開發(fā)指南
 - 31.67 MB | 194次下載 | 免費(fèi)
 - 7元宇宙底層硬件系列報告
 - 13.42 MB | 182次下載 | 免費(fèi)
 - 8FP5207XR-G1中文應(yīng)用手冊
 - 1.09 MB | 178次下載 | 免費(fèi)
 
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
 - 0.00 MB | 234315次下載 | 免費(fèi)
 - 2555集成電路應(yīng)用800例(新編版)
 - 0.00 MB | 33566次下載 | 免費(fèi)
 - 3接口電路圖大全
 - 未知 | 30323次下載 | 免費(fèi)
 - 4開關(guān)電源設(shè)計(jì)實(shí)例指南
 - 未知 | 21549次下載 | 免費(fèi)
 - 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
 - 0.00 MB | 15349次下載 | 免費(fèi)
 - 6數(shù)字電路基礎(chǔ)pdf(下載)
 - 未知 | 13750次下載 | 免費(fèi)
 - 7電子制作實(shí)例集錦 下載
 - 未知 | 8113次下載 | 免費(fèi)
 - 8《LED驅(qū)動電路設(shè)計(jì)》 溫德爾著
 - 0.00 MB | 6656次下載 | 免費(fèi)
 
總榜
- 1matlab軟件下載入口
 - 未知 | 935054次下載 | 免費(fèi)
 - 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
 - 78.1 MB | 537798次下載 | 免費(fèi)
 - 3MATLAB 7.1 下載 (含軟件介紹)
 - 未知 | 420027次下載 | 免費(fèi)
 - 4OrCAD10.5下載OrCAD10.5中文版軟件
 - 0.00 MB | 234315次下載 | 免費(fèi)
 - 5Altium DXP2002下載入口
 - 未知 | 233046次下載 | 免費(fèi)
 - 6電路仿真軟件multisim 10.0免費(fèi)下載
 - 340992 | 191187次下載 | 免費(fèi)
 - 7十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
 - 158M | 183279次下載 | 免費(fèi)
 - 8proe5.0野火版下載(中文版免費(fèi)下載)
 - 未知 | 138040次下載 | 免費(fèi)
 
	                電子發(fā)燒友App
	            
	        
	        
          
        
        
	                    
                        
                        
                        
                        
                        


創(chuàng)作
發(fā)文章
發(fā)帖  
提問  
發(fā)資料
發(fā)視頻
上傳資料賺積分
           
            
            
                
            
評論