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
.jpeg)









