• Tidak ada hasil yang ditemukan

LAMPIRAN A SOURCE CODE SENSOR DAN FUNGSI

N/A
N/A
Protected

Academic year: 2022

Membagikan "LAMPIRAN A SOURCE CODE SENSOR DAN FUNGSI"

Copied!
18
0
0

Teks penuh

(1)

LAMPIRAN A

SOURCE CODE SENSOR DAN FUNGSI

//Library

#include “PrayerTimes.h”

#include "Sodaq_DS3231.h"

//Kamus

//Water Level Indicator void setup() {

int volume_saat_ini = 0;

uint8_t persentase_volume_dalam_tandon = 0;

double air_masuk = 0, temp_volume_saat_ini = 0;

// Water Flow Sensor

byte timer_Sensor_init = 0;

byte Init_Flow_Sensor = 2;

float Standar_Konstanta = 4.5;

volatile byte Pulsa_Baca_Sensor;

float debit_Air;

float volume_ML_perDetik;

float volume_ML_perDetik_total;

unsigned long temp_Millis;

uint8_t Status_Penggunaan = 0;

// RTC // Waktu

char weekDay[][7] = { "Mggu", "Senn", "Slsa", "Rabu", "Kams",

"Jumt", "Sbtu", "Mggu"};

// Jadwal Sholat

double times[sizeof(TimeName) / sizeof(char*)];

double lintang; //Latitude double bujur; //Longitude int Z;

//Pendukung

boolean motor_nyala_sebelum_sholat = false;

uint8_t maksimal_volume = 100;

uint8_t minimal_volume = 30;

//Fuzzy Logic

(2)

float input[2] = {0,60};

float in_Debit[3] = {2.2, 3.5, 4.8};

float in_Waktu[3] = {50, 70, 90};

float u_Debit[3];

float u_Waktu[3];

float rule[3][3];

float rule00, rule01, rule02;

float rule10, rule11, rule12;

float rule20, rule21, rule22;

uint8_t valueOf_output[3]= {50, 70, 90};//low, normal, labor dalam %

float output_fuzzy;

uint8_t loop_ = 0;

boolean stat_proses_fuzzy = false;

boolean satu_jam_seb_sholat = false;

int tmp_mnt;

// Algoritma

// Water Level Indicator int sensor_level_air(){

uint8_t baca_level_air;

persentase_volume_dalam_tandon = 0;

for(int x=25;x<44;x++){

if(x%2 != 0){

baca_level_air = digitalRead(x);

if(baca_level_air == LOW){

persentase_volume_dalam_tandon += 10;

} }

delay(0);

}

return persentase_volume_dalam_tandon;

Serial.print(persentase_volume_dalam_tandon);

}

//Water Flow Sensor void baca_flow_sensor(){

float refreshRate = 850;

if((millis() - temp_Millis) > refreshRate) {

(3)

detachInterrupt(timer_Sensor_init);

debit_Air = ((refreshRate / (millis() - temp_Millis)) * Pulsa_Baca_Sensor) / Standar_Konstanta;

temp_Millis = millis();

volume_ML_perDetik = (debit_Air / 60) * refreshRate;

volume_ML_perDetik_total += volume_ML_perDetik;

Pulsa_Baca_Sensor = 0; //pembacaan sensor di kosongkan if(work_mode == 1 && system_mode == 1 && !stat_proses_fuzzy){

input_fuzzy += debit_Air;

loop_++;

if(loop_ == 10){

input_fuzzy /= loop_;

loop_ = 0;

stat_proses_fuzzy = true;

} }

attachInterrupt(timer_Sensor_init, Pulsa_Baca_Sensor_, FALLING);

} }

void motor_Off(){

if(status_motor == 1){air_masuk = air_masuk + ((volume_saat_ini - temp_volume_saat_ini)*80/100);}

status_motor = 0;

digitalWrite(motor, status_motor);

}

void Pulsa_Baca_Sensor_(){

Pulsa_Baca_Sensor++;

}

// RTC

rtc.begin();

DateTime dt(2020, 4, 19, 22, 11, 0, 0); //tahun, bulan, tanggal, jam, menit, detik, hari 0 – 7... Satu kali set

