Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Arduino zuurstofsaturatie & lichaamstemperatuur monitor – Dual-sensorsysteem

Onderdelen en benodigdheden

Onderdeel Aantal
Arduino UNO 1
20x4 I2C LCD-display 1
MAX30102 Hartslag-/SpO₂-sensor 1
2x LED (rood/groen voor alarm) 1
2x 220 Ω weerstand 1
GY-906-BCC MLX90614 Contactloze IR-temperatuursensor 1
Breadboard 830 gaten 1

Over dit project

Deze meetopstelling meet gelijktijdig de zuurstofsaturatie (SpO₂) en de lichaamstemperatuur. Waarden onder de ingestelde drempel (SpO₂ < 90% of temperatuur > 37°C) activeren een rode alarm-LED; normale waarden een groene LED.

Belangrijke gebruiksvoorschriften

  • Plaats de vinger licht op de MAX30102-sensor – te veel druk geeft afwijkende metingen.
  • De sensor heeft een paar seconden nodig om te stabiliseren.
  • Laatste metingen worden in EEPROM opgeslagen en bij herstart getoond.

Componenten & koppelingen

  • Arduino UNO
  • 20x4 I2C LCD (adres 0x27)
  • MAX30102 (I2C, 0x57) – gebruikt SparkFun MAX3010x-bibliotheek
  • MLX90614 (I2C, 0x5A) – Adafruit MLX90614-bibliotheek
  • Groene LED op D8, rode LED op D9 (elk met 220 Ω naar GND)

Code

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <EEPROM.h>
#include "MAX30105.h"

MAX30105 particleSensor;
LiquidCrystal_I2C lcd(0x27, 20, 4);
Adafruit_MLX90614 mlx = Adafruit_MLX90614();

double avered = 0, aveir = 0, sumirrms = 0, sumredrms = 0;
int i = 0, Num = 100;
int Temperature = 0, temp = 0;
float ESpO2 = 95.0, ESpO2_ROM = 0;
double FSpO2 = 0.7, frate = 0.95;

#define TIMETOBOOT 3000
#define SCALE 88.0
#define SAMPLING 5
#define FINGER_ON 30000
#define USEFIFO
#define Greenled 8
#define Redled 9

void setup() {
  Serial.begin(115200);
  lcd.init(); lcd.backlight();
  lcd.setCursor(3,1); lcd.print("Running......"); delay(3000); lcd.clear();

  ESpO2 = readEEPROM();
  Temperature = EEPROM.read(6);
  pinMode(Greenled, OUTPUT); pinMode(Redled, OUTPUT);
  digitalWrite(Greenled, LOW); digitalWrite(Redled, LOW);

  while (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
    Serial.println("MAX30102 niet gevonden. Controleer bedrading/voeding.");
    delay(1000);
  }

  byte ledBrightness = 0x7F;
  byte sampleAverage = 4;
  byte ledMode = 2;
  int sampleRate = 200;
  int pulseWidth = 411;
  int adcRange = 16384;
  particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange);
  particleSensor.enableDIETEMPRDY();
  mlx.begin();
}

