Translate

DETEKSI TELUR BAGUS / JELEK ARDUINO SENSOR LDR & AMPLI HX711 - LOADCELL

DETEKSI TELUR BAGUS / JELEK ARDUINO SENSOR LDR & AMPLI HX711 - LOADCELL
 

       Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mendeteksi telur bagus atau jelek dengan menggunakan sensor LDR dan loadcell. jadi jika cahaya bisa tembus ke telur maka telur dikatakan bagus namun jika tidak maka telur dikatakan buruk. untuk lebih jelasnya berikut adalah koding dan komponennya.
 
 
a. Komponen


 
 
b. Program Arduino IDE

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

Servo myservo1;
Servo myservo2;
Servo myservo3;

//myservo1.write(80); tutup
//myservo1.write(150); buka
//myservo2.write(40); buka
//myservo2.write(80); tutup
//myservo1.write(80); lepas
//myservo1.write(180); dorong telur

// HX711.DOUT    - pin #3
// HX711.PD_SCK    - pin #2

HX711 scale(3, 2);       

long duration, distance;
float tera = 0;
int berat;
float fix;
int x;
int dataadc;
int nilai;

void setup() {
 
  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  myservo1.attach(9);
  myservo2.attach(10);
  myservo3.attach(11);
  myservo1.write(80);
  myservo2.write(80);
  myservo3.write(80);

  scale.set_scale(2280.f);       // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();                  // reset the scale to 0

 lcd.setCursor (0,0);
 lcd.print ("LOADING... ");
 delay(5000);
 lcd.clear();
}

void loop() {

 dataadc = analogRead(A0);
 
 berat = scale.get_units(10) * 1;
 //fix = (berat - 0.4233)/0.1586;

 if(berat < 0){
  berat = berat * -1;
 }
 
 lcd.setCursor(0,0);
 lcd.print("Berat= ");
 lcd.print(berat);
 lcd.print("   ");
 lcd.setCursor(0,1);
 lcd.print("ADC= ");
 lcd.print(dataadc);
 lcd.print("   ");
      
 scale.power_down();                  
 delay(200);
 scale.power_up();


if((berat > 5)&&(dataadc < 850)){
 nilai = 1;
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("TELUR BAGUS  ");
 myservo1.write(80);
 myservo2.write(80);
 myservo3.write(80);
 myservo3.write(180);
 Serial.print(nilai);
 delay(3000);
 lcd.clear();
 myservo1.write(80);
 myservo3.write(80);
 }

if((berat > 5)&&(dataadc > 850)){
 nilai = 2;
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("TELUR JELEK  ");
 myservo1.write(150);
 myservo2.write(80);
 myservo3.write(80);
 myservo3.write(180);
 Serial.print(nilai);
 delay(3000);
 myservo1.write(80);
 myservo3.write(80);
 lcd.clear();
 }

if((berat > 0)&&(berat < 5)&&(dataadc < 850)){
 nilai = 3;
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print(" TDK STANDAR  ");
 myservo1.write(80);
 myservo2.write(40);
 myservo3.write(80);
 myservo3.write(180);
 Serial.print(nilai);
 delay(3000);
 myservo2.write(80);
 myservo3.write(80);
 lcd.clear();
 }
}
 
 
 c. VIDEO HASILNYA


Alat Pendeteksi Golongan Darah ESP32 dan Hasil Bisa diprint serta Interface LCD Nextion

Alat Pendeteksi Golongan Darah ESP32 dan Hasil Bisa diprint serta Interface LCD Nextion


          Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mendeteksi golongan darah. alat ini sangat bagus karena hasil pengukuran bisa di print melalui printer thermal. dan juga interface atau LCD menggunakan LCD Nextion sehingga memiliki interface yang bagus. untuk lebih jelasnya berikut adalah koding dan skemanya.


a. Skema Alat




b. Program Arduino ESP32

#include <WiFi.h>
#include <WiFiClient.h>
#define RXD2 16 
#define TXD2 17

int dataadc1;
int dataadc2;
int dataadc3;
int zero=0;
int heatTime = 80;
int heatInterval = 255;
char printDensity = 15;
char printBreakTime = 15;
char my_str1[] = "A+";
char my_str2[] = "A-";
char my_str3[] = "B+";
char my_str4[] = "B-";
char my_str5[] = "AB+";
char my_str6[] = "AB-";
char my_str7[] = "O+";
char my_str8[] = "O-";
int datahasil;
int urutan;
int mark;
int tanda = 0;

void setup() {
  Serial2.begin(9600);
  Serial.begin(9600); // to write to our new printer
  initPrinter();
}

void initPrinter()
{
 //Modify the print speed and heat
 Serial.write(27);
 Serial.write(55);
 Serial.write(7); //Default 64 dots = 8*('7'+1)
 Serial.write(heatTime); //Default 80 or 800us
 Serial.write(heatInterval); //Default 2 or 20us
 //Modify the print density and timeout
 Serial.write(18);
 Serial.write(35);
 int printSetting = (printDensity<<4) | printBreakTime;
 Serial.write(printSetting); //Combination of printDensity and printBreakTime
}

