Translate

Monitor Suhu Tubuh + BPM + TENSIMETER via Bluetooth Android Sensor MAX30100 dan MLX90614


 Monitor Suhu Tubuh + BPM + TENSIMETER via Bluetooth Android Sensor MAX30100 dan MLX90614
 

             Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor suhu tubuh, bpm dan tensi via bluetooth android. alat ini memang sangat cocok untuk digunakan sebagai alat pengecekan karena mudah dibawa dan juga terdapat fitur bluetooth sehingga bisa dimonitor melalui HP Android. untuk lebih jelasnya berikut adalah daftar komponen dan programnya. 

 
 
a. Arduino Uno




b. MAX30100




c. MLX90614




d. Driver Pompa dan Solenoid




e. Bluetooth HC-05




f. LCD I2C




g. MPX5050GP


h. Koding Android

 


 

I. Program Arduino IDE

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_MLX90614.h>  
#include <MAX30100_PulseOximeter.h>
#define REPORTING_PERIOD_MS 5000
#include "MAX30100.h" //library sensor

LiquidCrystal_I2C lcd(0x27,16,2); //library lcd

MAX30100* pulseOxymeter;   //library

int cacah; //membuat variabel
int spo;
float bpm;
Adafruit_MLX90614 mlx = Adafruit_MLX90614();

float TargetC;
int motor = 8;
int solenoid = 9;
int dataadc;
//int tombol = D4;
int tombolx;
int hitung;
float vol;
float mmhg;
float mmhgx;
int sistole;
int diastole;
int sistolex;
int diastolex;
int mark = 0;
int bttensi = 10;
int suhunya;
int bpmku;

PulseOximeter pox;

uint32_t tsLastReport = 0;
String hrData = "";
void onBeatDetected()
{
//    Serial.println("Beat!");
}

void setup() {
  Wire.begin();
  mlx.begin();
  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(6,HIGH);
  digitalWrite(7,HIGH);
  pinMode(motor,OUTPUT);
  pinMode(solenoid,OUTPUT);
  pinMode(bttensi,INPUT_PULLUP);

  digitalWrite(motor,LOW);
  digitalWrite(solenoid,LOW);

   //Serial.print("Initializing pulse oximeter..");
 
    if (!pox.begin()) {
        //Serial.println("FAILED");
        for(;;);
    } else {
        //Serial.println("SUCCESS");
    }
 
   pox.setIRLedCurrent(MAX30100_LED_CURR_11MA);
   pox.setOnBeatDetectedCallback(onBeatDetected);
 
}
   