rtc.setDateTime(dt); // Satu kali set

void scheduleInitialisation() {

DateTime now = rtc.now();

lintang = -5.3566944;

bujur = 105.3188333;

Z = 7 ;

(4)

int tgl = now.date();

int bln = now.month();

int thn = now.year();

long mulai = millis();

set_calc_method(ISNA);

set_asr_method(Shafii);

set_high_lats_adjust_method(AngleBased);

set_fajr_angle(20);

set_isha_angle(18);

get_prayer_times(thn, bln, tgl, lintang, bujur, Z, times);

}

void motor_on_sblm_sholat(){

int hours, minutes;

get_float_time_parts(times[0], hours, minutes);

cekJadwalFunc(hours, minutes, 1);

get_float_time_parts(times[2], hours, minutes);

cekJadwalFunc(hours, minutes, 2);

get_float_time_parts(times[3], hours, minutes);

cekJadwalFunc(hours, minutes, 3);

get_float_time_parts(times[4], hours, minutes);

cekJadwalFunc(hours, minutes, 4);

get_float_time_parts(times[6], hours, minutes);

cekJadwalFunc(hours, minutes, 5);

//tampilJadwalSholatSerial(hours, minutes);

}

void cekJadwalFunc(int jam_, int menit_, uint8_t idxSholat){

DateTime now = rtc.now();

(5)

if(volume_saat_ini < batas_Air_Sebelum_Sholat &&

!pompa_nyala_sebelum_sholat){//pompa nyala sebelum sholat saaat volume kurang dari nilai tertentu

//pengecekan sholat jumat

if(idx_sholat == 2 && now.dayOfWeek() == 5){

if(menit_ >= 30){

if (now.hour() == jam_ - 2 && now.minute() >= (menit_ - 30)){

eksekusi1jamSebelumSholat();

input[1] = 120 + (menit_ - now.minute());

tmp_mnt = now.minute();

}

else if (now.hour() == jam_ - 1){

eksekusi1jamSebelumSholat();

input[1] = menit_ + (60 - now.minute());

tmp_mnt = now.minute();

}

else if (now.hour() == jam_ && now.minute() < menit_){

eksekusi1jamSebelumSholat();

input[1] = menit_ - now.minute();

tmp_mnt = now.minute();

} }

else if(menit_ < 30){

if (now.hour() == jam_ - 3 && now.minute() >= (30 + menit_)){

eksekusi1jamSebelumSholat();

input[1] = 120 + menit_ + (60 - now.minute());

tmp_mnt = now.minute();

}

else if (now.hour() == jam_ - 2){

eksekusi1jamSebelumSholat();

input[1] = menit_ + (120 - now.minute());

tmp_mnt = now.minute();

}

else if (now.hour() == jam_ - 1){

(6)

eksekusi1jamSebelumSholat();

input[1] = menit_ + (60 - now.minute());

tmp_mnt = now.minute();

}

else if (now.hour() == jam_ && now.minute() < menit_){

eksekusi1jamSebelumSholat();

input[1] = menit_ - now.minute();

tmp_mnt = now.minute();

} } } else{

if(menit_ >= 30){

if (now.hour() == jam_ - 1 && now.minute() >= (menit_ - 30)){

eksekusi1jamSebelumSholat();

input[1] = 60 + (menit_ - now.minute());

tmp_mnt = now.minute();

}

else if (now.hour() == jam_ && now.minute() < menit_){

eksekusi1jamSebelumSholat();

input[1] = menit_ - now.minute();

tmp_mnt = now.minute();

} }

else if(menit_ < 30){

if (now.hour() == jam_ - 2 && now.minute() >= (30 + menit_)){

eksekusi1jamSebelumSholat();

input[1] = 60 + menit_ + (60 - now.minute());

tmp_mnt = now.minute();

}

else if (now.hour() == jam_ - 1){

eksekusi1jamSebelumSholat();

input[1] = menit_ + (60 - now.minute());

tmp_mnt = now.minute();

(7)

}

else if (now.hour() == jam_ && now.minute() < menit_){

eksekusi1jamSebelumSholat();

input[1] = menit_ - now.minute();

tmp_mnt = now.minute();

} } } }

if((now.hour() == jam_ && now.minute() == menit_) ||

(now.hour() == jam_ && now.minute() == menit_ + 1)){

pompa_nyala_sebelum_sholat = false; //supaya pompa nyala 1 jam sebelum sholat hanya sekali sampai penuh

satu_jam_seb_sholat = false;

}

if(satu_jam_seb_sholat){

//Serial.println("a");

if(tmp_mnt != now.minute()){

input[1] -= 1;

tmp_mnt = now.minute();

if(input[1] < 0){satu_jam_seb_sholat = false;input[1] = 90;}

}

}else{

input[1] = 90;

tmp_mnt = 0;

} }