void loop() {

  dataadc1 = analogRead(34);
  dataadc2 = analogRead(35);
  dataadc3 = analogRead(32);
  
  if((dataadc1 > 1000)&&(dataadc2 < 1000)&&(dataadc3 > 1000)){
  lcdCMD("hasil.txt=\"A+\"");  
  mark = 1;
  }

  if((dataadc1 > 1000)&&(dataadc2 < 1000)&&(dataadc3 < 1000)){
  lcdCMD("hasil.txt=\"A-\"");  
  mark = 2;
  }

  if((dataadc1 < 1000)&&(dataadc2 > 1000)&&(dataadc3 > 1000)){
  lcdCMD("hasil.txt=\"B+\"");  
  mark = 3;
  }

  if((dataadc1 < 1000)&&(dataadc2 > 1000)&&(dataadc3 < 1000)){
  lcdCMD("hasil.txt=\"B-\"");  
  mark = 4;
  }

  if((dataadc1 > 1000)&&(dataadc2 > 1000)&&(dataadc3 > 1000)){
  lcdCMD("hasil.txt=\"AB+\""); 
  mark = 5;
  }

  if((dataadc1 > 1000)&&(dataadc2 > 1000)&&(dataadc3 < 1000)){
  lcdCMD("hasil.txt=\"AB-\"");  
  mark = 6;
  }

  if((dataadc1 < 1000)&&(dataadc2 < 1000)&&(dataadc3 > 1000)){
  lcdCMD("hasil.txt=\"O+\"");  
  mark = 7;
  }

  if((dataadc1 < 1000)&&(dataadc2 < 1000)&&(dataadc3 < 1000)){
  lcdCMD("hasil.txt=\"O-\"");  
  mark = 8;
  }

  lcdCMD("sensor1.val=" + String(dataadc1));
  lcdCMD("sensor2.val=" + String(dataadc2));
  lcdCMD("sensor3.val=" + String(dataadc3));
  lcdCMD("noid.val=" + String(urutan));
   
    datahasil = Serial2.read();
    if(datahasil == 'A'){
    urutan++;
    }  
    if(datahasil == 'B'){
    urutan--;
    } 
    if((datahasil == 'C')&&(tanda == 0)){
    tanda = 1;  
    printing();
    } 
}

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

void printing(){
   delay(1000);

  //print
  Serial.write(27);
  Serial.write(45);
  Serial.write(1);
  Serial.print("ID= ");
  Serial.println(urutan);

if(mark == 1){
  Serial.print("GOL= ");
  Serial.println(my_str1);
  mark = 0;
  }

if(mark == 2){
  Serial.print("GOL= ");
  Serial.println(my_str2);
  mark = 0;
  }

if(mark == 3){
  Serial.print("GOL= ");
  Serial.println(my_str3);
  }

if(mark == 4){
  Serial.print("GOL= ");
  Serial.println(my_str4);
  mark = 0;
  }

if(mark == 5){
  Serial.print("GOL= ");
  Serial.println(my_str5);
  mark = 0;
  }  

if(mark == 6){
  Serial.print("GOL= ");
  Serial.println(my_str6);
  mark = 0;
  }      

if(mark == 7){
  Serial.print("GOL= ");
  Serial.println(my_str7);
  mark = 0;
  }      

if(mark == 8){
  Serial.print("GOL= ");
  Serial.println(my_str8);
  mark = 0;
  }                  
  
  Serial.write(10);
  Serial.write(10);  
}



c. Interface LCD NEXTION







d. VIDEO HASILNYA




Monitor Tegangan 220Vac dan Jarak ESP32 IOT Blynk 2.0 Sensor PZEM-004t dan HC-SRF04

Monitor Tegangan 220Vac dan Jarak ESP32 IOT Blynk 2.0 Sensor PZEM-004t dan HC-SRF04


       Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor tegangan 220 Vac dan juga monitoring jarak dengan maksimal jarak yaitu 2 meter. alat ini menggunakan ESP32 + IOT dengan server Blynk 2.0 sehingga bisa dimonitor secara jarak jauh. untuk lebih jelasnya berikut adalah koding dan komponennya.


a. Komponen




b. Program ESP32

#define BLYNK_TEMPLATE_ID "TMPL6wOC--abc"
#define BLYNK_TEMPLATE_NAME "monitor daya"
#define BLYNK_AUTH_TOKEN "VOK0cWiFN5ycHj3SV_snEDXTfTfxxxxx"
#define BLYNK_PRINT Serial  

#include <Wire.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <LiquidCrystal_I2C.h>  //i2C LCD Library
#include <PZEM004Tv30.h>
#define RXD2 16 
#define TXD2 17

LiquidCrystal_I2C lcd(0x27, 16, 2); 
PZEM004Tv30 pzem_r(&Serial2);

const int trigPin = 5;
const int echoPin = 18;

//define sound speed in cm/uS
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701

long duration;
float distanceCm;
float distanceInch;