void loop(){
 
   pox.update();
    
   if (millis() - tsLastReport > REPORTING_PERIOD_MS) {

       bpm = pox.getHeartRate();
       spo = pox.getSpO2();
       bpmku = bpm;
       
       lcd.setCursor(0,1);
       lcd.print("Bpm: ");
       lcd.print(pox.getHeartRate());
       lcd.print("     ");
       
    tsLastReport = millis();
}

mlx.begin();
TargetC = mlx.readObjectTempC();
suhunya = TargetC;

lcd.setCursor(0,0);
lcd.print("S=");
lcd.print(suhunya);
lcd.print("/");
lcd.print(sistole);
lcd.print("/");
lcd.print(diastole);
lcd.print("   ");

int bttensix = digitalRead(bttensi);

if(bttensix == 0){
 lcd.clear();
 delay(3000);
 mulai();
}

delay(1);

cacah++;

if(cacah >= 10){
cacah = 0;
 
/*
Serial.print("*");
Serial.print(suhunya);
Serial.print(",");
Serial.print(bpmku);
Serial.print(",");
Serial.print(sistole);
Serial.print(",");
Serial.print(diastole);
Serial.println("#");
*/

Serial.print("Suhu= ");
Serial.println(suhunya);
Serial.print("Bpm= ");
Serial.println(bpm);
Serial.print("Sistole= ");
Serial.println(sistole);
Serial.print("Diastole= ");
Serial.println(diastole);

}

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

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

if((mmhg >= mmhgx + 5)&&(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 >= 150)
{
 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;  
}

delay(1);   
mulai();  
}


 
 
 j. VIDEO HASILNYA



 

Monitor Suhu Tubuh + BPM + TENSIMETER via Bluetooth Android Sensor MAX30102 dan MLX90614

Monitor Suhu Tubuh + BPM + TENSIMETER via Bluetooth Android Sensor MAX30102 dan MLX90614
 
      
         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor suhu tubuh, bpm dan tensi via bluetooth android. alat ini memang sangat cocok untuk digunakan sebagai alat pengecekan karena mudah dibawa dan juga terdapat fitur bluetooth sehingga bisa dimonitor melalui HP Android. untuk lebih jelasnya berikut adalah daftar komponen dan programnya.  



a. Arduino Uno




b. MAX30102




c. MLX90614




d. Driver Pompa dan Solenoid




e. Bluetooth HC-05




f. LCD I2C




g. MPX5050GP


h. Koding Android

 


i. Program Arduino IDE

#include <Wire.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_MLX90614.h>  
#include "MAX30105.h"
#include "heartRate.h"

LiquidCrystal_I2C lcd(0x27,16,2); //library lcd

int cacah; //membuat variabel
int spo;
float bpm;
Adafruit_MLX90614 mlx = Adafruit_MLX90614();

float TargetC;
int motor = 8;
int solenoid = 9;
int dataadc;
//int tombol = D4;
int tombolx;
int hitung;
float vol;
float mmhg;
float mmhgx;
int sistole;
int diastole;
int sistolex;
int diastolex;
int mark = 0;
int bttensi = 10;
int suhunya;
int bpmku;

MAX30105 particleSensor;

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;
int counter;

void setup() {
  Wire.begin();
  mlx.begin();
  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(6,HIGH);
  digitalWrite(7,HIGH);
  pinMode(motor,OUTPUT);
  pinMode(solenoid,OUTPUT);
  pinMode(bttensi,INPUT_PULLUP);

  digitalWrite(motor,LOW);
  digitalWrite(solenoid,LOW);

  //Serial.println("Initializing...");

  // Initialize sensor
  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
  {
    //Serial.println("MAX30105 was not found. Please check wiring/power. ");
    while (1);
  }
    //Serial.println("Place your index finger on the sensor with steady pressure.");

  particleSensor.setup(); //Configure sensor with default settings
  particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
  particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED

}
   
void loop(){
 
long irValue = particleSensor.getIR();

  if (checkForBeat(irValue) == true)
  {
    //We sensed a beat!
    long delta = millis() - lastBeat;
    lastBeat = millis();

    beatsPerMinute = 60 / (delta / 1000.0);

    if (beatsPerMinute < 255 && beatsPerMinute > 20)
    {
      rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
      rateSpot %= RATE_SIZE; //Wrap variable

      //Take average of readings
      beatAvg = 0;
      for (byte x = 0 ; x < RATE_SIZE ; x++)
        beatAvg += rates[x];
      beatAvg /= RATE_SIZE;
    }
  }

mlx.begin();
TargetC = mlx.readObjectTempC();
suhunya = TargetC;

lcd.setCursor(0,0);
lcd.print("S=");
lcd.print(suhunya);
lcd.print("/");
lcd.print(sistole);
lcd.print("/");
lcd.print(diastole);
lcd.print("   ");

lcd.setCursor(0,1);
lcd.print("Bpm= ");
lcd.print(beatsPerMinute);
lcd.print("    ");
//lcd.print(cacah);

//delay(10);

int bttensix = digitalRead(bttensi);

if(bttensix == 0){
 lcd.clear();
 delay(3000);
 mulai();
}

delay(1);

cacah++;

if(cacah >= 10){
cacah = 0;
 
/*
Serial.print("*");
Serial.print(suhunya);
Serial.print(",");
Serial.print(bpmku);
Serial.print(",");
Serial.print(sistole);
Serial.print(",");
Serial.print(diastole);
Serial.println("#");
*/

Serial.print("Suhu= ");
Serial.println(suhunya);
Serial.print("Bpm= ");
Serial.println(beatsPerMinute);
Serial.print("Sistole= ");
Serial.println(sistole);
Serial.print("Diastole= ");
Serial.println(diastole);
}

}
 

void mulai(){ 

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

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

if((mmhg >= mmhgx + 5)&&(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 >= 150)
{
 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;  
}

delay(1);   
mulai();  
}




j. VIDEO HASILNYA
 




Alat Kendali Servo dan Monitor Jarak HC-SRF04 + SMS Gateway

 Alat Kendali Servo dan Monitor Jarak HC-SRF04 + SMS Gateway
 

            Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mengendalikan posisi servo dan monitor jarak serta alat ini juga bisa melakukan sms jika jarak kurang dari 10 cm. untuk lebih jelasnya berikut adalah program dan daftar komponennya.  


a. Arduino Uno




b. Motor Servo
 

 
 
c. Sensor Jarak HC-SRF04
 

 
 
d. Modul SMS SIM900A



e. Program Arduino IDE

#include "SIM900.h"
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Servo.h>

#define trigPin1 6
#define echoPin1 7

#include "sms.h"
SMSGSM sms;

long duration1, distance1;
Servo myservo1;
int relay1 = 4;
int relay2 = 5;
int buzzer = 10;

int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];

void setup() {
Serial.begin(9600);

     Serial.println("GSM Shield testing.");
     //Start configuration of shield with baudrate.
     //For http uses is raccomanded to use 4800 or slower.
     if (gsm.begin(2400)) {
          Serial.println("\nstatus=READY");
          started=true;
     } else Serial.println("\nstatus=IDLE");

     if(started) {
          //Enable this two lines if you want to send an SMS.
          if (sms.SendSMS("085733400808", "Alat Ready"))
          Serial.println("\nSMS sent OK");
     }

pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
myservo1.attach(9);
myservo1.write(100);
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
digitalWrite(relay1,HIGH);
digitalWrite(relay2,HIGH);
pinMode(buzzer,OUTPUT);
digitalWrite(buzzer,HIGH);
}

void loop() {
    
//goreng krupuk
myservo1.write(100);
delay(3000);
digitalWrite(relay1,LOW);
delay(20000);

//angkat krupuk
digitalWrite(relay1,HIGH);
delay(1000);
myservo1.write(150);
delay(3000);

digitalWrite(trigPin1, LOW);  // Added this line
delayMicroseconds(2); // Added this line
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10); // Added this line
digitalWrite(trigPin1, LOW);
duration1 = pulseIn(echoPin1, HIGH);
distance1 = (duration1/2) / 29.1;

Serial.println(distance1);  

if(distance1 < 10){
if (sms.SendSMS("085733400808", "Tempat Krupuk Penuh"))
Serial.println("\nSMS sent OK");
digitalWrite(buzzer,LOW);
berhenti();
}

if(distance1 > 10){
digitalWrite(buzzer,HIGH);
}

}