void eksekusi1jamSebelumSholat(){

Serial.println("Pompa ON Sebelum Sholat");

if(volume_saat_ini < maksimal_volume){

(8)

pompa_nyala_sebelum_sholat = true;//status pompa nyala di sini adalah prioritas, tidak bisa di matikan secara manual

pompa_0n();

//satu jam sebelum sholat update data aktuator ke thingspeak String getData= "GET /update?api_key=R0QC69N7YJSU985K&"+

field1 +"="+ work_mode +"&"+ field2 +"=1&"+ field3 +"="+

system_mode;

sendCommand("AT+CIPMUX=1",5,"OK");

sendCommand("AT+CIPSTART=0,\"TCP\",\""+ HOST +"\","+

PORT,15,"OK");

sendCommand("AT+CIPSEND=0,"

+String(getData.length()+4),4,">");

Serial1.println(getData);delay(1500);countTrueCommand++;

sendCommand("AT+CIPCLOSE=0",7,"OK");

} }

void tampilJadwalSholatSerial(int jam_, int menit){

Serial.print(jam_);

Serial.print(":");

Serial.println(menit);

}

// Fuzzy Logic

void proses_fuzzy(float x1, float x2){

fuzifikasi_Debit(x1);

fuzifikasi_Waktu(x2);

evaluasi_Rule();

Defuzifikasi();

}

void fuzifikasi_Debit(float x){//fuzifikasi input debit

if (x <= in_Debit[0]){u_Debit[0]=1; u_Debit[1]=0;

u_Debit[2]=0;}

else if(x > in_Debit[0] && x < in_Debit[1]){

u_Debit[0] = (in_Debit[1] - x) / (in_Debit[1] - in_Debit[0]);

u_Debit[1] = (x - in_Debit[0]) / (in_Debit[1] - in_Debit[0]);

u_Debit[2] = 0;

(9)

}

else if(x == in_Debit[1]){u_Debit[0]=0; u_Debit[1]=1;

u_Debit[2]=0;}

else if(x > in_Debit[1] && x < in_Debit[2]){

u_Debit[0] = 0;

u_Debit[1] = (in_Debit[2] - x) / (in_Debit[2] - in_Debit[1]);

u_Debit[2] = (x - in_Debit[1]) / (in_Debit[2] - in_Debit[1]);

}

else if(x >= in_Debit[2]){u_Debit[0]=0; u_Debit[1]=0;

u_Debit[2]=1;}

Serial.print("u Kecil : ");Serial.println(u_Debit[0]);

Serial.print("u Sedang : ");Serial.println(u_Debit[1]);

Serial.print("u Besar : ");Serial.println(u_Debit[2]);

}