float vr;
float ir;
float freq;
float pf_r;
float energy;
float power;

BlynkTimer timer;

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

void sendSensor()
{
 Blynk.virtualWrite(V0, vr);
 Blynk.virtualWrite(V1, distanceCm);
 delay(1000);
}
 
void setup() {
  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
  Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
  timer.setInterval(1000L, sendSensor);
}
 
void loop() {
  
  vr = pzem_r.voltage();
  ir = pzem_r.current();

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  // Reads the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);
  
  // Calculate the distance
  distanceCm = duration * SOUND_SPEED/2;  

  lcd.setCursor(0,0);
  lcd.print("V: ");
  lcd.print(vr,1);
  lcd.print("   ");
      
  lcd.setCursor(0,1);
  lcd.print("S: "); 
  lcd.print(distanceCm);
  lcd.print(" cm   ");
  
  Blynk.run();
  timer.run();  
  delay(200);
}
 


c. VIDEO HASILNYA



Membuat Alat Frekuensi & Duty Cycle Generator dan Timer Arduino

Membuat Alat Frekuensi & Duty Cycle Generator dan Timer Arduino


           Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat menghasilkan frekuensi dan duty cycle yang dapat diatur melalui tombol dan juga timer yang bisa disetting maksimal di 30 menit. untuk frekuensi yaitu berada di range 0 - 100 Hz dan duty cycle 0 - 100 persen. untuk lebih jelasnya berikut adalah koding dan skemanya.


a. Skema




b. Program Arduino IDE

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <PWM.h>
#include <EEPROM.h>
#define DS3231_I2C_ADDRESS 0x68

LiquidCrystal_I2C lcd(0x27,16,2);

int relay1 = A0;
int relay2 = A1;
int relay3 = A2;
int buzzer = 8;
int btset = 3;
int btok = 4;
int btup = 5;
int btdown = 6;
int btsetx;
int btokx;
int btupx;
int btdownx;
int32_t frekuensi,frekuensi2;
int dutycycle,dutycycle2;
int waktu;
bool success;
float duty,duty2;

int addr1 = 0;
int addr2 = 1;
int addr3 = 2;
int addr4 = 3;
int addr5 = 4;
int val1;
int val2;
int val3;
int simpan1;
int simpan2;
int simpan3;
int simpan4;
int simpan5;

int outpin1 = 9;
int outpin2 = 10;   

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}

void setup() {
Serial.begin(9600);
lcd.begin();  
lcd.clear();
lcd.noCursor();
InitTimersSafe();
success = SetPinFrequencySafe(outpin1, frekuensi);
success = SetPinFrequencySafe(outpin2, frekuensi);
pinMode(relay1,OUTPUT);
pinMode(relay2,OUTPUT);
pinMode(relay3,OUTPUT);
pinMode(outpin1,OUTPUT);
pinMode(outpin2,OUTPUT);
pinMode(buzzer,OUTPUT);
digitalWrite(relay1,LOW); //OFF
digitalWrite(relay2,LOW); //OFF
digitalWrite(relay3,LOW); //OFF
digitalWrite(buzzer,LOW); //OFF
pinMode(btset,INPUT_PULLUP);
pinMode(btok,INPUT_PULLUP);
pinMode(btup,INPUT_PULLUP);
pinMode(btdown,INPUT_PULLUP);
  
Wire.begin();
// DS3231 seconds, minutes, hours, day, date, month, year
setDS3231time(0,0,0,6,5,10,18);

frekuensi = EEPROM.read(addr1);
dutycycle = EEPROM.read(addr2);
waktu = EEPROM.read(addr3);
frekuensi2 = EEPROM.read(addr4);
dutycycle2 = EEPROM.read(addr5);

digitalWrite(buzzer,HIGH); //ON
delay(3000);
digitalWrite(buzzer,LOW); //OFF
}

void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}

void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}

void loop() {

btsetx = digitalRead(btset);
btokx = digitalRead(btok);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
  
lcd.setCursor(0,0);
lcd.print("EMS GENERATOR");
lcd.setCursor(0,1);
lcd.print("SETTING ");

if(btsetx == 0){
lcd.clear();
delay(200);
setfreq1();
setduty1();
setfreq2();
setduty2();
settimer();
setDS3231time(0,0,0,6,5,10,18); 
mulai();  
}

}

void setfreq1(){

btsetx = digitalRead(btset);
btokx = digitalRead(btok);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
   
lcd.setCursor(0,0);
lcd.print("SET 1 FREQ HZ");
lcd.setCursor(0,1);
lcd.print(frekuensi);  
lcd.print("   ");

if(btupx == 0){
  delay(200);
  frekuensi++;
}

if(btdownx == 0){
  delay(200);
  frekuensi--;
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr1, frekuensi);
  return;
}

if(frekuensi > 100){
frekuensi = 0;  
}

if(frekuensi < 0){
frekuensi = 100;  
}

setfreq1();
}

