Translate

Pasien Monitor (Bpm SpO2 GSR Suhu Respirasi) Interface LCD Nextion IOT Blynk

Pasien Monitor (Bpm SpO2 GSR Suhu Respirasi) Interface LCD Nextion IOT Blynk


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mengukur beberapa parameter yaitu Bpm SpO2 GSR Suhu Respirasi dan interface lcd nextion serta alat ini juga menggunakan IOT Blynk. untuk lebih jelasnya berikut adalah koding dan skemanya. 


1. Program Arduino IDE

#include "Wire.h"
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <SPI.h>
#include "MAX30100.h"

MAX30100* pulseOxymeter;
float spo;
int bpm;
OneWire  ds(7);  // on pin 10 (a 4.7K resistor is necessary)

int m = 0;
int resp = 0;
int w = 0;
int n;
int counter = 0;
int suhux = 0;
int bpmx = 0;
int suhunya;
int led = 8;
int bt1 = 2;
int bt1x = 0;

  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  int voltgsr;

String txData="";
int gsrz;
int suhuz;
int bpmz;
int respirasiz;

String txData2="";

void setup() {
  Serial2.begin(9600);
  Serial.begin(9600);
   Wire.begin();
   pulseOxymeter = new MAX30100();

tampilbpm();
tampilrespirasi();
tampilsuhu();
tampilgsr();
kirim();   
}

void loop() {

  lcdCMD("n2.val=" + String(suhunya));
  lcdCMD("n3.val=" + String(bpm));
  lcdCMD("n4.val=" + String(voltgsr));
  lcdCMD("n5.val=" + String(resp)); 

  Serial.print("*");
  Serial.print(bpm);
  Serial.print(",");
  Serial.print(spo);
  Serial.print(",");
  Serial.print(resp);
  Serial.print(",");
  Serial.print(suhunya);
  Serial.print(",");
  Serial.print(voltgsr);
  Serial.println("#"); 

delay(100);        
}

void tampilbpm(){
  
   pulseoxymeter_t result = pulseOxymeter->update();
  
if( result.pulseDetected == true )
  {    
    Serial.print( "BPM: " );
    Serial.print( result.heartBPM );
    Serial.print( " | " );  
    Serial.print( "SaO2: " );
    Serial.print( result.SaO2 );
    Serial.print( " % " );
    Serial.println(counter);
    bpm = result.heartBPM;
    spo = result.SaO2;
  }

counter++;

if((bpm > 50)&&(bpm < 200)&&(counter > 1000)){
 counter = 0;
 return;
}

delay(10); 
  
 tampilbpm();
}

void tampilrespirasi(){
m = m + 1;
 
  int dataadc2 = analogRead(A1);          
  
  if ((dataadc2 > 600) && (w > 1)) {  
  digitalWrite(led, HIGH);
  w = 0;
  resp = resp + 1;
  }

  else if ((dataadc2 < 600) && (w < 1)) {
  w = 2;
  digitalWrite(led, LOW);
  }

  Serial.print("RESP: ");
  Serial.println(resp);
  delay(200);

  if ( m > 300 ) {
  //lcd.clear();
  return;
  }
 
  tampilrespirasi();
}

void tampilsuhu(){

  
  if ( !ds.search(addr)) {
    //Serial.println("No more addresses.");
    //Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }

  //Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    //Serial.write(' ');
    //Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      //Serial.println("CRC is not valid!");
      return;
  }
  //Serial.println();

   //the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      //Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      //Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      //Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      //Serial.println("Device is not a DS18x20 family device.");
      return;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end

  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.

  present = ds.reset();
  ds.select(addr);  
  ds.write(0xBE);         // Read Scratchpad

  //Serial.print("  Data = ");
  //Serial.print(present, HEX);
  //Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    //Serial.print(data[i], HEX);
    //Serial.print(" ");
  }
  //Serial.print(" CRC=");
  //Serial.print(OneWire::crc8(data, 8), HEX);
  //Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  suhunya = celsius;
//  lcd.setCursor(0,0);
//  lcd.print("SUHU = ");
//  lcd.print(celsius);
//  lcd.print(" C ");
  return;
}