void fuzifikasi_Waktu(float x){//fuzifikasi input waktu

if (x <= in_Waktu[0]){u_Waktu[0]=1; u_Waktu[1]=0;

u_Waktu[2]=0;}

else if(x > in_Waktu[0] && x < in_Waktu[1]){

u_Waktu[0] = (in_Waktu[1] - x) / (in_Waktu[1] - in_Waktu[0]);

u_Waktu[1] = (x - in_Waktu[0]) / (in_Waktu[1] - in_Waktu[0]);

u_Waktu[2] = 0;

}

else if(x == in_Waktu[1]){u_Waktu[0]=0; u_Waktu[1]=1;

u_Waktu[2]=0;}

else if(x > in_Waktu[1] && x < in_Waktu[2]){

u_Waktu[0] = 0;

u_Waktu[1] = (in_Waktu[2] - x) / (in_Waktu[2] - in_Waktu[1]);

u_Waktu[2] = (x - in_Waktu[1]) / (in_Waktu[2] - in_Waktu[1]);

}

else if(x >= in_Waktu[2]){u_Waktu[0]=0; u_Waktu[1]=0;

u_Waktu[2]=1;}

(10)

Serial.print("u Dekat : ");Serial.println(u_Waktu[0]);

Serial.print("u Medium : ");Serial.println(u_Waktu[1]);

Serial.print("u jauh : ");Serial.println(u_Waktu[2]);

}