void setfreq2(){

btsetx = digitalRead(btset);
btokx = digitalRead(btok);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
   
lcd.setCursor(0,0);
lcd.print("SET 2 FREQ HZ");
lcd.setCursor(0,1);
lcd.print(frekuensi2);  

if(btupx == 0){
  delay(200);
  frekuensi2++;
}

if(btdownx == 0){
  delay(200);
  frekuensi2--;
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr4, frekuensi2);
  return;
}

if(frekuensi2 > 100){
frekuensi2 = 0;  
}

if(frekuensi2 < 0){
frekuensi2 = 100;  
}

setfreq2();
}

void setduty1(){

btsetx = digitalRead(btset);
btokx = digitalRead(btok);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
   
lcd.setCursor(0,0);
lcd.print("SET 1 DUTY %");
lcd.setCursor(0,1);
lcd.print(dutycycle);  
lcd.print("   ");

if(btupx == 0){
  delay(200);
  dutycycle++;
}

if(btdownx == 0){
  delay(200);
  dutycycle--;
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr2, dutycycle);
  return;
}

if(dutycycle > 100){
dutycycle = 0;  
}

if(dutycycle < 0){
dutycycle = 100;  
}

setduty1();
}

void setduty2(){

btsetx = digitalRead(btset);
btokx = digitalRead(btok);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
   
lcd.setCursor(0,0);
lcd.print("SET 2 DUTY %");
lcd.setCursor(0,1);
lcd.print(dutycycle2);  
lcd.print("   ");

if(btupx == 0){
  delay(200);
  dutycycle2++;
}

if(btdownx == 0){
  delay(200);
  dutycycle2--;
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr5, dutycycle2);
  return;
}

if(dutycycle2 > 100){
dutycycle2 = 0;  
}

if(dutycycle2 < 0){
dutycycle2 = 100;  
}

setduty2();
}

void settimer(){

btsetx = digitalRead(btset);
btokx = digitalRead(btok);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
   
lcd.setCursor(0,0);
lcd.print("SET WAKTU");
lcd.setCursor(0,1);
lcd.print(waktu);  
lcd.print(" MENIT ");

if(btupx == 0){
  delay(200);
  waktu++;
}

if(btdownx == 0){
  delay(200);
  waktu--;
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr3, waktu);
  return;
}

if(waktu > 59){
waktu = 0;  
}

if(waktu < 0){
waktu = 59;  
}

settimer();
}

void mulai(){

  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);

  lcd.setCursor(0,0);
  // send it to the serial monitor
  lcd.print(hour, DEC);
  // convert the byte variable to a decimal number when displayed
  lcd.print(":");
  if (minute<10)
  {
    lcd.print("0");
  }
  lcd.print(minute, DEC);
  lcd.print(":");
  if (second<10)
  {
    lcd.print("0");
  }
  lcd.print(second, DEC);
 
//duty = pwmon / 255;
duty = (dutycycle / 100.0) * 255.0;
duty2 = (dutycycle2 / 100.0) * 255.0;

digitalWrite(relay1,HIGH); //ON 
digitalWrite(relay2,HIGH); //ON 
digitalWrite(relay3,HIGH); //ON 

btsetx = digitalRead(btset);
btokx = digitalRead(btok);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
   
lcd.setCursor(0,1); 
lcd.print("F/D:");
lcd.print(frekuensi); 
lcd.print("/");
lcd.print(dutycycle); 
lcd.print("/");
lcd.print(frekuensi2); 
lcd.print("/");
lcd.print(dutycycle2); 

  InitTimersSafe();
  success = SetPinFrequencySafe(outpin1, frekuensi);
  success = SetPinFrequencySafe(outpin2, frekuensi2);
 
 pwmWrite(outpin1, duty);
 pwmWrite(outpin2, duty2);
 delay(1000);

if(minute == waktu){
  digitalWrite(relay1,LOW); //OFF
  digitalWrite(relay2,LOW); //OFF 
  digitalWrite(relay3,LOW); //OFF  
  digitalWrite(buzzer,HIGH); //ON
  delay(3000);
  digitalWrite(buzzer,LOW); //OFF
  pwmWrite(outpin1, 0);
  pwmWrite(outpin2, 0);
  lcd.clear();
  delay(2000);
  return;
}
    
mulai();  
}



c. VIDEO HASILNYA



Monitor Suhu dan PH serta Turbidity Kolam Ikan dan juga Fitur Pakan Otomatis via BLYNK 2.0 ESP32

Monitor Suhu dan PH serta Turbidity Kolam Ikan dan juga Fitur Pakan Otomatis via BLYNK 2.0 ESP32 


       Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor PH dan suhu air serta turbidity air pada kolam ikan, alat ini juga terdapat fitur yaitu jika pada jam yang telah ditentukan maka motor atau relay akan membuka pakan sehingga akan memberikan pakan otomatis di jam tertentu. untuk lebih jelasnya berikut adalah komponen dan kodingnya.



a. Komponen




b. Program Arduino IDE