void loop() {
  uint32_t ir, red;
  double fred, fir, SpO2 = 0;

#ifdef USEFIFO
  particleSensor.check();
  while (particleSensor.available()) {
#ifdef MAX30105
    red = particleSensor.getFIFORed();
    ir  = particleSensor.getFIFOIR();
#else
    red = particleSensor.getFIFOIR();
    ir  = particleSensor.getFIFORed();
#endif
    i++;
    fred = (double)red; fir = (double)ir;
    avered = avered * frate + fred * (1.0 - frate);
    aveir  = aveir  * frate + fir  * (1.0 - frate);
    sumredrms += (fred - avered) * (fred - avered);
    sumirrms  += (fir  - aveir)  * (fir  - aveir);

    if ((i % SAMPLING) == 0) {
      if (millis() > TIMETOBOOT) {
        float ir_forGraph = (2.0 * fir - aveir) / aveir * SCALE;
        float red_forGraph = (2.0 * fred - avered) / avered * SCALE;
        ir_forGraph = constrain(ir_forGraph, 80.0, 100.0);
        red_forGraph = constrain(red_forGraph, 80.0, 100.0);
        Serial.print(red); Serial.print(","); Serial.print(ir); Serial.print(".");

        if (ir < FINGER_ON) {
          temp = Temperature;
          EEPROM.write(6, temp);
          ESpO2_ROM = ESpO2; writeEEPROM(&ESpO2_ROM);
          lcd.setCursor(0,2); lcd.print("Last test: "); lcd.setCursor(11,2); lcd.print(ESpO2_ROM); lcd.print("% ");
          lcd.setCursor(0,3); lcd.print("Last temp: "); lcd.setCursor(11,3); lcd.print(temp); lcd.print(" *C");
          break;
        }

        if (ir > FINGER_ON) {
          Temperature = mlx.readObjectTempC();
          lcd.setCursor(0,0); lcd.print("Oxygen % = "); lcd.setCursor(11,0); lcd.print(ESpO2); lcd.print("% ");
          lcd.setCursor(0,1); lcd.print("Temperature: "); lcd.print(Temperature); lcd.print(" *C");

          if (ESpO2 >= 90 && Temperature < 38) { digitalWrite(Redled, LOW); digitalWrite(Greenled, HIGH); }
          if (ESpO2 < 90 || Temperature > 37) { digitalWrite(Greenled, LOW); digitalWrite(Redled, HIGH); }
        }
      }
    }

    if ((i % Num) == 0) {
      double R = (sqrt(sumredrms) / avered) / (sqrt(sumirrms) / aveir);
      SpO2 = -23.3 * (R - 0.4) + 100;
      ESpO2 = FSpO2 * ESpO2 + (1.0 - FSpO2) * SpO2;
      sumredrms = sumirrms = 0.0; i = 0; break;
    }
    particleSensor.nextSample();
  }
#endif
}

void writeEEPROM(float *data) {
  byte ByteArray[4]; memcpy(ByteArray, data, 4);
  for(int x=0; x<4; x++) EEPROM.write(x, ByteArray[x]);
}

float readEEPROM() {
  float ESpO2 = 85.0; byte ByteArray[4];
  for(int x=0; x<4; x++) ByteArray[x] = EEPROM.read(x);
  memcpy(&ESpO2, ByteArray, 4); return ESpO2;
}

Schema

Zie de bijgevoegde schema-afbeelding voor de I2C-koppeling van beide sensoren, LCD en LED's.

Productieproces

  1. Raspberry Pi & HDC2010: Complete I2C Temperatuur & Vochtigheid Sensor Setup Gids
  2. Bouw Een Raspberry Pi Temperatuur Logger Met Een $5 I2C Sensor
  3. Een externe temperatuursensor bouwen met Raspberry Pi en Python – Stap-voor-stap handleiding
  4. Een Multi-sensor Temperatuur- & Lichtmonitoringssysteem Bouwen met Raspberry Pi & DS18B20
  5. Een Raspberry Pi thuistemperatuurmonitor bouwen met MCP9808, InfluxDB & Grafana
  6. Je vochtigheidssensor verifiëren en kalibreren voor nauwkeurige metingen
  7. Een Arduino-aangedreven Robot Bouwen met Raspberry Pi: Een Stap-voor-Stap Gids
  8. Progressieve Doorsnede Animatie Maken in SolidWorks – Stap-voor-Stap Tutorial
  9. Precisie lager temperatuursensor – Nauwkeurige detectie & monitoring
  10. DS18B20 Temperatuursensor – Precieze 1-Wire Digitale Thermometer voor Industriëel & Consumptief Gebruik
  11. De Complete Gids voor Glasvezelproductie