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





Pakan Ikan Monitor PH Turbidity Amoniak Suhu dan Monitor Water Level IOT Blynk 2.0

Pakan Ikan Monitor PH Turbidity Amoniak Suhu dan Monitor Water Level IOT Blynk 2.0
 

         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang bisa mengukur PH Turbidity Suhu dan water level via IOT Blynk. alat ini juga terdapat RTC sebagai pewaktu, jadi ketika waktu sesuai dengan setingan maka pelontar berupa servo akan aktif. berikut adalah kodingdan skemanya.
 
 
1. Skema
 

 
2. Program Arduino IDE
 
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>
#include <EEPROM.h>
#define ONE_WIRE_BUS 12  
#include <Servo.h>
#include <SoftwareSerial.h>

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

#define trigPin1 2
#define echoPin1 3
#define trigPin2 5
#define echoPin2 6
 
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

LiquidCrystal_I2C lcd(0x27,20,4);
DS3231  rtc(SDA, SCL);
Servo myservo1;

int addr1 = 0;
int addr2 = 1;
int addr3 = 2;
int addr4 = 3;
int addr5 = 4;

Time  t;
int jampagi,jamsiang,jamsore;
float TempC;
float pHValue;
int tds;
int adctds;
int adcPH;
int TempCx;
int pHValuex;
int ntux;
float ntufix;
long duration1, distance1;
long duration2, distance2;  
int btset = 4;
int btup = 8;
int btdown = 7;
int btok = 11;
int btsetx;
int btupx;
int btdownx;
int btokx;
float batasamo;
float batasph;
float amoniak;
int relayaerator = A2;
int relayout = A3;
int relayin = A6;
int tanda = 0;
int kolam;
int tinggipakan;
int tdsValue;

void setup(){  
  
jampagi = EEPROM.read(addr1);
jamsiang = EEPROM.read(addr2);
jamsore = EEPROM.read(addr3);
batasamo = EEPROM.read(addr4);
batasph = EEPROM.read(addr5);

pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT); 

pinMode(relayaerator,OUTPUT);
digitalWrite(relayaerator,HIGH);
pinMode(relayin,OUTPUT);
digitalWrite(relayin,HIGH);
pinMode(relayout,OUTPUT);
digitalWrite(relayout,HIGH);

pinMode(btset,INPUT_PULLUP);
pinMode(btup,INPUT_PULLUP);
pinMode(btdown,INPUT_PULLUP);
pinMode(btok,INPUT_PULLUP);

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

rtc.begin();
//rtc.setDOW(WEDNESDAY);     // Set Day-of-Week to SUNDAmy
//rtc.setTime(14, 37, 0);     // Set the time to 12:00:00 (24hr format)
//rtc.setDate(1, 1, 2014);   // Set the date to January 1st, 2014

myservo1.attach(9);
}

void loop(){

btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);

if(btsetx == 0){
delay(1000);
lcd.clear();
setjampagi();
setjamsiang();
setjamsore();
setbatasamo();
setbatasph();
}
  
 t = rtc.getTime();
    
 adcPH = analogRead(A0); //menggunakan pin A0 untuk membaca output sensor pH
 pHValue = (adcPH - 1093.4) / -30.897;

 adctds = analogRead(A1);             
 tdsValue = map(adctds, 566, 1, 0, 100);
 
 pHValuex = pHValue * 100.0;
 
  sensors.requestTemperatures();
  TempC = sensors.getTempCByIndex(0); // Celcius
  TempCx =  TempC * 100.0;

if(pHValue < 6.5){
  amoniak = (pHValue / TempC) * 0.202; 
}

if(pHValue == 7.0){
  amoniak = (pHValue / TempC) * 1.131; 
}

if(pHValue > 7.0){
  amoniak = (pHValue / TempC) * 3.306; 
}

if(amoniak > batasamo){
  digitalWrite(relayaerator,HIGH);
  }

if(amoniak <= batasamo){
  digitalWrite(relayaerator,LOW);
  }

if((t.hour == jampagi)&&(jampagi > 0)&&(tanda == 0)){
  myservo1.write(150);
  delay(5000);
  myservo1.write(100);
  tanda = 1;
}

if((t.hour == jamsiang)&&(jamsiang > 0)&&(tanda == 1)){
  myservo1.write(150);
  delay(5000);
  myservo1.write(100);
  tanda = 2;
}