#define BLYNK_TEMPLATE_ID "TMPL6URGWCTpo"
#define BLYNK_TEMPLATE_NAME "monitor kolam ikan"
#define BLYNK_AUTH_TOKEN "gR-atiO8n1ckW8NInocGTRkbKJpG4Ufe"
#define BLYNK_PRINT Serial  

#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#define ONE_WIRE_BUS 32  

RTC_DS3231 rtc;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

LiquidCrystal_I2C lcd(0x27,16,2);

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

int jampagi,jamsiang,jamsore;
float TempC;
float pHValue;
int tds;
int adctds;
int adcPH;
int TempCx;
int pHValuex;
int ntux;
float ntufix;
int tanda = 0;
int kolam;
int tinggipakan;
int relayout = 25;
int relayout2 = 26;
int Secs;
int Minutes;
int Hours;
int motor;

BlynkTimer timer;

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


void sendSensor()
{
 Blynk.virtualWrite(V0, pHValue);
 Blynk.virtualWrite(V1, tds);
 Blynk.virtualWrite(V2, TempC);
 Blynk.virtualWrite(V3, motor);
 delay(1000);
}

void setup(){  
  
pinMode(relayout,OUTPUT);
digitalWrite(relayout,HIGH);

Wire.begin();  
sensors.begin();
Serial.begin(9600);
lcd.begin();  
lcd.clear(); 

rtc.begin();
rtc.adjust(DateTime(0, 0, 0, 6, 59, 50));
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
  timer.setInterval(1000L, sendSensor);
}


void loop(){
DateTime now = rtc.now();

  Secs = now.second(); 
  Hours = now.hour(); 
  Minutes = now.minute(); 
       
 adcPH = analogRead(34); 
 pHValue = (adcPH - 936.84) / 100.283;

 adctds = analogRead(35);             
 tds = map(adctds, 4095, 50, 0, 1000);
 
  sensors.requestTemperatures();
  TempC = sensors.getTempCByIndex(0); // Celcius

if((Hours == 7)&&(tanda == 0)){
  tanda = 1;
  Blynk.logEvent("jam_makan_ikan");
}

if ((Hours == 13)&&(tanda == 1)){
  tanda = 2;
  Blynk.logEvent("jam_makan_ikan");
}

if ((Hours == 19)&&(tanda == 2)){
  tanda = 0;
  Blynk.logEvent("jam_makan_ikan");
}

if((pHValue > 6.5)&&(pHValue < 8.5)){
  digitalWrite(relayout,HIGH);
  }


if(pHValue < 6.5){
  digitalWrite(relayout,LOW);
  motor++; 
  Blynk.logEvent("kondisi_ph");
}

if(pHValue > 8.5){
  digitalWrite(relayout,LOW);
  Blynk.logEvent("kondisi_ph");
  motor++; 
}

if(tds > 500){
  digitalWrite(relayout,LOW);
  Blynk.logEvent("kondisi_tds");
  motor++; 
}

if(tds < 500){
  digitalWrite(relayout,HIGH); 
}

if((TempC > 25)&&(TempC < 30)){
  digitalWrite(relayout,HIGH);
  }
  
if(TempC < 25){
  digitalWrite(relayout,LOW);
  Blynk.logEvent("SUHU KURANG");
  motor++; 
}

if(TempC > 30){
  digitalWrite(relayout,LOW);
  Blynk.logEvent("SUHU LEBIH");
  motor++; 
}
  
  lcd.setCursor(0,0);
  lcd.print("P/T:");
  lcd.print(pHValue);
  lcd.print("/");
  lcd.print(tds);
  lcd.print("  ");

  lcd.setCursor(0,1);
  lcd.print("T:");
  lcd.print(TempC,1);
  lcd.print(" ");
  lcd.print(Hours);
  lcd.print(":");
  lcd.print(Minutes);
  lcd.print(":");
  lcd.print(Secs);
  lcd.print("  ");

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



c. VIDEO HASILNYA




MONITOR ECG BPM DAN RESPIRASI SERTA SUHU TUBUH VIA IOT BLYNK 2.0

MONITOR ECG BPM DAN RESPIRASI SERTA SUHU TUBUH VIA IOT BLYNK 2.0


        Pada kesempatan kali ini saya akan mendemokan sebuah alat yang bisa memonitor ECG BPM dan respirasi serta suhu tubuh secara bergantian dalam satu alat. fitur dari alat ini yaitu mengguakan IOT Blynk 2.0 sehingga bisa dimonitor secara jarak jauh menggunakan internet. untuk lebih jelasnya berikut komponen dan kodingnya.



a. Komponen





b. Program Arduino IDE

#define BLYNK_TEMPLATE_ID "TMPL6p5131qBk"
#define BLYNK_TEMPLATE_NAME "baby inkubator"
#define BLYNK_AUTH_TOKEN "9lmYS6XNCggK7TwRS9rddlu7HNXUkWjo"
#define BLYNK_PRINT Serial  
  
#include <Wire.h>
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 0  

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27,16,2);

int n = 0;
int bpm = 0;
int x = 0;
int buzzer = D6;
int respirasipin;
int bpmku;
int respirasiku;