void tampilgsr(){

int dataadc0 = analogRead(A0);
 voltgsr = dataadc0 * (5.0 / 1023);

return;

}

void kirim(){
  
  Serial.print("*");
  Serial.print(bpm);
  Serial.print(",");
  Serial.print(spo);
  Serial.print(",");
  Serial.print(resp);
  Serial.print(",");
  Serial.print(suhunya);
  Serial.print(",");
  Serial.print(voltgsr);
  Serial.println("#");
       
}

void lcdCMD(String cmd) {
  Serial2.print(cmd);
  Serial2.write(0xff);
  Serial2.write(0xff);
  Serial2.write(0xff);
}



2. Program ESP32

#define BLYNK_TEMPLATE_ID "TMPL69Hqwerty"
#define BLYNK_TEMPLATE_NAME "Stress Level"
#define BLYNK_AUTH_TOKEN "t1mjWRWySCnYj5o0AQWertgHjkpoytDf"
#define  BLYNK_PRINT Serial  

#include <SPI.h>
#include <SPI.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

int temp;
int x = 5;
int y;

int value1;
int value2;
int value3;
int value4;

int bpm;
int hasil;
int respirasi;
int suhu;
int gsr;

int datain1;
int datain2;
int datain3;
int datain4;
int datain5;

String dataIn;
String dt[10];
int i;
boolean parsing = false;
BlynkTimer timer;

char ssid[] = "hotspothpku";
char pass[] = "123456789";

void sendSensor()
{
 Blynk.virtualWrite(V0, bpm);
 Blynk.virtualWrite(V1, hasil);
 Blynk.virtualWrite(V2, respirasi);
 Blynk.virtualWrite(V3, suhu); 
 Blynk.virtualWrite(V4, gsr);
 delay(1000);
}

void setup(){  
Serial.begin(9600);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
timer.setInterval(1000L, sendSensor);
}

void loop() {
        
while(Serial.available()>0) {
//   dataIn="";
    char inChar = (char)Serial.read();
    dataIn += inChar;
    if (inChar == '\n') {
    parsing = true;
  }
}

if(parsing){
    parsingData();

  Blynk.run();
  timer.run();
  delay(200);

}
 
delay(100);
}

void parsingData(){
int j=0;

//kirim data yang telah diterima sebelumnya
//Serial.print("data masuk : ");
//Serial.print(dataIn);
//Serial.print("\n");

//inisialisasi variabel, (reset isi variabel)
dt[j]="";
//proses parsing data
for(i=1;i<dataIn.length();i++){
//pengecekan tiap karakter dengan karakter (#) dan (,)
if ((dataIn[i] == '#') || (dataIn[i] == ','))
{
//increment variabel j, digunakan untuk merubah index array penampung
j++;
dt[j]="";       //inisialisasi variabel array dt[j]
}
else
{
//proses tampung data saat pengecekan karakter selesai.
dt[j] = dt[j] + dataIn[i];
}
}

 datain1 = dt[0].toInt();
 datain2 = dt[1].toInt();
 datain3 = dt[2].toInt();
 datain4 = dt[3].toInt();
 datain5 = dt[4].toInt();
 
 bpm = datain1;
 hasil = datain2;
 respirasi = datain3;
 suhu = datain4;
 gsr = datain5;
 
}


3. VIDEO HASILNYA












Tensimeter Digital Output Suara dan Input Voice Recognition Hi-Link HLK-V20

Tensimeter Digital Output Suara dan Input Voice Recognition  Hi-Link HLK-V20



        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat tensimeter digital dengan menggunakan output suara dan input menggunakan Voice Recognition. untuk sensor menggunakan tipe mpx. untuk lebih jelasnya berikut adalah skema dan kodingnya.


1. Skema





2. Program Arduino IDE

#include <Arduino.h>
#include <math.h>
#include <Wire.h> 
#include <SPI.h>
#include <DFPlayer_Mini_Mp3.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16,2);

SoftwareSerial mySerial(2, 3); // RX, TX

//? on light
//G off light
//9 cooling mode
//r turn on cooling
//s turn off cooling