if((t.hour == jamsore)&&(jamsore > 0)&&(tanda == 2)){
  myservo1.write(150);
  delay(5000);
  myservo1.write(100);
  tanda = 0;
}

  lcd.setCursor(0,0);
  lcd.print("TDS:");
  lcd.print(tdsValue);
  lcd.print(" ");
 
  lcd.print("PH:");
  lcd.print(pHValue);
  lcd.print(" ");

  lcd.setCursor(0,1);
  lcd.print("T:");
  lcd.print(TempC,1);
  lcd.print("c ");
  
  lcd.print(batasamo,1);
  lcd.print("/");
  lcd.print(batasph,1);
  lcd.print("");

  lcd.setCursor(0,2);
  lcd.print(t.hour, DEC);
  lcd.print(":");
  lcd.print(t.min, DEC);
  lcd.print(":");
  lcd.print(t.sec, DEC);
  lcd.print("  ");
  lcd.print(jampagi);
  lcd.print("/");
  lcd.print(jamsiang);
  lcd.print("/");
  lcd.print(jamsore);
  lcd.print("");

  lcd.setCursor(0,3);
  lcd.print("Mg/l:");
  lcd.print(amoniak,1);
  lcd.print(" ");
 lcd.print(distance1);
 lcd.print("/");
 lcd.print(distance2);
 lcd.print("  ");

  //ketinggian air kolam 
  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;

  //ketinggian pakan ikan
  digitalWrite(trigPin2, LOW);  // Added this line
  delayMicroseconds(2); // Added this line
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPin2, LOW);
  duration2 = pulseIn(echoPin2, HIGH);
  distance2 = (duration2/2) / 29.1;
  
  tinggipakan = map(distance2, 5,30,100,0);

if((kolam >= 29)&&(kolam <= 31)){
  digitalWrite(relayin,LOW);
  digitalWrite(relayout,LOW);  
  }

if(kolam < 29){
  digitalWrite(relayin,HIGH);
  digitalWrite(relayout,LOW);
  }

if(kolam > 31){
  digitalWrite(relayin,LOW);
  digitalWrite(relayout,HIGH);
  }

  Serial.print("*");
  Serial.print(pHValue * 100.0);
  Serial.print(",");
  Serial.print(tdsValue);
  Serial.print(",");
  Serial.print(amoniak * 100.0);
  Serial.print(",");
  Serial.print(TempC * 100.0);
  Serial.println("#");
  
  delay(1000);
}

void setjampagi(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("Waktu Pakan Pagi");
  lcd.setCursor(0,1);
  lcd.print("Jam: ");
  lcd.print(jampagi);
  lcd.print("   ");

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

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

if(jampagi > 23){
jampagi = 0;  
}

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

setjampagi();  
}

void setjamsiang(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("Waktu Pakan Siang  ");
  lcd.setCursor(0,1);
  lcd.print("Jam: ");
  lcd.print(jamsiang);
  lcd.print("   ");

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

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

if(jamsiang > 23){
jamsiang = 0;  
}

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

setjamsiang();  
}

void setjamsore(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("Waktu Pakan Sore  ");
  lcd.setCursor(0,1);
  lcd.print("Jam: ");
  lcd.print(jamsore);
  lcd.print("   ");

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

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

if(jamsore > 23){
jamsore = 0;  
}

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

setjamsore();  
}

void setbatasamo(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("BATAS AMONIAK  ");
  lcd.setCursor(0,1);
  lcd.print("mg/l: ");
  lcd.print(batasamo);
  lcd.print("   ");

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

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

if(batasamo > 100.0){
batasamo = 0;  
}

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

setbatasamo();  
}

void setbatasph(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("BATAS PH  ");
  lcd.setCursor(0,1);
  lcd.print("PH: ");
  lcd.print(batasph);
  lcd.print("   ");

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

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

if(batasph > 100.0){
batasph = 0;  
}

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

setbatasph();  
}
 
 
3. Program ESP8266
 
#define BLYNK_TEMPLATE_ID "TMPL7GgHJ-bSF"
#define BLYNK_TEMPLATE_NAME "Pakan Ikan"
#define BLYNK_AUTH_TOKEN "2ycYdRyEJqHnFgXXsJKH3rh-yb5_cvbn"
#define  BLYNK_PRINT Serial  

#include <SPI.h>
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

int temp;
int x = 5;
int y;

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

float ph;
int tds;
float amoniak;
float suhu;

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

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

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