int m = 0;
int resp = 0;
int w = 0;

int suhux = 0;
int bpmx = 0;
float TempC;
int gsrz;
int suhuz;
int bpmz;
int respirasiz;

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

void sendSensor()
{
 Blynk.virtualWrite(V0, bpmku);
 Blynk.virtualWrite(V2, respirasiku);
 Blynk.virtualWrite(V1, TempC);
 delay(1000);
}

void setup() {
 
  Serial.begin(9600);
  pinMode(buzzer,OUTPUT);
  pinMode(D5,INPUT_PULLUP);
  digitalWrite(buzzer,LOW);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  Wire.begin();  
  sensors.begin();
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
  timer.setInterval(1000L, sendSensor);
 
}

void loop() {
n = 0;
m = 0;
bpm = 0;
resp = 0;

tampilbpm();
tampilrespirasi();
tampilsuhu();

  lcd.setCursor(0, 0);
  lcd.print("BPM: ");
  lcd.print(bpmku);
  lcd.print(" / ");
  lcd.print(TempC);
  lcd.print("   ");
  
  lcd.setCursor(0, 1);
  lcd.print("RESP = ");
  lcd.print(respirasiku);

Blynk.run();
timer.run();

delay(3000);
lcd.clear();        
}

void tampilbpm(){
n = n + 1;

  int dataadc1 = analogRead(A0);          

  lcd.setCursor(0, 0);
  lcd.print("n = ");
  lcd.print(n);
   
  lcd.setCursor(0, 1);
  lcd.print("BPM = ");
  lcd.print(bpm);

  if ((dataadc1 > 512) && (x > 1)) {  
  //digitalWrite(led, HIGH);
  x = 0;
  bpm = bpm + 1;
  }

  else if ((dataadc1 < 512) && (x < 1)) {
  x = 2;
  //digitalWrite(led, LOW);

  }

  delay(200);

  if ( n > 50 ) {
  lcd.clear();
  bpmku = bpm * 6;
  return;
  }

 tampilbpm();
}

void tampilrespirasi(){
m = m + 1;
 
  int dataadc2 = digitalRead(D5);          

  lcd.setCursor(0, 0);
  lcd.print("m = ");
  lcd.print(m);
   
  lcd.setCursor(0, 1);
  lcd.print("RESP = ");
  lcd.print(resp);

  if ((dataadc2 == 1) && (w > 1)) {  
  //digitalWrite(led, HIGH);
  w = 0;
  resp = resp + 1;
  }

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

  }

  delay(200);

  if ( m > 50 ) {
  lcd.clear();
  respirasiku = resp * 6;
  return;
  }
 
  tampilrespirasi();
}

void tampilsuhu(){
  sensors.requestTemperatures();
  TempC = sensors.getTempCByIndex(0); // Celcius
}




c. VIDEO HASILNYA




MONITOR BPM SPO2 TENSIMETER NOTIF TELEGRAM / THINGSPEAK

MONITOR BPM SPO2 TENSIMETER NOTIF TELEGRAM / THINGSPEAK


        Pada kesempatan kali ini saya akan menjelaskan menenai bagaimana cara membuat sebuah alat yang bisa monitor BPM - SPO2 dan tensimeter sekaligus dalam satu alat, serta alat ini memiliki fungsi yaitu notif ke telegram atau kirim data ke thingspeak. untuk lebih jelasnya berikut adalah komponen dan kodingnya.



a. Komponen




b. Program Arduino Notif Telegram

#include <Arduino.h>
#include <math.h>
#include <Wire.h>  
#include <SPI.h>
#include <ESP8266WiFi.h>
#include "MAX30100_PulseOximeter.h"
#include <LiquidCrystal_I2C.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

#define REPORTING_PERIOD_MS     1000
LiquidCrystal_I2C lcd(0x27, 16,2);
PulseOximeter pox;
uint32_t tsLastReport = 0;

float spo;
float bpm;
int counter;
int motor = D7;
int solenoid = D6;
int dataadc;
int tombol = D4;
int tombolx;
int hitung;
float vol;
float mmhg;
float mmhgx;
float sistole;
float diastole;
int sistolex;
int diastolex;
int mark = 0;

void onBeatDetected() {
    Serial.println("Beat!");
}

char ssid[ ] = "hotspothpku";
char pass[ ] = "123456789";//password wifi

#define BOTtoken "6984051613:AAEzuNaVaD4QMopmGfnYdb5nEZbytpAQxxx" //token bot telegram
#define idChat "1148868111" //idbot

WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);

void setup() {
  lcd.clear();
  lcd.begin();
  lcd.noCursor();
  Serial.begin(9600);
  Serial.println("Pulse oxymeter test!");
  pinMode(motor,OUTPUT);
  pinMode(solenoid,OUTPUT);
  pinMode(tombol,INPUT_PULLUP);

  client.setInsecure();
  Serial.print("Connecting Wifi: ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  
    Serial.print("Initializing pulse oximeter..");

    // Initialize sensor
    if (!pox.begin()) {
        Serial.println("FAILED");
        for(;;);
    } else {
        Serial.println("SUCCESS");
    }
    
  // Configure sensor to use 7.6mA for LED drive
  pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);

  // Register a callback routine
  pox.setOnBeatDetectedCallback(onBeatDetected);

 lcd.setCursor(0,0);
 lcd.print("BPM= ");
 lcd.setCursor(0,1);
 lcd.print("S=   D= ");
}