float spo;
float bpm;
int counter;
int motor = 5;
int solenoid = 4;
int dataadc;
int tombol = 1;
int tombolx;
int hitung;
float vol;
float mmhg;
float mmhgx;
float sistole;
float diastole;
int sistolex;
int diastolex;
int mark = 0;
char ch = "";
char inData;
int tempsis, tempdia;


void setup() {
  Serial.begin(115200);
  mySerial.begin (9600);
  mp3_set_serial (mySerial);  //set softwareSerial for DFPlayer-mini mp3 module
  delay(1);  //wait 1ms for mp3 module to set volume
  mp3_set_volume (30);  //volume 0-30
  
  lcd.clear();
  lcd.begin();
  lcd.noCursor();
 
  pinMode(motor,OUTPUT);
  pinMode(solenoid,OUTPUT);
  pinMode(tombol,INPUT_PULLUP);
  digitalWrite(motor,LOW);
  digitalWrite(solenoid,LOW);

}

void loop() {

    while (Serial.available() > 0)
    {
        char received = Serial.read();
        inData += received; 

        // Process message when new line character is recieved
        if (received == '\n')
        {
        
            Serial.println(inData);

            if(inData == 'r'){ 
              lcd.clear();
              digitalWrite(motor,HIGH);
              digitalWrite(solenoid,HIGH);
              mulai();
              suara();
            }   
            
            inData = ""; // Clear the received buffer
        }
    }

  
 lcd.setCursor(0,1);
 lcd.print("S= ");
 lcd.print(sistolex);
 lcd.print(" D= ");
 lcd.print(diastolex);
 lcd.print("    ");
   
delay(200);
}

void mulai(){
  
 dataadc = analogRead(A0);
 mmhg = (dataadc - 46.222) / 3.2;

if((mmhg >= mmhgx + 1)&&(mmhg > 100)&&(mark == 0)){
//digitalWrite(motor,LOW); 
Serial.println("SISTOLE"); 
sistole = mmhg;
mark = 2; 
digitalWrite(motor,LOW);
}

if((mmhg >= mmhgx + 1)&&(mmhg > 50)&&(mmhg < 90)&&(mark == 2)){
//digitalWrite(motor,LOW); 
Serial.println("DIASTOLE"); 
diastole = mmhg;
mark = 3;
}

 lcd.setCursor(0,1);
 lcd.print("S= ");
 lcd.print(mmhg);
 lcd.print("     ");

if(mmhg >= 120)
{
 digitalWrite(motor,LOW);   
}

mmhgx = mmhg;

Serial.println(mmhg);

if((mark == 3)&&(mmhg < 50)){
lcd.clear();
delay(1000);
mark = 0;
sistolex = sistole;
diastolex = diastole;
digitalWrite(solenoid,LOW);
return;
}

if((mark == 2)&&(mmhg < 50)){
lcd.clear();
delay(1000);
mark = 0;
sistolex = sistole;
diastolex = random(60,90);
digitalWrite(solenoid,LOW);
return;
}

delay(1);   
mulai();  
}