void sendSensor()
{
 Blynk.virtualWrite(V0, ph);
 Blynk.virtualWrite(V1, tds);
 Blynk.virtualWrite(V2, amoniak);
 Blynk.virtualWrite(V3, suhu);
 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();

 ph = datain1 / 100.0;
 tds = datain2 / 1;
 amoniak = datain3 / 100.0;
 suhu = datain4 / 100.0;
 
}
 
 
4. VIDEO HASILNYA
 

Monitor PH Turbidity NTU TDS Suhu IOT Notif TELEGRAM

Monitor PH Turbidity NTU TDS Suhu IOT Notif TELEGRAM


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mengukur PH ,TDS ,NTU ,Turbidity ,Suhu dan notif IOT telegram untuk lebih jelasnya berikut adalah koding dan foto alatnya.

 
1. Foto Alat




2. Program Arduino IDE

#include <Wire.h>
#include <LiquidCrystal_I2C.h> 
#include <OneWire.h>
#include <DallasTemperature.h>

LiquidCrystal_I2C lcd(0x27,20,4);
#define TdsSensorPin A2
#define ONE_WIRE_BUS 7  
const int pHMeterPin = A0;
const int sensorTurbi = A1;
float volt;
float ntu;
float TempC;

int phx;
int suhux;
int ntux;
int tdsx;

#define VREF 5.0      // analog reference voltage(Volt) of the ADC
#define SCOUNT  30           // sum of sample point
int analogBuffer[SCOUNT];    // store the analog value in the array, read from ADC
int analogBufferTemp[SCOUNT];
int analogBufferIndex = 0,copyIndex = 0;
float averageVoltage = 0,tdsValue = 0,temperature = 25;

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

void setup() {
  Serial.begin(9600); // Start serial communication at 9600 baud rate
  lcd.begin();  
  lcd.clear();
  lcd.noCursor();  
  pinMode(TdsSensorPin,INPUT);
  Wire.begin();  
  sensors.begin();
}

void loop() {
  int sensorValue = analogRead(pHMeterPin); // Read the analog value from sensor
  float voltage = sensorValue * (5.0 / 1023.0); // Convert to voltage
  float pH = (voltage * 3.5) + 0.5; // Convert voltage to pH value (example equation)

  volt = 0;
    for(int i=0; i<800; i++)
    {
        volt += ((float)analogRead(sensorTurbi)/1023)*5;
    }
    volt = volt/800;
    volt = round_to_dp(volt,2);
    if(volt < 2.5){
      ntu = 3000;
    }else{
      ntu = -1120.4*square(volt)+5742.3*volt-4353.8; 
    }

//==========================================
static unsigned long analogSampleTimepoint = millis();
   if(millis()-analogSampleTimepoint > 40U)     //every 40 milliseconds,read the analog value from the ADC
   {
     analogSampleTimepoint = millis();
     analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin);    //read the analog value and store into the buffer
     analogBufferIndex++;
     if(analogBufferIndex == SCOUNT) 
         analogBufferIndex = 0;
   }   
   static unsigned long printTimepoint = millis();
   if(millis()-printTimepoint > 800U)
   {
      printTimepoint = millis();
      for(copyIndex=0;copyIndex<SCOUNT;copyIndex++)
        analogBufferTemp[copyIndex]= analogBuffer[copyIndex];
      averageVoltage = getMedianNum(analogBufferTemp,SCOUNT) * (float)VREF / 1024.0; // read the analog value more stable by the median filtering algorithm, and convert to voltage value
      float compensationCoefficient=1.0+0.02*(temperature-25.0);    //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0));
      float compensationVolatge=averageVoltage/compensationCoefficient;  //temperature compensation
      tdsValue=(133.42*compensationVolatge*compensationVolatge*compensationVolatge - 255.86*compensationVolatge*compensationVolatge + 857.39*compensationVolatge)*0.5; //convert voltage value to tds value
      //Serial.print("voltage:");
      //Serial.print(averageVoltage,2);
      //Serial.print("V   ");
      //Serial.print("TDS Value:");
      //Serial.print(tdsValue,0);
      //Serial.println("ppm");
      
     lcd.setCursor(0,2);
     lcd.print("TDS: ");
     lcd.print(tdsValue,0);
     lcd.print(" ppm  ");
   }

  sensors.requestTemperatures();
  TempC = sensors.getTempCByIndex(0); // Celcius
  
  lcd.setCursor(0,0);
  lcd.print("pH: ");
  lcd.print(pH,1);
  lcd.print("  ");
   
  lcd.setCursor(0,1);
  lcd.print("NTU: ");
  lcd.print(ntu,0);
  lcd.print("  ");

  lcd.setCursor(0,3);
  lcd.print("Suhu: ");
  lcd.print(TempC,0);
  lcd.print(" C  ");

 phx = pH;
 ntux = ntu;
 tdsx = tdsValue;
 suhux = TempC;

  Serial.print("*");
  Serial.print(phx);
  Serial.print(",");
  Serial.print(ntux);
  Serial.print(",");
  Serial.print(tdsx);
  Serial.print(",");
  Serial.print(suhux);
  Serial.println("#");

  delay(1000); // Wait for a second before reading again
}