void berhenti(){

digitalWrite(trigPin1, LOW);  // Added this line
delayMicroseconds(2); // Added this line
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10); // Added this line
digitalWrite(trigPin1, LOW);
duration1 = pulseIn(echoPin1, HIGH);
distance1 = (duration1/2) / 29.1;

Serial.println(distance1);  

myservo1.write(100);
digitalWrite(relay1,HIGH);

if(distance1 > 10){
  return;
}

berhenti();  
}




f. VIDEO HASILNYA




 
 

Monitor Water Flow dan Pressure Menggunakan SMS Gateway

 Monitor Water Flow dan Pressure Menggunakan SMS Gateway
 

             Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor flow air dan tekanan udara atau air secara bersamaan dengan menggunakan SMS gateway. alat ini menggunakan 2 buah sensor dan satu arduino serta modul sim900A. untuk lebih jelasnya berikut adalah proram dan daftar komponennya.

 

a. Arduino Uno




b. Sensor Water Flow
 

 
 
c. Sensor Pressure




d. LCD 16x2




e. Sim900A



f. Program Arduino IDE

#include "SIM900.h"
#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16,2);

int dataadc;
int x;
float v;
float kpa;

#include "sms.h"
SMSGSM sms;

byte sensorInterrupt = 0;  // 0 = digital pin 2
byte sensorPin       = 2;

float calibrationFactor = 4.5;

volatile byte pulseCount;

unsigned int frac;
float flowRate;
unsigned int flowMilliLitres;
float totalMilliLitres;

unsigned long oldTime;
float pressure_pascal;
float pressure_bar;

char string[160];
int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
int presure;
char presstr[20];

void setup() {

Serial.begin(9600);

lcd.begin();
lcd.clear();
lcd.noCursor();

     Serial.println("GSM Shield testing.");
     if (gsm.begin(2400)) {
          Serial.println("\nstatus=READY");
          started=true;
     } else Serial.println("\nstatus=IDLE");

     if(started) {
         // if (sms.SendSMS("085456789999", "Alat Ready"))
         // Serial.println("\nSMS sent OK");
     }
 
  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);

  pulseCount        = 0;
  flowRate          = 0.0;
  flowMilliLitres   = 0;
  totalMilliLitres  = 0;
  oldTime           = 0;

  attachInterrupt(sensorInterrupt, pulseCounter, FALLING);

}