void evaluasi_Rule(){

for (int i=0; i<=2; i++){

for (int j=0; j<=2; j++){

float temp = min(u_Debit[i], u_Waktu[j]);

rule[i][j] = temp;

} }

rule00 = rule [0][0]; // (kecil,dekat = Normal) rule01 = rule [0][1]; // (kecil,medium = Low) rule02 = rule [0][2]; // (kecil,jauh = Low)

rule10 = rule [1][0]; // (sedang,dekat = Labor) rule11 = rule [1][1]; // (sedang,medium = Normal) rule12 = rule [1][2]; // (sedang,jauh = Normal)

rule20 = rule [2][0]; // (besar,dekat = Labor) rule21 = rule [2][1]; // (besar,medium = Labor) rule22 = rule [2][2]; // (besar,jauh = Labor) }

void Defuzifikasi(){

float sum_value = (rule00 * valueOf_output[1]) + (rule01 * valueOf_output[0])+ (rule02 * valueOf_output[0])+ (rule10 * valueOf_output[2])+ (rule11 * valueOf_output[1])+ (rule12 * valueOf_output[1]) + (rule20 * valueOf_output[2])+ (rule21 * valueOf_output[2])+ (rule22 * valueOf_output[2]);

float alpha_in;

for (int i=0; i<=2; i++){

for (int j=0; j<=2; j++){

alpha_in += rule[i][j];

//Serial.print("u : ");Serial.println(rule[i][j]);

} }

(11)

output_fuzzy = sum_value / alpha_in;

Serial.print("Output :

");Serial.print(output_fuzzy);Serial.println("%");

// if (output_fuzzy <= valueOf_output[0]){led(1);}

// else if(output_fuzzy <= valueOf_output[2]){led(2);}

// else if(output_fuzzy >= valueOf_output[2]){led(3);}

}

float readSerial() {

int i = 0;

String result="";

while (1) {

delay(50);

while (Serial.available() > 0) {

char inChar = Serial.read();

if (inChar != '\r' && inChar != '\n') {

result += inChar;

i++;

}else{

break;

} }

if(i>0){

Serial.println(result.toFloat());return result.toFloat();

break;

} } } }

(12)

LAMPIRAN B

DATA PENGUJIAN SENSOR DAN FUNGSI

Tabel 6.1 Data Pengujian Level Air dengan Water Level Indicator Pengujian ke- Tangki (%) Sensor (%)

1 0 0

2 10 10

3 20 20

4 30 30

5 40 40

6 50 50

7 60 60

8 70 70

9 80 80

10 90 90

11 95 95

Tabel 6.2 Data Pengujian Fungsi Pemantauan Total Suplai Air Masuk ke Tangki

Pengujian ke- Pengukuran (L) Sensor (L) Selisih (L)

1 8 8 0

2 16 16 0

3 24 24 0

4 32 32 0

5 40 40 0

6 48 48 0

7 56 56 0

8 64 64 0

9 72 72 0

10 76 76 0

(13)

Tabel 6.3 Data Pengujian Kalibrasi Refresh Rate Water Flow Sensor Pengujian

ke-

Refresh Rate (ms)

Pengukuran (L)

Sensor (L)

Selisih (L)

Galat (%)

1 1000

1

1.46 0.46 46

2 950 1.35 0.35 35

3 900 1.3 0.3 30

4 850 1.26 0.26 26

5 800 1.20 0.2 20

6 750 1.12 0.12 12

7 700 1.00 0.4 4

Tabel 6.4 Data Pengujian Fungsi Pemantauan Total Penggunaan Air Keluar dari Tangki

Pengujian ke- Pengukuran

(L) Sensor (L) Selisih (L) Galat (%)

1 0.25 0.27 0.02 8

2 0.5 0.5 0 0

3 0.75 0.76 0.01 1.13

4 1 1.02 0.02 2

5 2 2.03 0.03 1.5

6 3 3.03 0.03 1.5

7 4 4.05 0.05 1.25

8 5 5.06 0.06 1.2

9 6 6.02 0.02 0.3

10 7 7.05 0.05 0.71

11 8 8.03 0.03 0.37

12 9 9.01 0.01 0.2

13 10 10.01 0.01 0.1

14 20 20.5 0.05 0.25

15 30 30.3 0.03 0.1

16 40 40.5 0.05 0.12

17 50 50.3 0.03 0.06

18 60 60.1 0.01 0.01

(14)

19 70 70.2 0.02 0.03

20 76 76.5 0.05 0.06

Rata-rata Galat 0.94

Tabel 6.5 Data Pengujian Akurasi dan Ketahanan RTC

Pengujian ke- Tanggal Waktu Nyata RTC

1 3 September 2020 17.46 17.46

2 4 September 2020 15:18 15:18

3 5 September 2020 07:02 07:02

4 6 September 2020 07:28 07:28

5 7 September 2020 07:55 07:55

Tabel 6.6 Data Pengujian Jadwal Waktu Sholat

Pengujian ke- Tanggal Sholat Kemenag RTC

1 9 Juli 2020

Shubuh 4:46 4:46

Dzuhur 12:04 12:04

Ashar 15:27 15:27

Magrib 17:59 17:59

Isya 19:13 19:13

2 10 Juli 2020

Shubuh 4:46 4:46

Dzuhur 12:04 12:04

Ashar 15:27 15:27

Magrib 17:59 17:59

Isya 19:13 19:13

3 11 Juli 2020

Shubuh 4:47 4:47

Dzuhur 12:04 12:04

Ashar 15:27 15:27

Magrib 17:59 17:59

Isya 19:13 19:13

4 12 Juli 2020

Shubuh 4:47 4:47

Dzuhur 12:04 12:04

Ashar 15:27 15:27

(15)

Magrib 17:59 17:59

Isya 19:14 19:14

5 13 Juli 2020

Shubuh 4:47 4:47

Dzuhur 12:05 12:05

Ashar 15:27 15:27

Magrib 18:00 18:00

Isya 19:14 19:14

6 14 Juli 2020

Shubuh 4:47 4:47

Dzuhur 12:05 12:05

Ashar 15:27 15:27

Magrib 18:00 18:00

Isya 19:14 19:14

7 15 Juli 2020

Shubuh 4:47 4:47

Dzuhur 12:05 12:05

Ashar 15:27 15:27

Magrib 18:00 18:00

Isya 19:14 19:14

Tabel 6.7 Data Pengujian Aktivasi Pompa Sebelum Sholat Pengujian ke- Tanggal Waktu (Menit) Volume

(%)

Keadaan Motor

1 9 Juli 2020

>90 >30%

Mati

>90 <30%

<90 >30%

<90 <30% Hidup

2 10 Juli

2020

<150 >30%

Mati

<150 <30%

>150 >30%

>150 <30% Hidup

3 11 Juli

2020

>90 >30%

Mati

>90 <30%

<90 >30%

<90 <30% Hidup

(16)

4 12 Juli 2020

>90 >30%

Mati

>90 <30%

<90 >30%

<90 <30% Hidup

5 13 Juli

2020

>90 >30%

Mati

>90 <30%

<90 >30%

<90 <30% Hidup

6 14 Juli

2020

>90 >30%

Mati

>90 <30%

<90 >30%

<90 <30% Hidup

7 15 Juli

2020

>90 >30%

Mati

>90 <30%

<90 >30%

<90 <30% Hidup

Tabel 6.8 Data Pengujian Fuzzy Logic Pengujian

ke-

Waktu Sholat (Menit)

Debit Air (L/m)

Input Fuzzy 1

Input Fuzzy 2

Mode Sistem

1 90

2.17

1

0.86 Low

2.51 0.58 Low

3.27 0.94 Normal

3.41 0.83 Normal

3.61 0.66 Normal

3.9 0.58 Labor

4.29 0.91 Labor

4.42 1 Labor

4.52 1 Labor

2 80

2.17

0.5

0.86 Low

2.51 0.58 Low

(17)

3.27 0.94 Normal

3.41 0.83 Normal

3.61 0.66 Normal

3.9 0.58 Labor

4.29 0.91 Labor

4.42 1 Labor

4.52 1 Labor

3 70

2.17

1

0.86 Low

2.51 0.58 Low

3.27 0.94 Normal

3.41 0.83 Normal

3.61 0.66 Normal

3.9 0.58 Labor

4.29 0.91 Labor

4.42 1 Labor

4.52 1 Labor

4 60

2.17

0.5

0.86 Normal

2.51 0.58 Normal

3.27 0.94 Labor

3.41 0.83 Labor

3.61 0.66 Labor

3.9 0.58 Labor

4.29 0.91 Labor

4.42 1 Labor

4.52 1 Labor

5 50

2.17

1

0.86 Normal

2.51 0.58 Normal

3.27 0.94 Labor

(18)

3.41 0.83 Labor

3.61 0.66 Labor

3.9 0.58 Labor

4.29 0.91 Labor

4.42 1 Labor

4.52 1 Labor

Gambar

Tabel 6.1 Data Pengujian Level Air dengan Water Level Indicator  Pengujian ke-  Tangki (%)  Sensor (%)
Tabel 6.3 Data Pengujian Kalibrasi Refresh Rate Water Flow Sensor  Pengujian  ke-  Refresh  Rate (ms)  Pengukuran (L)  Sensor (L)  Selisih (L)  Galat (%)  1  1000  1  1.46  0.46  46 2 950 1.35 0.35 35 3 900 1.3 0.3 30 4 850 1.26 0.26 26  5  800  1.20  0.2
Tabel 6.6 Data Pengujian Jadwal Waktu Sholat
Tabel 6.7 Data Pengujian Aktivasi Pompa Sebelum Sholat  Pengujian ke-  Tanggal  Waktu (Menit)  Volume
+2

Referensi

Dokumen terkait

Prinsip-prinsip yang akan memandu perencanaan pendidikan Husaini Usman, Manajemen - Ceramah - Diskusi Laptop, LCD, Hand Out, Buku Ajar Membuat resume materi yang telah

Selain itu, dalam konteks penilaian hasil belajar, Depdiknas (2003) mengemukakan prinsip-prinsip umum penilaian adalah megukur hasil-hasil belajar yang telah ditentukan

Berdasarkan uraian pada hasil, dan pembahasan, maka dapat disimpulkan bahwa kegiatan Penyuluhan “Songsong Masa Depan Tanpa Rokok” mampu meningkatkan

seluruh panitia penyelenggara MABI IKABI ke XXI – 2018 Makasar yang telah bekerja keras untuk mensukseskan acara ini hingga dapat terlaksana..

Batasan masalah dalam penelitian ini adalah pengaruh pemberian pupuk cair (liquid manure) dari limbah organik rumah tangga terhadap pertumbuhan tanaman kacang hijau

Perceived quality dapat dimanfaatkan untuk melakukan perluasan merek dengan cara menggunakan merek tertentu yang sudah ada ke dalam kategori produk baru.. Alasannya, sebuah merek

Sebuah sistem terdiri dari 2 subsistem yang identik dan independent, salah satu subsistem beroperasi dan sistem yang lain dalam kondisi standby. Hitunglah reliability sistem

Tujuan Program Pemberdayaan Masyarakat ini adalah untuk meningkatkan kapasitas dan kualitas produksi mitra. Permasalahan yang dihadapi mitra, antara lain; 1). Motif monoton