float round_to_dp( float in_value, int decimal_place )
{
  float multiplier = powf( 10.0f, decimal_place );
  in_value = roundf( in_value * multiplier ) / multiplier;
  return in_value;
}


int getMedianNum(int bArray[], int iFilterLen) 
{
      int bTab[iFilterLen];
      for (byte i = 0; i<iFilterLen; i++)
    bTab[i] = bArray[i];
      int i, j, bTemp;
      for (j = 0; j < iFilterLen - 1; j++) 
      {
    for (i = 0; i < iFilterLen - j - 1; i++) 
          {
      if (bTab[i] > bTab[i + 1]) 
            {
    bTemp = bTab[i];
          bTab[i] = bTab[i + 1];
    bTab[i + 1] = bTemp;
       }
    }
      }
      if ((iFilterLen & 1) > 0)
  bTemp = bTab[(iFilterLen - 1) / 2];
      else
  bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2;
      return bTemp;
}


3. Program Arduino IDE ver 2

#include <Wire.h>
#include <LiquidCrystal_I2C.h> 
#include <OneWire.h>
#include <DallasTemperature.h>

LiquidCrystal_I2C lcd(0x27,20,4);
#define TdsSensorPin A2
#define ONE_WIRE_BUS 7  
const int pHMeterPin = A0;
const int sensorTurbi = A1;
float volt;
float ntu;
float TempC;

int phx;
int suhux;
int ntux;
int tdsx;

#define VREF 5.0      // analog reference voltage(Volt) of the ADC
#define SCOUNT  30           // sum of sample point
int analogBuffer[SCOUNT];    // store the analog value in the array, read from ADC
int analogBufferTemp[SCOUNT];
int analogBufferIndex = 0,copyIndex = 0;
float averageVoltage = 0,tdsValue = 0,temperature = 25;

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

void setup() {
  Serial.begin(9600); // Start serial communication at 9600 baud rate
  lcd.begin();  
  lcd.clear();
  lcd.noCursor();  
  pinMode(TdsSensorPin,INPUT);
  Wire.begin();  
  sensors.begin();
}

void loop() {
  int sensorValue = analogRead(pHMeterPin); // Read the analog value from sensor
  float pH = (sensorValue - 520.5)/-36.228; 

  volt = 0;
    for(int i=0; i<800; i++)
    {
        volt += ((float)analogRead(sensorTurbi)/1023)*5;
    }
    volt = volt/800;
    volt = round_to_dp(volt,2);
    if(volt < 2.5){
      ntu = 3000;
    }else{
      ntu = -1120.4*square(volt)+5742.3*volt-4353.8; 
    }

//==========================================
static unsigned long analogSampleTimepoint = millis();
   if(millis()-analogSampleTimepoint > 40U)     //every 40 milliseconds,read the analog value from the ADC
   {
     analogSampleTimepoint = millis();
     analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin);    //read the analog value and store into the buffer
     analogBufferIndex++;
     if(analogBufferIndex == SCOUNT) 
         analogBufferIndex = 0;
   }   
   static unsigned long printTimepoint = millis();
   if(millis()-printTimepoint > 800U)
   {
      printTimepoint = millis();
      for(copyIndex=0;copyIndex<SCOUNT;copyIndex++)
        analogBufferTemp[copyIndex]= analogBuffer[copyIndex];
      averageVoltage = getMedianNum(analogBufferTemp,SCOUNT) * (float)VREF / 1024.0; // read the analog value more stable by the median filtering algorithm, and convert to voltage value
      float compensationCoefficient=1.0+0.02*(temperature-25.0);    //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0));
      float compensationVolatge=averageVoltage/compensationCoefficient;  //temperature compensation
      tdsValue=(133.42*compensationVolatge*compensationVolatge*compensationVolatge - 255.86*compensationVolatge*compensationVolatge + 857.39*compensationVolatge)*0.5; //convert voltage value to tds value
      //Serial.print("voltage:");
      //Serial.print(averageVoltage,2);
      //Serial.print("V   ");
      //Serial.print("TDS Value:");
      //Serial.print(tdsValue,0);
      //Serial.println("ppm");
      
     lcd.setCursor(0,2);
     lcd.print("TDS: ");
     lcd.print(tdsValue,0);
     lcd.print(" ppm  ");
   }

  sensors.requestTemperatures();
  TempC = sensors.getTempCByIndex(0); // Celcius
  
  lcd.setCursor(0,0);
  lcd.print("pH: ");
  lcd.print(pH,1);
  lcd.print("  ");
   
  lcd.setCursor(0,1);
  lcd.print("NTU: ");
  lcd.print(ntu,0);
  lcd.print("  ");

  lcd.setCursor(0,3);
  lcd.print("Suhu: ");
  lcd.print(TempC,0);
  lcd.print(" C  ");

 phx = pH;
 ntux = ntu;
 tdsx = tdsValue;
 suhux = TempC;

  Serial.print("*");
  Serial.print(phx);
  Serial.print(",");
  Serial.print(ntux);
  Serial.print(",");
  Serial.print(tdsx);
  Serial.print(",");
  Serial.print(suhux);
  Serial.println("#");

  delay(1000); // Wait for a second before reading again
}