void loop() {

  if((millis() - oldTime) > 1000)
  {

    detachInterrupt(sensorInterrupt);
    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
    oldTime = millis();
    flowMilliLitres = (flowRate / 60) * 1000;
    totalMilliLitres += flowMilliLitres;

    pulseCount = 0;
   
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  }
 
  x = analogRead(A0);
  v = x*(5.0/1023.0);

  pressure_pascal = (3.0*(v-0.47))*1000000.0;
  pressure_bar = pressure_pascal/10e5;
  presure = pressure_bar;
 
  lcd.setCursor(0, 0);
  lcd.print("Bar= ");
  lcd.print(pressure_bar);
  lcd.print("   ");
      
  lcd.setCursor(0, 1);
  lcd.print("ml/s= ");
  lcd.print(flowMilliLitres);
  lcd.print("   ");
 
  delay(200);

 dtostrf(pressure_bar,5,2,presstr);
 sprintf(string,"Flow: %d  Pressure: %s", flowMilliLitres, presstr);
 
 int pos=0;
 
  pos=sms.IsSMSPresent(SMS_ALL);
  if(pos){
    sms.GetSMS(pos,n,smsbuffer,100);
 
    if(!strcmp(smsbuffer,"monitor")){
      sms.SendSMS(n,string);
    }
    if(!strcmp(smsbuffer,"Monitor")){
      sms.SendSMS(n,string);
    }

    delsms();
  }
 
  delay(100);

}

void pulseCounter()
{
  pulseCount++;
}

void delsms()
{
  for (int i=0; i<10; i++)
  {
      int pos=sms.IsSMSPresent(SMS_ALL);
      if (pos!=0)
      {
        if (sms.DeleteSMS(pos)==1){}else{}
      }
  }
}


g. VIDEO HASILNYA




 

Monitor Water Flow dan Pressure

 Monitor Water Flow dan Pressure 

           Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor flow air dan tekanan udara atau air secara bersamaan dengan menggunakan lcd. alat ini menggunakan 2 buah sensor dan satu arduino. untuk lebih jelasnya berikut adalah proram dan daftar komponennya.


a. Arduino Uno
 



b. Sensor Water Flow




c. Sensor Pressure




d. LCD 16x2



e. Program Arduino IDE

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16,2);

int dataadc;
int x;
float v;
float kpa;

byte sensorInterrupt = 0;  // 0 = digital pin 2
byte sensorPin       = 2;

float calibrationFactor = 4.5;

volatile byte pulseCount;

unsigned int frac;
float flowRate;
unsigned int flowMilliLitres;
float totalMilliLitres;

unsigned long oldTime;
float pressure_pascal;
float pressure_bar;


void setup() {
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
 
  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);

  pulseCount        = 0;
  flowRate          = 0.0;
  flowMilliLitres   = 0;
  totalMilliLitres  = 0;
  oldTime           = 0;

  attachInterrupt(sensorInterrupt, pulseCounter, FALLING);

}

void loop() {

  if((millis() - oldTime) > 1000)
  {

    detachInterrupt(sensorInterrupt);
    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
    oldTime = millis();
    flowMilliLitres = (flowRate / 60) * 1000;
    totalMilliLitres += flowMilliLitres;

    pulseCount = 0;
   
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  }
 
  x = analogRead(A0);
  v = x*(5.0/1023.0);

  pressure_pascal = (3.0*(v-0.47))*1000000.0;
  pressure_bar = pressure_pascal/10e5;
 
  lcd.setCursor(0, 0);
  lcd.print("Bar= ");
  lcd.print(pressure_bar);
  lcd.print("   ");
      
  lcd.setCursor(0, 1);
  lcd.print("ml/s= ");
  lcd.print(flowMilliLitres);
  lcd.print("   ");
 
  delay(200);
}


void pulseCounter()
{
  pulseCount++;
}



f. VIDEO HASILNYA