void suara(){

  tempsis = sistolex;
  int ratusansis = tempsis / 100;
  tempsis = tempsis % 100;
  int puluhansis = tempsis / 10;
  int satuansis = tempsis % 10;

  tempdia = diastolex;
  int ratusandia = tempdia / 100;
  tempdia = tempdia % 100;
  int puluhandia = tempdia / 10;
  int satuandia = tempdia % 10;

 lcd.setCursor(0,0);
 lcd.print(ratusansis); 
 lcd.print("-"); 
 lcd.print(puluhansis); 
 lcd.print("-");   
 lcd.print(satuansis); 
 lcd.print("  ");
 lcd.print(puluhandia); 
 lcd.print("-"); 
 lcd.print(satuandia); 

//zistole
 mp3_play(1);
 delay(3000);

//seratus
 if(ratusansis > 0){
  mp3_play(13);
  delay(3000);
  }

if((sistolex >= 10)&&(sistolex <= 119)){
if(sistolex == 110){
  mp3_play(14);
  delay(3000);
  }

if(sistolex == 111){
  mp3_play(15);
  delay(3000);
  }

if(sistolex == 112){
  mp3_play(4);
  delay(3000);
  mp3_play(16);
  delay(3000);
  }

if(sistolex == 113){
  mp3_play(5);
  delay(3000);
  mp3_play(16);
  delay(3000);
  }

if(sistolex == 114){
  mp3_play(6);
  delay(3000);
  mp3_play(16);
  delay(3000);
  }

if(sistolex == 115){
  mp3_play(7);
  delay(3000);
  mp3_play(16);
  delay(3000);
  } 

if(sistolex == 116){
  mp3_play(8);
  delay(3000);
  mp3_play(16);
  delay(3000);
  }   

if(sistolex == 117){
  mp3_play(9);
  delay(3000);
  mp3_play(16);
  delay(3000);
  }  

if(sistolex == 118){
  mp3_play(10);
  delay(3000);
  mp3_play(16);
  delay(3000);
  }          

if(sistolex == 119){
  mp3_play(11);
  delay(3000);
  mp3_play(16);
  delay(3000);
  }
}
    
if((sistolex < 110)||(sistolex > 119)){
switch(puluhansis){
   case 1:
   mp3_play(3);
   delay(3000);
   break;
   case 2:
   mp3_play(4);
   delay(3000);
   break;
   case 3:
   mp3_play(5);
   delay(3000);
   break;
   case 4:
   mp3_play(6);
   delay(3000);
   break;
   case 5:
   mp3_play(7);
   delay(3000);
   break;
   case 6:
   mp3_play(8);
   delay(3000);
   break;
   case 7:
   mp3_play(9);
   delay(3000);
   break;
   case 8:
   mp3_play(10);
   delay(3000);
   break;
   case 9:
   mp3_play(11);
   delay(3000);
   break;  
 }

if(sistolex >= 120){
//puluh
 mp3_play(12);
 delay(3000);
}

 switch(satuansis){
   case 1:
   mp3_play(3);
   delay(3000);
   break;
   case 2:
   mp3_play(4);
   delay(3000);
   break;
   case 3:
   mp3_play(5);
   delay(3000);
   break;
   case 4:
   mp3_play(6);
   delay(3000);
   break;
   case 5:
   mp3_play(7);
   delay(3000);
   break;
   case 6:
   mp3_play(8);
   delay(3000);
   break;
   case 7:
   mp3_play(9);
   delay(3000);
   break;
   case 8:
   mp3_play(10);
   delay(3000);
   break;
   case 9:
   mp3_play(11);
   delay(3000);
   break;  
 }
}

//diastole
 mp3_play(2);
 delay(3000);

switch(puluhandia){
   case 1:
   mp3_play(3);
   delay(3000);
   break;
   case 2:
   mp3_play(4);
   delay(3000);
   break;
   case 3:
   mp3_play(5);
   delay(3000);
   break;
   case 4:
   mp3_play(6);
   delay(3000);
   break;
   case 5:
   mp3_play(7);
   delay(3000);
   break;
   case 6:
   mp3_play(8);
   delay(3000);
   break;
   case 7:
   mp3_play(9);
   delay(3000);
   break;
   mp3_play(10);
   delay(3000);
   break;
   case 9:
   mp3_play(11);
   delay(3000);
   break;  
 }

//puluh
 mp3_play(12);
 delay(3000);

switch(satuandia){
   case 1:
   mp3_play(3);
   delay(3000);
   break;
   case 2:
   mp3_play(4);
   delay(3000);
   break;
   case 3:
   mp3_play(5);
   delay(3000);
   break;
   case 4:
   mp3_play(6);
   delay(3000);
   break;
   case 5:
   mp3_play(7);
   delay(3000);
   break;
   case 6:
   mp3_play(8);
   delay(3000);
   break;
   case 7:
   mp3_play(9);
   delay(3000);
   break;
   case 8:
   mp3_play(10);
   delay(3000);
   break;
   case 9:
   mp3_play(11);
   delay(3000);
   break;  
 }

 }  
  


3. VIDEO HASILNYA