float round_to_dp( float in_value, int decimal_place )
{
  float multiplier = powf( 10.0f, decimal_place );
  in_value = roundf( in_value * multiplier ) / multiplier;
  return in_value;
}


int getMedianNum(int bArray[], int iFilterLen) 
{
      int bTab[iFilterLen];
      for (byte i = 0; i<iFilterLen; i++)
    bTab[i] = bArray[i];
      int i, j, bTemp;
      for (j = 0; j < iFilterLen - 1; j++) 
      {
    for (i = 0; i < iFilterLen - j - 1; i++) 
          {
      if (bTab[i] > bTab[i + 1]) 
            {
    bTemp = bTab[i];
          bTab[i] = bTab[i + 1];
    bTab[i + 1] = bTemp;
       }
    }
      }
      if ((iFilterLen & 1) > 0)
  bTemp = bTab[(iFilterLen - 1) / 2];
      else
  bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2;
      return bTemp;
}



4. Program ESP8266

#include <SPI.h>
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>

#define BOTtoken "8599512345:AAHWGXsuTQp5IRhkjhhgyrdrdSFDdtrdtdgh" //token bot telegram
#define idChat "1123456777" //idbot

WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);

int temp;
int x = 5;
int y;

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

int ph;
int tds;
int ntu;
int suhu;

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

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

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


void setup(){  
  
  client.setInsecure();
  Serial.begin(9600);
  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());
  delay(5000);
}

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

if(parsing){
    parsingData();

    bot.sendChatAction(idChat, "Sedang mengetik...");
    
    String hasil = " PH : "; hasil += int(ph);
    hasil += " NTU : "; hasil += int(ntu);
    hasil += " TDS : "; hasil += int(tds);
    hasil += " SUHU : "; hasil += int(suhu);
    bot.sendMessage(idChat, hasil, "");
    Serial.print("Mengirim data sensor ke telegram");
    
  delay(200);

}
 
delay(1000);
}

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();

 Serial.print(datain1);Serial.print("||"); Serial.print(datain2);Serial.print("||"); Serial.print(datain3);Serial.print("||"); Serial.println(datain4);
 
 ph = datain1;
 ntu = datain2;
 tds = datain3;
 suhu = datain4;
 
 
 

5. VIDEO HASILNYA




Monitoring Tegangan Arus Daya Freq 2 Buah PZEM-004t dan Kendali Relay via IOT Blynk

Monitoring Tegangan Arus Daya Freq 2 Buah PZEM-004t dan Kendali Relay via IOT Blynk 2.0


       Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mengukur arus dan tegangan menggunakan sensor PZEM-004t dan juga bisa kendali relay via IOT Blynk untuk lebih jelasnya berikut adalah koding dan skemanya.



1. Skema




2. Program Arduino IDE

#define BLYNK_TEMPLATE_ID "TMPL67fgTTbjjg"
#define BLYNK_TEMPLATE_NAME "monitor arus tegangan"
#define BLYNK_AUTH_TOKEN "a4sgOvXoyxVJ1LmTqXdl_oSL0TYhDwsA"
#define BLYNK_PRINT Serial  

#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <HardwareSerial.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <PZEM004Tv30.h>
#include <LiquidCrystal_I2C.h> 
#define RXD2 16
#define TXD2 17

LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display
 
PZEM004Tv30 pzem(&Serial);  //(RX,TX) connect to TX,RX of PZEM
PZEM004Tv30 pzem2(&Serial2);  //(RX,TX) connect to TX,RX of PZEM

float voltage1;
float current1;
float power1;
float energy1;
float biaya; 
float voltage2;
float current2;
float power2;
float energy2;
int relay = 19;
int ssr = 27;
float selisih;
int btresetx;
int freq1;
int freq2;
int pinValue;

BlynkTimer timer;

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

BLYNK_WRITE(V8)
{
  pinValue = param.asInt();   

  if(pinValue == 1){
    digitalWrite(relay, LOW);
  }
  
  if(pinValue == 0) {
    digitalWrite(relay, HIGH);
  }
  
}

void sendSensor()
{
 Blynk.virtualWrite(V0, voltage1);
 Blynk.virtualWrite(V1, current1);
 Blynk.virtualWrite(V2, power1);
 Blynk.virtualWrite(V3, freq1);

 Blynk.virtualWrite(V4, voltage2);
 Blynk.virtualWrite(V5, current2);
 Blynk.virtualWrite(V6, power2);
 Blynk.virtualWrite(V7, freq2);
 
 delay(1000);
}

void setup() {

  Serial.begin(9600); 
  Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
  lcd.begin();  
  lcd.clear();
  lcd.noCursor();  
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
  timer.setInterval(1000L, sendSensor);
  pinMode(relay,OUTPUT);
}