Monitor Bpm dan SPO2 ONLINE Server Thingspeak

 Monitor Bpm dan SPO2 ONLINE Server Thingspeak

         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor BPM dan SPO2 secara ONLINE dengan menggunakan server Thingspeak, alat ini menggunakan wemos D1 dan sensor max30100. untuk lebih jelasnya berikut adalah koding dan daftar komponennya. 


a. Wemos D1



b. Max30100




c. Program Arduino IDE versi 1

#include <ThingSpeak.h>
#include <ESP8266WiFi.h>
#include <Wire.h>
#include "MAX30100.h" //library sensor
#include <LiquidCrystal_I2C.h>   
LiquidCrystal_I2C lcd(0x27,16,2); //library lcd
WiFiClient client;
// ThingSpeak Settings
String apiKey = "GHGFT76GFHGCFDOIOI";
const char *ssid = "Hotspot wifiku";
const char *pass = "12345678";
const char* server = "api.thingspeak.com";
MAX30100* pulseOxymeter;   //library
int counter; //membuat variabel
float Spo;
float bpm;
void setup() {
 //seting lcd dan serial
  Wire.begin();  
  Serial.begin(115200);
  lcd.begin();
  lcd.clear();
 //setting ke online
  Serial.println("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED){\
   pulseOxymeter = new MAX30100();
 
    delay(200);
    Serial.println(".");
    }
  Serial.println("");
  Serial.println("WiFi connected");
}
void loop(){
//ambil data sensor 
pulseoxymeter_t result = pulseOxymeter->update();
//jika terdeteksi nilai maka tampil ke lcd 
if( result.pulseDetected == true ){
    //tampil ke lcd
    lcd.setCursor(0,0);
    lcd.print( "SpO2: " );
    lcd.print( result.SaO2);
    lcd.println( " %          ");
    
    lcd.setCursor(0,1);
    lcd.print( "BPM: " );
    lcd.print( result.heartBPM);
    lcd.println( "         ");
    
 Spo = result.SaO2;
 bpm = result.heartBPM;
 
}
/*
//jika spo lebih dr 100
if(Spo > 100){
    lcd.setCursor(11,0);
    lcd.print("HIPER ");
  }
//jika spo kurang dr 80
if(Spo < 80){
    lcd.setCursor(11,0);
    lcd.print("HIPO  ");
  }
//jika nilai diantara 80 - 100  
if((Spo > 80)&&(Spo < 100)){
    lcd.setCursor(11,0);
    lcd.print("NORMAL");
  }
*/  
 //untuk menghitung looping
  counter++;
if(counter > 100){  //jika loop sudan lebih dr 100
    counter = 0; //reset nilai
if(client.connect(server, 80)){  //kirim ke thingspeak
    String postStr= apiKey;
    postStr += "&field1=";
    postStr += String(Spo);
    postStr += "&field2=";
    postStr += String(bpm);
    postStr += "\r\n\r\n";
    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(postStr.length());
    client.print("\n\n");
    client.print(postStr);
    Serial.println(Spo);
    Serial.println("%. Send to Thingspeak.");
  }
  client.stop();
  Serial.println("Waiting...");
  delay(15000);

}


d. Program Arduino Versi 2

#include <ThingSpeak.h>
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <MAX30100_PulseOximeter.h>
#include <LiquidCrystal_I2C.h>   
LiquidCrystal_I2C lcd(0x27,16,2); //library lcd
#define REPORTING_PERIOD_MS 5000

WiFiClient client;

// ThingSpeak Settings

String apiKey = "FHGHGF78G456FDFH";
const char *ssid = "Hotspot Wifiku";
const char *pass = "12345678";
const char* server = "api.thingspeak.com";

MAX30100* pulseOxymeter;   //library

int counter; //membuat variabel
int spo;
float bpm;

// PulseOximeter is the higher level interface to the sensor
// it offers:
//  * beat detection reporting
//  * heart rate calculation
//  * SpO2 (oxidation level) calculation
PulseOximeter pox;

uint32_t tsLastReport = 0;
 String hrData = "";
//unsigned long timems =0;  
// Callback (registered below) fired when a pulse is detected
void onBeatDetected()
{
    Serial.println("Beat!");
}

void setup() {
 //seting lcd dan serial
  Wire.begin();  
  Serial.begin(115200);
  lcd.begin();
  lcd.clear();
  pinMode(D7,OUTPUT);
  digitalWrite(D7,HIGH);
  
 //setting ke online
  Serial.println("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED){\
  
    delay(200);
    Serial.println(".");
    }
  Serial.println("");
  Serial.println("WiFi connected");

   Serial.print("Initializing pulse oximeter..");
 
    // Initialize the PulseOximeter instance
    // Failures are generally due to an improper I2C wiring, missing power supply
    // or wrong target chip
    if (!pox.begin()) {
        Serial.println("FAILED");
        for(;;);
    } else {
        Serial.println("SUCCESS");
    }
 
    // The default current for the IR LED is 50mA and it could be changed
    //   by uncommenting the following line. Check MAX30100_Registers.h for all the
    //   available options.
   pox.setIRLedCurrent(MAX30100_LED_CURR_11MA);
 
    // Register a callback for the beat detection
    pox.setOnBeatDetectedCallback(onBeatDetected);
    
}

void loop(){

    pox.update();
    
   if (millis() - tsLastReport > REPORTING_PERIOD_MS) {

       bpm = pox.getHeartRate();
       spo = pox.getSpO2();
 
       lcd.setCursor(0,1);
       lcd.print("SpO2: ");
       lcd.print(pox.getSpO2());
       lcd.print(" %        ");

       lcd.setCursor(0,0);
       lcd.print("Bpm : ");
       lcd.print(pox.getHeartRate());
       counter++;
       lcd.print("      ");
       //lcd.print(counter);
       
    tsLastReport = millis();
}

if((bpm > 50)&&(spo > 0)){
  counter = 0;
  kirim();  
  }
 
if(counter > 10){  //jika loop sudan lebih dr 100
  counter = 0; //reset nilai
  kirim();  
}

delay(10);
  
}

void kirim(){
  
if(client.connect(server, 80)){  //kirim ke thingspeak
    String postStr= apiKey;
    postStr += "&field1=";
    postStr += String(spo);
    postStr += "&field2=";
    postStr += String(bpm);
    postStr += "\r\n\r\n";
    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(postStr.length());
    client.print("\n\n");
    client.print(postStr);
    
    Serial.println(spo);
    Serial.println("%. Send to Thingspeak.");
  
  }

  client.stop();
  Serial.println("Waiting...");
  delay(15000);
  digitalWrite(D7,LOW);

}




e.  VIDEO HASILNYA





Alat Monitor Arus dan Pembatas Arus Berlebih / Maksimal

 Alat Monitor Arus dan Pembatas Arus Berlebih / Maksimal

           Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara untuk membuat alat untuk memonitor arus dan juga terdapat fitur pembatas arus berlebih, alat ini menggunakan sensor pzem-004t dan kendali menggunakan SSR / solid state relay. untuk lebih jelasnya berikut adalah daftar komponen dan kodingnya.


a. Arduino Mega


b. Sensor PZEM-004t


c. Solid State Relay / SSR


d. Keypad 4x4



e. lcd 16x2 + i2c



f. Koding Arduino IDE Versi 1

#include <Wire.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>  
#include <PZEM004Tv30.h>

PZEM004Tv30 pzem1(11,12);
PZEM004Tv30 pzem2(A8, A9);

LiquidCrystal_I2C lcd(0x27, 16, 2);

int relay1 = 2;
int relay2 = 3;
int led1 = 4;
int led2 = 5;
int buzzer1 = 6;
int buzzer2 = 7;
 
int arus1 = 0;
float arusx1;
int arus2 = 0;
float arusx2;
 
float voltage1;
float current1;

float voltage2;
float current2;
    
char customKey;
const byte ROWS = 4;
const byte COLS = 4;

char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {A12,A14,32,34}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {36,38,40,42}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup()
{
 
  pinMode(relay1, OUTPUT);
  digitalWrite(relay1, LOW);
  pinMode(led1, OUTPUT);
  digitalWrite(led1, HIGH);
  pinMode(buzzer1, OUTPUT);
  digitalWrite(buzzer1, HIGH);
 
  pinMode(relay2, OUTPUT);
  digitalWrite(relay2, LOW);
  pinMode(led2, OUTPUT);
  digitalWrite(led2, HIGH);
  pinMode(buzzer2, OUTPUT);
  digitalWrite(buzzer2, HIGH);
 
  lcd.begin();
  lcd.noCursor();
  lcd.clear();
  Serial.begin(9600);   

}

void loop()
{
 
    voltage1 = pzem1.voltage();
    current1 = pzem1.current();

    voltage2 = pzem2.voltage();
    current2 = pzem2.current();

    lcd.setCursor(0,0);
    lcd.print("I= ");
    lcd.print(current1,2);
    lcd.print(" / ");
    lcd.print(arusx1,2);
    lcd.print("     ");
    
    lcd.setCursor(0,1);
    lcd.print("I= ");
    lcd.print(current2,2);
    lcd.print(" / ");
    lcd.print(arusx2,2);
    lcd.print("     ");
 
    customKey = customKeypad.getKey();
    
    if(customKey == 'A'){
    lcd.clear();
    delay(1000);  
    arus1 = 0;
    arusx1 = 0;
    arus2 = 0;
    arusx2 = 0;
    setting1();
    lcd.clear();
    delay(1000);
    setting2();
    }

    if((current1 > arusx1)&&(arusx1 > 0)){
      digitalWrite(relay1,HIGH);
      digitalWrite(buzzer1,LOW);
      digitalWrite(led1,LOW);
      }

    if((current1 < arusx1)&&(arusx1 > 0)){
      digitalWrite(relay1,LOW);
      digitalWrite(buzzer1,HIGH);
      digitalWrite(led1,HIGH);
      }  

    if((current2 > arusx2)&&(arusx2 > 0)){
      digitalWrite(relay2,HIGH);
      digitalWrite(buzzer2,LOW);
      digitalWrite(led2,LOW);
      }

    if((current2 < arusx2)&&(arusx2 > 0)){
      digitalWrite(relay2,LOW);
      digitalWrite(buzzer2,HIGH);
      digitalWrite(led2,HIGH);
      }

   delay(200);
}

void setting1(){

  lcd.setCursor(0,0);
  lcd.print("Set Max Arus 1");
 
  customKey = customKeypad.getKey();

  if(customKey >= '0' && customKey <= '9')
  {
      arus1 = arus1 * 10 + (customKey - '0');
      lcd.setCursor(0,1);
      lcd.print(arus1);
  }

    if(customKey == 'A')
  {
   arusx1 = 0;
   arus1 = 0;
   lcd.clear();
   delay(1000);
  }

  if(customKey == 'B')
  {
   arusx1 = arus1 / 1.0;
   lcd.clear();
   delay(1000);
   return;
  }

  if(customKey == 'C')
  {
   arusx1 = arus1 / 10.0;
   lcd.clear();
   delay(1000);
   return;
  }

  if(customKey == 'D')
  {
   arusx1 = arus1 / 100.0;
   lcd.clear();
   delay(1000);
   return;
  }

setting1();
}

void setting2(){

  lcd.setCursor(0,0);
  lcd.print("Set Max Arus 2");
 
  customKey = customKeypad.getKey();

  if(customKey >= '0' && customKey <= '9')
  {
      arus2 = arus2 * 10 + (customKey - '0');
      lcd.setCursor(0,1);
      lcd.print(arus2);
  }

    if(customKey == 'A')
  {
   arusx2 = 0;
   arus2 = 0;
   lcd.clear();
   delay(1000);
  }

  if(customKey == 'B')
  {
   arusx2 = arus2 / 1.0;
   lcd.clear();
   delay(1000);
   return;
  }

  if(customKey == 'C')
  {
   arusx2 = arus2 / 10.0;
   lcd.clear();
   delay(1000);
   return;
  }

  if(customKey == 'D')
  {
   arusx2 = arus2 / 100.0;
   lcd.clear();
   delay(1000);
   return;
  }

setting2();
}



g. Koding Arduuino IDE Versi 2

#include <Wire.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>  
#include <PZEM004Tv30.h>

PZEM004Tv30 pzem1(11,12);
PZEM004Tv30 pzem2(A8, A9);

LiquidCrystal_I2C lcd(0x27, 16, 2);

int relay1 = 2;
int relay2 = 3;
int led1 = 4;
int led2 = 5;
int buzzer1 = 6;
int buzzer2 = 7;
 
int arus1 = 0;
float arusx1;
int arus2 = 0;
float arusx2;
 
float voltage1;
float current1;

float voltage2;
float current2;
    
char customKey;
const byte ROWS = 4;
const byte COLS = 4;

char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {A12,A14,32,34}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {36,38,40,42}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup()
{
 
  pinMode(relay1, OUTPUT);
  digitalWrite(relay1, LOW);
  pinMode(led1, OUTPUT);
  digitalWrite(led1, HIGH);
  pinMode(buzzer1, OUTPUT);
  digitalWrite(buzzer1, HIGH);
 
  pinMode(relay2, OUTPUT);
  digitalWrite(relay2, LOW);
  pinMode(led2, OUTPUT);
  digitalWrite(led2, HIGH);
  pinMode(buzzer2, OUTPUT);
  digitalWrite(buzzer2, HIGH);
 
  lcd.begin();
  lcd.noCursor();
  lcd.clear();
  Serial.begin(9600);   

}

void loop()
{
 
    voltage1 = pzem1.voltage();
    current1 = pzem1.current();

    voltage2 = pzem2.voltage();
    current2 = pzem2.current();

    lcd.setCursor(0,0);
    lcd.print("I= ");
    lcd.print(current1,2);
    lcd.print(" / ");
    lcd.print(arusx1,2);
    lcd.print("     ");
    
    lcd.setCursor(0,1);
    lcd.print("I= ");
    lcd.print(current2,2);
    lcd.print(" / ");
    lcd.print(arusx2,2);
    lcd.print("     ");
 
    customKey = customKeypad.getKey();
    
    if(customKey == 'A'){
    lcd.clear();
    delay(1000);  
    arus1 = 0;
    arusx1 = 0;
    arus2 = 0;
    arusx2 = 0;
    setting1();
    lcd.clear();
    delay(1000);
    setting2();
    }

    if((current1 > arusx1)&&(arusx1 > 0)){
      digitalWrite(relay1,HIGH);
      digitalWrite(buzzer1,LOW);
      digitalWrite(led1,LOW);
      delay(1000);
      digitalWrite(relay1,LOW);
      }

    if((current1 < arusx1)&&(arusx1 > 0)){
      digitalWrite(relay1,LOW);
      digitalWrite(buzzer1,HIGH);
      digitalWrite(led1,HIGH);
      }  

    if((current2 > arusx2)&&(arusx2 > 0)){
      digitalWrite(relay2,HIGH);
      digitalWrite(buzzer2,LOW);
      digitalWrite(led2,LOW);
      delay(1000);
      digitalWrite(relay2,LOW);
      }

    if((current2 < arusx2)&&(arusx2 > 0)){
      digitalWrite(relay2,LOW);
      digitalWrite(buzzer2,HIGH);
      digitalWrite(led2,HIGH);
      }

   delay(200);
}

void setting1(){

  lcd.setCursor(0,0);
  lcd.print("Set Max Arus 1");
 
  customKey = customKeypad.getKey();

  if(customKey >= '0' && customKey <= '9')
  {
      arus1 = arus1 * 10 + (customKey - '0');
      lcd.setCursor(0,1);
      lcd.print(arus1);
  }

    if(customKey == 'A')
  {
   arusx1 = 0;
   arus1 = 0;
   lcd.clear();
   delay(1000);
  }

  if(customKey == 'B')
  {
   arusx1 = arus1 / 1.0;
   lcd.clear();
   delay(1000);
   return;
  }

  if(customKey == 'C')
  {
   arusx1 = arus1 / 10.0;
   lcd.clear();
   delay(1000);
   return;
  }

  if(customKey == 'D')
  {
   arusx1 = arus1 / 100.0;
   lcd.clear();
   delay(1000);
   return;
  }

setting1();
}

void setting2(){

  lcd.setCursor(0,0);
  lcd.print("Set Max Arus 2");
 
  customKey = customKeypad.getKey();

  if(customKey >= '0' && customKey <= '9')
  {
      arus2 = arus2 * 10 + (customKey - '0');
      lcd.setCursor(0,1);
      lcd.print(arus2);
  }

    if(customKey == 'A')
  {
   arusx2 = 0;
   arus2 = 0;
   lcd.clear();
   delay(1000);
  }

  if(customKey == 'B')
  {
   arusx2 = arus2 / 1.0;
   lcd.clear();
   delay(1000);
   return;
  }

  if(customKey == 'C')
  {
   arusx2 = arus2 / 10.0;
   lcd.clear();
   delay(1000);
   return;
  }

  if(customKey == 'D')
  {
   arusx2 = arus2 / 100.0;
   lcd.clear();
   delay(1000);
   return;
  }

setting2();
}


h. VIDEO HASILNYA