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
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) {
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 ;
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();
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){
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();
}
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){
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;
}
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;}
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]);
} }
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;
} } } }