void loop() {
 
voltage1 = pzem.voltage();
current1 = pzem.current();
power1 = pzem.power();
freq1 = pzem.frequency();

voltage2 = pzem2.voltage();
current2 = pzem2.current();
power2 = pzem2.power();
freq2 = pzem2.frequency();

lcd.setCursor(0,0);
lcd.print("V12:");
lcd.print(voltage1);
lcd.print("/");
lcd.print(voltage2);
lcd.print(" ");

lcd.setCursor(0,1);
lcd.print("I12:");   
lcd.print(current1);
lcd.print("/");
lcd.print(current2);
lcd.print("     ");

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


3. VIDEO HASILNYA



Monitor Anemometer Lux Tegangan Arus + Suhu Humidity IOT Thingspeak

Monitor Anemometer Lux Tegangan Arus + Suhu Humidity IOT Thingspeak


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor banyak variabel yaitu Lux Tegangan Arus + Suhu Humidity dengan IOT thingspeak. alat ini menggunakan Arduino Uno wifi sehingga mudah digunakan.


1. Program Arduino 

#include <Wire.h>  // i2C Conection Library
#include <LiquidCrystal_I2C.h>  //i2C LCD Library
#include <BH1750FVI.h>
#include "DHT.h"
#define DHTPIN 8

LiquidCrystal_I2C lcd(0x27, 16, 2);
BH1750FVI LightSensor;
uint16_t lux;
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

// anemometer parameters
volatile byte rpmcount; // count signals
volatile unsigned long last_micros;
unsigned long timeold;
unsigned long timemeasure = 2.00; // seconds
int timetoSleep = 1;               // minutes
unsigned long sleepTime = 15;      // minutes
unsigned long timeNow;
int countThing = 0;
int GPIO_pulse = 2; // Arduino = D2
float rpm, rps;     // frequencies
float radius = 0.1; // meters - measure of the lenght of each the anemometer wing
float velocity_kmh; // km/h
float velocity_ms;  //m/s
float omega = 0;    // rad/s
float calibration_value = 2.0;
int adcteg;
float tegangan;
int adcarus;
float v;
float arus;
int t, h;

void setup() {

  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  dht.begin();
  
  LightSensor.begin();
  LightSensor.SetAddress(Device_Address_H);//Address 0x5C
  LightSensor.SetMode(Continuous_H_resolution_Mode);
  
  pinMode(GPIO_pulse, INPUT_PULLUP);
  digitalWrite(GPIO_pulse, LOW);

  detachInterrupt(digitalPinToInterrupt(GPIO_pulse));                         // force to initiate Interrupt on zero
  attachInterrupt(digitalPinToInterrupt(GPIO_pulse), rpm_anemometer, RISING); //Initialize the intterrupt pin
  rpmcount = 0;
  rpm = 0;
  timeold = 0;
  timeNow = 0;
 
}

void loop()
{

  h = dht.readHumidity();
  t = dht.readTemperature();
  
  adcteg = analogRead(A0);
  tegangan = adcteg * (5.0 / 1023.0) * 4.8;

  adcarus = analogRead(A1);
  v = adcarus * (4.8 / 1023.0);
  arus = (v - 2.4)/0.1;


  //Measure RPM
  if ((millis() - timeold) >= timemeasure * 1000)
  {
    //countThing++;
    detachInterrupt(digitalPinToInterrupt(GPIO_pulse)); // Disable interrupt when calculating
    rps = float(rpmcount) / float(timemeasure);         // rotations per second
    rpm = 60 * rps;                                     // rotations per minute
    omega = 2 * PI * rps;                               // rad/s
    velocity_ms = omega * radius * calibration_value;   // m/s
    velocity_kmh = velocity_ms * 3.6;                   // km/h
        
    timeold = millis();
    rpmcount = 0;
    attachInterrupt(digitalPinToInterrupt(GPIO_pulse), rpm_anemometer, RISING); // enable interrupt
  }

  lux = LightSensor.GetLightIntensity();
  
  lcd.setCursor(0,0);
  lcd.print("m/s=");
  lcd.print(velocity_ms);
  lcd.print(" L:");
  lcd.print(lux);
  lcd.print("   ");

  lcd.setCursor(0,1);
  lcd.print("VI=");
  lcd.print(tegangan,1);
  lcd.print("/");
  lcd.print(arus,1);
  lcd.print("   ");

  Serial.print("*");
  Serial.print(tegangan * 100.0);
  Serial.print(",");
  Serial.print(arus * 100.0);
  Serial.print(",");
  Serial.print(lux);
  Serial.print(",");
  Serial.print(velocity_ms * 100.0);
  Serial.print(",");
  Serial.print(t);
  Serial.print(",");
  Serial.print(h);  
  Serial.println("#");
    
delay(100);
}

void rpm_anemometer()
{
  if (long(micros() - last_micros) >= 5000)
  { // time to debounce measures
    rpmcount++;
    last_micros = micros();
  }
}


2. Program ESP8266

#include <ESP8266WiFi.h>
#include <ThingSpeak.h>
#include <WiFiClient.h>

int temp;
int x = 5;
int y;
int t, h;

int value1;
int value2;
int value3;
int value4;
int value5;
int value6;

float tegangan;
int lux;
float arus;
float velocity_ms;

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

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

String apiKey = "GFDHJTTTKJHGFVYU";     //  Enter your Write API key from ThingSpeak
const char* resource = "/update?api_key=";

const char* ssid =  "hotspothpku";     // replace with your wifi ssid and wpa2 key
const char* pass =  "1234567890";
const char* server = "api.thingspeak.com";

WiFiClient  client;

void setup()
{
 
  dataIn="";
  Serial.begin(9600);
  delay(10);

  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

      while (WiFi.status() != WL_CONNECTED)
     {
            delay(500);
            Serial.print(".");
     }
      Serial.println("");
      Serial.println("WiFi connected");

}

void loop()
{

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

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

                             client.print(String("GET ") + resource + apiKey + "&field1=" + tegangan + "&field2=" + arus + "&field3=" + lux + "&field4=" + velocity_ms + "&field5=" + t + "&field6=" + h + " 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...");

  delay(10000);
 
 }
}

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();
 datain6 = dt[5].toInt();
 
 tegangan = datain1 / 100.0;
 arus = datain2 / 100.0;
 lux = datain3 / 1;
 velocity_ms = datain4 / 100.0;
 t = datain5 / 1;
 h = datain6 / 1;
 
}




Monitor Anemometer Lux Tegangan Arus

Monitor Anemometer Lux Tegangan Arus

        
        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor kecepatan angin, lux cahaya, suhu dan kelembaban serta di monitor via Thingspeak dan ditampilkan juga ke lcd, untuk lebih jelasnya berikut adalah kodingnya.


1. Koding Arduino UNO

#include <Wire.h>  // i2C Conection Library
#include <LiquidCrystal_I2C.h>  //i2C LCD Library
#include <BH1750FVI.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
BH1750FVI LightSensor;
uint16_t lux;

// anemometer parameters
volatile byte rpmcount; // count signals
volatile unsigned long last_micros;
unsigned long timeold;
unsigned long timemeasure = 2.00; // seconds
int timetoSleep = 1;               // minutes
unsigned long sleepTime = 15;      // minutes
unsigned long timeNow;
int countThing = 0;
int GPIO_pulse = 2; // Arduino = D2
float rpm, rps;     // frequencies
float radius = 0.1; // meters - measure of the lenght of each the anemometer wing
float velocity_kmh; // km/h
float velocity_ms;  //m/s
float omega = 0;    // rad/s
float calibration_value = 2.0;
int adcteg;
float tegangan;
int adcarus;
float v;
float arus;


