Делаем станцию мониторинга здоровья на Ардуино

Создаем контролируемую через Android-приложение, основанную на микроконтроллере Ардуино, станцию мониторинга здоровья. Данное устройство обеспечивает одновременные данные о t° тела, частоте сердечных сокращений, влажности в помещении и t° в нем.

Таким образом, проводная электроника с датчиками и приложением обеспечит простой способ контроля состояния здоровья и окружающей среды.

Комплектующие

Создавать станцию мониторинга здоровья мы начнем с перечисления всех необходимых нам деталей и программного обеспечения.

Итак, используем в этом проекте следующий аппаратные компоненты:

  • Arduino UNO & Genuino UNO × 1
  • Провода перемычки (общие) × 1
  • Датчик температуры и влажности DHT11 (3 контакта) × 1
  • Датчик температуры × 1
  • Резистор 10 кОм × 2
  • Модуль Bluetooth HC-05 × 1
  • Датчик сердечного ритма × 1

Программное обеспечение и сервисы:

Схема соединений

Сразу переходим к схеме соединения всех наших комплектующих.

Соединяйте все детали согласно схема изображенной на рисунке выше.

Собираем всё вместе

Подключение Ардуино и макета.

Датчик температуры для получения данных о температуре тела

Делаем приложение

После того как мы всё собрали наша задача сделать приложение через онлайн-решение, о котором мы написали выше - MIT App Inventor 2.

Теперь мы можем обратиться к нашему смартфону, на экране которого увидим процесс инициализации устройств, после чего всё будет готово к измерениям.

Далее станция мониторинга здоровья получает данные и выводит измерения на экран.

Код проекта

Код, необходимый для нашей станции мониторинга здоровья на Ардуино вы можете скачать или скопировать ниже.

#include <SoftwareSerial.h>
#include <cactus_io_AM2302.h>

#define AM2302_PIN 7

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
AM2302 dht(AM2302_PIN);


SoftwareSerial Bluetooth(10, 9);
String Data;
int pulsePin = 0;
int blinkPin = 13;
volatile int BPM;

volatile int Signal;

volatile int IBI = 600;

volatile boolean Pulse = false;

volatile boolean QS = false;

volatile int rate[10];                    
volatile unsigned long sampleCounter = 0;          
volatile unsigned long lastBeatTime = 0;           
volatile int P = 512;                     
volatile int T = 512;                     
volatile int thresh = 512;                
volatile int amp = 100;                   
volatile boolean firstBeat = true;        
volatile boolean secondBeat = false;      

void interruptSetup() {
  
  TCCR2A = 0x02;    
  TCCR2B = 0x06;   
  OCR2A = 0X7C;      
  TIMSK2 = 0x02;     
  sei();            
}

ISR(TIMER2_COMPA_vect) {                        
  cli();                                      
  Signal = analogRead(pulsePin);              
  sampleCounter += 2;                         
  int N = sampleCounter - lastBeatTime;       

  if (Signal < thresh && N > (IBI / 5) * 3) { 
    if (Signal < T) {                       
      T = Signal;                         
    }
  }

  if (Signal > thresh && Signal > P) {       
    P = Signal;                            
  }                                        

  if (N > 250) {                                  
    if ( (Signal > thresh) && (Pulse == false) && (N > (IBI / 5) * 3) ) {
      Pulse = true;                               
      digitalWrite(blinkPin, HIGH);               
      IBI = sampleCounter - lastBeatTime;        
      lastBeatTime = sampleCounter;               

      if (secondBeat) {                      
        secondBeat = false;                  
        for (int i = 0; i <= 9; i++) {       
          rate[i] = IBI;
        }
      }

      if (firstBeat) {                       
        firstBeat = false;                   
        secondBeat = true;                   
        sei();                               
        return;                              
      }      
      word runningTotal = 0;                  

      for (int i = 0; i <= 8; i++) {          
        rate[i] = rate[i + 1];                
        runningTotal += rate[i];              
      }

      rate[9] = IBI;                          
      runningTotal += rate[9];                
      runningTotal /= 10;                     
      BPM = 60000 / runningTotal;             
      QS = true;                              
    }
  }

  if (Signal < thresh && Pulse == true) {  
    digitalWrite(blinkPin, LOW);           
    Pulse = false;                         
    amp = P - T;                           
    thresh = amp / 2 + T;                  
    P = thresh;                            
    T = thresh;
  }

  if (N > 2500) {                          
    thresh = 512;                          
    P = 512;                               
    T = 512;                               
    lastBeatTime = sampleCounter;          
    firstBeat = true;                      
    secondBeat = false;                    
  }

  sei();                                   
}

void setup() {
  Bluetooth.begin(9600);
  Serial.begin(9600);
  dht.begin();
  sensors.begin();
  interruptSetup();
}

void loop() {
  sensors.requestTemperatures();
  dht.readHumidity();
  dht.readTemperature();
  if (isnan(dht.humidity) || isnan(dht.temperature_C)) {
    return;
  }
  if (QS == true) {
    
    Serial.print(sensors.getTempCByIndex(0)); Serial.print(" "); Serial.print(dht.temperature_C); Serial.print(" "); Serial.print(dht.humidity); Serial.print(" "); Serial.println(BPM);
    
    Bluetooth.print(sensors.getTempCByIndex(0)); Bluetooth.print(" "); Bluetooth.print(dht.temperature_C); Bluetooth.print(" "); Bluetooth.print(dht.humidity); Bluetooth.print(" "); Bluetooth.println(BPM);

    QS = false;

  }


  delay(1500);
}

На этом всё. Будьте здоровы!

Ардуино+