void loop() {
 dataadc = analogRead(A0);
 mmhgx = (dataadc - 46.222) / 3.2;

 lcd.setCursor(0,1);
 lcd.print("S= ");
 lcd.print(sistolex);
 lcd.print(" D= ");
 lcd.print(diastolex);
 lcd.print("    ");
     
 tombolx = digitalRead(tombol); 

 if(tombolx == LOW){
  mark = 0;
  lcd.clear();
  delay(1000);
  digitalWrite(motor,HIGH);
  digitalWrite(solenoid,HIGH);
  mulai();
  }
    
 pox.update();  
 // Grab the updated heart rate and SpO2 levels
 if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
        bpm = pox.getHeartRate();
        spo = pox.getSpO2();
        
        lcd.setCursor(0,0);
        lcd.print("B/S: ");
        lcd.print(pox.getHeartRate());
        lcd.print(" / ");
        lcd.print(pox.getSpO2());
        lcd.print("    ");
        /*
        Serial.print("Heart rate:");
        Serial.print(pox.getHeartRate());
        Serial.print("bpm / SpO2:");
        Serial.print(pox.getSpO2());
        Serial.println("%");
        */
        tsLastReport = millis();
    }

delay(10); 
}

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

if((mmhg >= mmhgx + 2)&&(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 >= 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);
kirimtele();
return;  
}

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

delay(1);   
mulai();  
}

void kirimtele(){
  
  if ((sistolex >= 90 )&&(sistolex <= 139)&&(diastolex >= 61)&&(diastolex <= 89)) {
    bot.sendChatAction(idChat, "Sedang mengetik...");
    Serial.print("TENSI NORMAL");
    delay(2000);
    String tensi = " tensi sekarang : ";
    tensi += float(sistolex);
    tensi += float(diastolex);
    tensi += " \n";
    tensi += "TENSI NORMAL!\n";
    bot.sendMessage(idChat, tensi, "");
    Serial.print("Mengirim data sensor ke telegram");
  }

  if ((sistolex >= 140 )&&(sistolex <= 170)&&(diastolex >= 90)&&(diastolex <= 100)) {
    bot.sendChatAction(idChat, "Sedang mengetik...");
    Serial.print("TENSI TINGGI");
    delay(2000);
    String tensi = " tensi sekarang : ";
    tensi += float(sistolex);
    tensi += float(diastolex);
    tensi += " \n";
    tensi += "TENSI TINGGI!\n";
    bot.sendMessage(idChat, tensi, "");
    Serial.print("Mengirim data sensor ke telegram");
  }

  
  if ((sistolex >= 50 )&&(sistolex <= 90)&&(diastolex >= 60)&&(diastolex <= 80)) {
    bot.sendChatAction(idChat, "Sedang mengetik...");
    Serial.print("TENSI RENDAH");
    delay(2000);
    String tensi = " tensi sekarang : ";
    tensi += float(sistolex);
    tensi += float(diastolex);
    tensi += " \n";
    tensi += "TENSI RENDAH!\n";
    bot.sendMessage(idChat, tensi, "");
    Serial.print("Mengirim data sensor ke telegram");
  }

  if ((bpm >= 50 )&&(bpm <= 100)) {
    bot.sendChatAction(idChat, "Sedang mengetik...");
    Serial.print("BPM NORMAL");
    delay(2000);
    String bpmnya = " BPM sekarang : ";
    bpmnya += float(bpm);
    bpmnya += " \n";
    bpmnya += "BPM NORMAL!\n";
    bot.sendMessage(idChat, bpmnya, "");
    Serial.print("Mengirim data sensor ke telegram");
  }

  if ((bpm >= 100 )&&(bpm <= 200)) {
    bot.sendChatAction(idChat, "Sedang mengetik...");
    Serial.print("BPM CEPAT");
    delay(2000);
    String bpmnya = " BPM sekarang : ";
    bpmnya += float(bpm);
    bpmnya += " \n";
    bpmnya += "BPM CEPAT!\n";
    bot.sendMessage(idChat, bpmnya, "");
    Serial.print("Mengirim data sensor ke telegram");
  }

  if ((bpm >= 10 )&&(bpm <= 90)) {
    bot.sendChatAction(idChat, "Sedang mengetik...");
    Serial.print("BPM LAMBAT");
    delay(2000);
    String bpmnya = " BPM sekarang : ";
    bpmnya += float(bpm);
    bpmnya += " \n";
    bpmnya += "BPM LAMBAT!\n";
    bot.sendMessage(idChat, bpmnya, "");
    Serial.print("Mengirim data sensor ke telegram");
  }

  if (spo >= 95 ) {
    bot.sendChatAction(idChat, "Sedang mengetik...");
    Serial.print("Saturasi NORMAL");
    delay(2000);
    String sponya = " SPO sekarang : ";
    sponya += float(spo);
    sponya += " \n";
    sponya += "Saturasi NORMAL!\n";
    bot.sendMessage(idChat, sponya, "");
    Serial.print("Mengirim data sensor ke telegram");
  }

  if (spo < 95 ) {
    bot.sendChatAction(idChat, "Sedang mengetik...");
    Serial.print("Saturasi RENDAH");
    delay(2000);
    String sponya = " SPO sekarang : ";
    sponya += float(spo);
    sponya += " \n";
    sponya += "Saturasi RENDAH!\n";
    bot.sendMessage(idChat, sponya, "");
    Serial.print("Mengirim data sensor ke telegram");
  }
  
}