void setup() {

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

  LightSensor.begin();
  LightSensor.SetAddress(Device_Address_H);//Address 0x5C
  LightSensor.SetMode(Continuous_H_resolution_Mode);
  
  pinMode(GPIO_pulse, INPUT_PULLUP);
  digitalWrite(GPIO_pulse, LOW);

  detachInterrupt(digitalPinToInterrupt(GPIO_pulse));                         // force to initiate Interrupt on zero
  attachInterrupt(digitalPinToInterrupt(GPIO_pulse), rpm_anemometer, RISING); //Initialize the intterrupt pin
  rpmcount = 0;
  rpm = 0;
  timeold = 0;
  timeNow = 0;
 
}

void loop()
{

  adcteg = analogRead(A0);
  tegangan = adcteg * (5.0 / 1023.0) * 4.8;

  adcarus = analogRead(A1);
  v = adcarus * (4.8 / 1023.0);
  arus = (v - 2.4)/0.1;


  //Measure RPM
  if ((millis() - timeold) >= timemeasure * 1000)
  {
    //countThing++;
    detachInterrupt(digitalPinToInterrupt(GPIO_pulse)); // Disable interrupt when calculating
    rps = float(rpmcount) / float(timemeasure);         // rotations per second
    rpm = 60 * rps;                                     // rotations per minute
    omega = 2 * PI * rps;                               // rad/s
    velocity_ms = omega * radius * calibration_value;   // m/s
    velocity_kmh = velocity_ms * 3.6;                   // km/h
        
    timeold = millis();
    rpmcount = 0;
    attachInterrupt(digitalPinToInterrupt(GPIO_pulse), rpm_anemometer, RISING); // enable interrupt
  }

  lux = LightSensor.GetLightIntensity();
  
  lcd.setCursor(0,0);
  lcd.print("m/s=");
  lcd.print(velocity_ms);
  lcd.print(" L:");
  lcd.print(lux);
  lcd.print("   ");

  lcd.setCursor(0,1);
  lcd.print("VI=");
  lcd.print(tegangan,1);
  lcd.print("/");
  lcd.print(arus,1);
  lcd.print("   ");

  Serial.print("*");
  Serial.print(tegangan * 100.0);
  Serial.print(",");
  Serial.print(arus * 100.0);
  Serial.print(",");
  Serial.print(lux);
  Serial.print(",");
  Serial.print(velocity_ms * 100.0);
  Serial.println("#");
    
delay(100);
}

void rpm_anemometer()
{
  if (long(micros() - last_micros) >= 5000)
  { // time to debounce measures
    rpmcount++;
    last_micros = micros();
  }
}



2. Koding ESP8266

#include <ESP8266WiFi.h>
#include <ThingSpeak.h>
#include <WiFiClient.h>

int temp;
int x = 5;
int y;

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

float tegangan;
int lux;
float arus;
float velocity_ms;

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

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

String apiKey = "C89ZC3YLACG92XXX";     //  Enter your Write API key from ThingSpeak
const char* resource = "/update?api_key=";

const char* ssid =  "hotspothpku";     // replace with your wifi ssid and wpa2 key
const char* pass =  "1234567890";
const char* server = "api.thingspeak.com";

WiFiClient  client;

void setup()
{
 
  dataIn="";
  Serial.begin(9600);
  delay(10);

  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

      while (WiFi.status() != WL_CONNECTED)
     {
            delay(500);
            Serial.print(".");
     }
      Serial.println("");
      Serial.println("WiFi connected");

}

void loop()
{

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

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

                             client.print(String("GET ") + resource + apiKey + "&field1=" + tegangan + "&field2=" + arus + "&field3=" + lux + "&field4=" + velocity_ms + " 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...");

  delay(10000);
 
 }
}

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();

//kirim data hasil parsing
Serial.print("data 1 : ");
Serial.print(datain1);
Serial.print("\n");
Serial.print("data 2 : ");
Serial.print(datain2);
Serial.print("\n");
Serial.print("data 3 : ");
Serial.print(datain3);

 tegangan = datain1 / 100.0;
 arus = datain2 / 100.0;
 lux = datain3 / 1;
 velocity_ms = datain4 / 100.0;
 
}