c. Hasilnya





d. Program ARduino Kirim ke Thingspeak

#include <Arduino.h>
#include <math.h>
#include <Wire.h>  
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <ThingSpeak.h>
#include "MAX30100_PulseOximeter.h"
#include <LiquidCrystal_I2C.h>

#define REPORTING_PERIOD_MS     1000
LiquidCrystal_I2C lcd(0x27, 16,2);
PulseOximeter pox;
uint32_t tsLastReport = 0;

float spo;
float bpm;
int counter;
int motor = D7;
int solenoid = D6;
int dataadc;
int tombol = D4;
int tombolx;
int hitung;
float vol;
float mmhg;
float mmhgx;
float sistole;
float diastole;
int sistolex;
int diastolex;
int mark = 0;

void onBeatDetected() {
    Serial.println("Beat!");
}

WiFiClient client;
// ThingSpeak Settings
String apiKey = "HUAGGJ96F2RNAX30";
const char *ssid = "hotspothpku";
const char *pass = "123456789";
const char* server = "api.thingspeak.com";
const char* resource = "/update?api_key=";

void setup() {
  lcd.clear();
  lcd.begin();
  lcd.noCursor();
  Serial.begin(9600);
  Serial.println("Pulse oxymeter test!");
  pinMode(motor,OUTPUT);
  pinMode(solenoid,OUTPUT);
  pinMode(tombol,INPUT_PULLUP);

//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 sensor
    if (!pox.begin()) {
        Serial.println("FAILED");
        for(;;);
    } else {
        Serial.println("SUCCESS");
    }
    
  // Configure sensor to use 7.6mA for LED drive
  pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);

  // Register a callback routine
  pox.setOnBeatDetectedCallback(onBeatDetected);

 lcd.setCursor(0,0);
 lcd.print("BPM= ");
 lcd.setCursor(0,1);
 lcd.print("S=   D= ");
}

void loop() {
 dataadc = analogRead(A0);
 mmhgx = (dataadc - 46.222) / 3.2;

 lcd.setCursor(0,1);
 lcd.print("S= ");
 lcd.print(sistolex);
 lcd.print(" D= ");
 lcd.print(diastolex);
 lcd.print("    ");
     
 tombolx = digitalRead(tombol); 

 if(tombolx == LOW){
  mark = 0;
  lcd.clear();
  delay(1000);
  digitalWrite(motor,HIGH);
  digitalWrite(solenoid,HIGH);
  mulai();
  }
    
 pox.update();  
 // Grab the updated heart rate and SpO2 levels
 if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
        bpm = pox.getHeartRate();
        spo = pox.getSpO2();
        
        lcd.setCursor(0,0);
        lcd.print("B/S: ");
        lcd.print(pox.getHeartRate());
        lcd.print(" / ");
        lcd.print(pox.getSpO2());
        lcd.print("    ");
        /*
        Serial.print("Heart rate:");
        Serial.print(pox.getHeartRate());
        Serial.print("bpm / SpO2:");
        Serial.print(pox.getSpO2());
        Serial.println("%");
        */
        tsLastReport = millis();
    }

delay(10); 
}

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

if((mmhg >= mmhgx + 2)&&(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 >= 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);
kirimthings();
//kirimtele();
return;  
}

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

delay(1);   
mulai();  
}


void kirimthings(){
  
 if (client.connect(server,80))   //   "184.106.153.149" or api.thingspeak.com
 
                      {
                           
                             String postStr = apiKey;
                             postStr +="&field1=";
                             postStr += String(bpm);
                             postStr += "\r\n\r\n";

                             client.print(String("GET ") + resource + apiKey + "&field1=" + bpm + "&field2=" + spo + "&field3=" + sistolex + "&field4=" + diastolex + " HTTP/1.1\r\n" + "Host: " + server + "\r\n" + "Connection: close\r\n\r\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(". Send to Thingspeak.");
                        }
                       
          client.stop();

          Serial.println("Waiting...");
 
  // thingspeak needs minimum 15 sec delay between updates, i've set it to 30 seconds
  delay(10000);  
  
}



e. HASILNYA





f. VIDEO HASILNYA