Anda di halaman 1dari 179

RANCANG BANGUN SISTEM AKUISISI DATA DAN

PENGENDALI NUTRISI PADA SISTEM HIDROPONIK NFT


BERBASIS FUZZY LOGIC CONTROLLER DAN NODE-RED

TUGAS AKHIR

Diajukan untuk memenuhi syarat akademik pada program


Strata-1 Jurusan Teknik Elektro
Universitas Jenderal Achmad Yani

Oleh

ADRI IRFAN LUTHFAN FADHILAH


NIM 2211181078

PROGRAM STUDI TEKNIK ELEKTRO


FAKULTAS TEKNIK
UNIVERSITAS JENDERAL ACHMAD YANI
2022
LEMBAR PENGESAHAN

RANCANG BANGUN SISTEM AKUISISI DATA DAN


PENGENDALI NUTRISI PADA SISTEM HIDROPONIK NFT
BERBASIS FUZZY LOGIC CONTROLLER DAN NODE-RED

Oleh

ADRI IRFAN LUTHFAN FADHILAH


2211181078
Teknik Kendali Dan Instrumentasi

Tugas Akhir sudah disetujui

Cimahi, 13 September 2022

Menyetujui,
Pembimbing

DEDE IRAWAN SAPUTRA, S.Pd., M.T.


NID. 412197591

Mengetahui,
Ketua Prodi Teknik Elektro

EEN TARYANA, ST., MT., IPM.


NID. 412143271
LEMBAR PERNYATAAN BEBAS PLAGIASI

Yang bertanda tangan di bawah ini


Nama Mahasiswa : Adri Irfan Luthfan Fadhilah
NIM : 2211181078
Program Studi : Teknik Elektro
Judul Tugas Akhir : RANCANG BANGUN SISTEM AKUISISI DATA
DAN PENGENDALI NUTRISI PADA SISTEM
HIDROPONIK NFT BERBASIS FUZZY LOGIC
CONTROLLER DAN NODE-RED
Tugas Akhir (skripsi) tersebut diatas telah dicek plagiasi oleh tim turnitin program
studi, disetujui oleh pembimbing, serta diperkenankan untuk dilanjutkan proses
cetak dan unggah mandiri.

Cimahi, 13 September 2022

Mengetahui
Pembimbing Mahasiswa

Bermatrai 10.000

Dede Irawan Saputra, S.Pd., M.T. Adri Irfan Luthfan Fadhilah


NID 412197591 NIM 2211181078
LEMBAR PERNYATAAN PUBLIKASI KARYA ILMIAH

Yang bertanda tangan di bawah ini


Nama Mahasiswa : Adri Irfan Luthfan Fadhilah
Tempat, tgl lahir : Cimahi, 07 Desember 1998
NIM : 2211181078
Fakultas/Program Studi : Fakultas Teknik/ Teknik Elektro
Judul Tugas Akhir : RANCANG BANGUN SISTEM AKUISISI
DATA DAN PENGENDALI NUTRISI PADA
SISTEM HIDROPONIK NFT BERBASIS
FUZZY LOGIC CONTROLLER DAN NODE-
RED

Demi Pengembangan ilmu pengetahuan, menyetujui untuk memberikan kepada


Universitas Jenderal Achmad Yani Hak Bebas Royalti Non Ekslusif (Non-exlusive
Royalti-Free Right) Atas Karya ilmiah yang berjudul : “Rancang Bangun Sistem
Akuisisi Data Dan Pengendali Nutrisi Pada Sistem Hidroponik NFT Berbasis
Fuzzy Logic Controller Dan Node-Red” Beserta perangkat yang ada.
Dengan Hak bebas Royalti Non Ekslusif ini, Univestas Jenderal Achmad Yani
yang berhak menyimpan, mengalih-mediakan, mengelolanya dalam bentuk
pangkalan data (database), mendistribusikannya, menampilkan /mempublikasikan-
nya di internet atau media lain untuk kepentingan akademis tanpa perlu meminta
izin selama tetap mencantumkan nama-nama kami sebagai penulis/pemilik karya
ilmiah ini.
Segala bentuk tuntutan hukum yang timbul atas pelanggaran Hak Cipta dalam karya
ilmiah ini menjadi tanggung jawab penulis.

Demikian pernyataan ini dibuat dengan sebenarnya.

Cimahi, 13 September 2022


Pembimbing Mahasiswa

Dede Irawan Saputra, S.Pd., M.T. Adri Irfan Luthfan Fadhilah


NID 412197591 NIM 22211181078
ABSTRAK

Urban farming dengan sistem hidroponik merupakan salah satu solusi untuk
berbudidaya tanaman dengan lahan yang terbatas. Pada sistem hidroponik tanaman
tumbuh menggunakan media air dengan campuran larutan nutrisi untuk
mendapatkan unsur hara sehingga tanaman dapat tumbuh dengan baik. Budidaya
tanaman menggunakan sistem hidroponik memerlukan perawatan khusus dalam
mengatur dan memantau nilai TDS dan tingkat keasaman dari larutan nutrisi secara
rutin, hal ini membuat sistem hidroponik menjadi tidak efektif, sehingga diperlukan
sistem akuisisi data dan sistem pengendalian nilai TDS dan tingkat keasaman pada
larutan nutrisi agar budidaya menggunakan sistem hidroponik menjadi lebih efektif
dan efisien. Tujuan dari tugas akhir ini adalah merancang sistem akuisisi data dan
pengendalian nutrisi pada sistem hidroponik NFT menggunakan fuzzy logic dan
Node-Red.

Perancangan perangkat keras pada sistem akuisisi data pengendalian mencakup


mikrokontroler ESP32 sebagai pengendali, analog TDS sensor SEN0244 dan
analog pH sensor SEN0161 sebagai masukan, serta diaphragm pump dan water
pump sebagai aktuator untuk pengendalian TDS, peristaltic pump sebagai aktuator
pengendalian pH. Kemudian pada perancangan perangkat lunak menggunakan
Node-Red sebagai alat untuk membuat sistem Internet of Things dengan
memanfaatkan Message Queuing Telemetery Transport (MQTT) sebagai protokol
komunikasi antara ESP32 dengan Node-Red.

Hasil pengujian dengan mengimplementasikan fuzzy logic nilai TDS dapat


mencapai dan menjaga tetap pada nilai set point dengan error steady state dibawah
8% sedangkan pada kendali close loop nilai TDS cenderung fluktuatif dan terdapat
overshoot, pada pengendalian pH naik dengan mengimplementasikan fuzzy logic
hasil respon transien menunjukan nilai pH dapat mencapai set point tanpa adanya
overshoot dengan error steady state dibawah 5%. Pengujian sistem selama 4 hari
dengan proses penjadwalan menunjukan sistem kendali fuzzy logic dapat
mempertahankan nilai TDS dan pH sesuai dengan set point yang diharapkan.

Kata kunci : Hidroponik, TDS, pH, fuzzy logic, Node–Red.

i
ABSTRACT

Urban farming with a hydroponic system is one solution for cultivating plants with
limited land. In the hydroponic system, plants grow using water media with a
mixture of nutrient solutions to get nutrients so that plants can grow well.
Cultivation of plants using a hydroponic system requires special care in regulating
and monitoring the TDS value and acidity level of the nutrient solution on a regular
basis, this makes the hydroponic system ineffective, so a data acquisition system
and a system for controlling the TDS value and acidity level of the nutrient solution
are needed for cultivation. using a hydroponic system to be more effective and
efficient. The purpose of this final project is to design a data acquisition and nutrient
control system in an NFT hydroponic system using fuzzy logic and Node-Red.

The hardware design for the control data acquisition system includes an ESP32
microcontroller as a controller, an analog TDS sensor SEN0244 and an analog pH
sensor SEN0161 as inputs, as well as a diaphragm pump and water pump as
actuators for controlling TDS, peristaltic pump as an actuator for controlling pH.
Then the software design uses Node-Red as a tool to create an Internet of Things
system by utilizing Message Queuing Telemetery Transport (MQTT) as a
communication protocol between ESP32 and Node-Red.

The test results by implementing fuzzy logic TDS value can reach and maintain the
set point value with steady state error below 8% while in close loop control the TDS
value tends to fluctuate and there is an overshoot, in controlling pH increases by
implementing fuzzy logic the results of the transient response show the value pH
can reach the set point without overshoot with steady state error below 5%. System
testing for 4 days with a scheduling process shows the fuzzy logic control system
can maintain the TDS and pH values according to the expected set point.

Keywords : Hydroponics, TDS, pH, fuzzy logic, Node-Red.

ii
KATA PENGANTAR

Alhamdulillah, puji syukur penulis panjatkan kepada Allah SWT atas karunia dan
kemampuan yang telah diberikan sehingga dapat menyelesaikan tugas akhir yang
hasilnya dilaporkan dalam karya tulis. Penulis ingin menyampaikan ucapan terima
kasih kepada pihak yang secara langsung maupun tidak langsung memberikan
bantuan dalam penyelesaian tugas akhir. Penulis sangat berterima kasih kepada:
1. Orang tua, Bapak Dudung dan Ibu Ratnawati yang telah membantu secara moril
maupun materil dan tidak lelah mendukung dengan doa yang tidak pernah henti
sehingga penulis dapat menyelesaikan studi di Jurusan Teknik Elektro Unjani.
2. Penulis sangat berterima kasih kepada Bapak Dede Irawan Saputra, S.Pd., M.T.
sebagai pembimbing utama yang telah memberikan saran, bimbingan dan
nasehatnya selama penyelesaian tugas akhir dan penulisan karya tulis.
3. Penulis berterima kasih kepada Bapak Een Taryana, S.T., M.T., IPM sebagai
ketua Jurusan Program Studi Teknik Elektro Universitas Jenderal Achmad
Yani.
4. Penulis juga berterima kasih kepada Bapak Zul Fakhri, S.ST., M.T. sebagai
dosen wali akademik yang telah memberikan bimbingan dalam setiap proses
akademik.
5. Terima kasih disampaikan juga kepada dosen penguji yang membantu secara
teknis pada proses sidang.
6. Kepada, Manda Anggita Dewi yang sudah membantu saya selama ini, dan
selalu memberi motivasi, terima kasih banyak.
7. Terima kasih kepada rekan-rekan Mahasiswa Asisten Laboratorium Teknik
Elektro Universitas Jenderal Achmad Yani 2021-2022 serta rekan-rekan
Mahasiswa Teknik Elektro Universitas Jenderal Achmad Yani angkatan 2018
yang banyak membantu dan berjuang sampai tahap ini.
8. Serta kepada pihak-pihak yang telah memberikan bantuan kepada penulis, yang
tidak dapat penulis sebutkan satu persatu tanpa mengurangi rasa hormat penulis
ucapkan banyak terima kasih.

iii
Semoga Tugas Akhir ini dapat bermanfaat untuk pengembangan ilmu pengetahuan.

Cimahi, 13 September 2022

Adri Irfan Luthfan Fadhilah

iv
DAFTAR ISI

ABSTRAK ............................................................................................................... i

ABSTRACT ............................................................................................................ ii

KATA PENGANTAR ........................................................................................... iii

DAFTAR ISI ........................................................................................................... v

DAFTAR LAMPIRAN ........................................................................................ viii

DAFTAR GAMBAR ............................................................................................. ix

DAFTAR TABEL ................................................................................................ xiii

DAFTAR SINGKATAN ...................................................................................... xv

BAB I PENDAHULUAN ....................................................................................... 1

1.1. Latar Belakang ............................................................................................. 1


1.2. Tujuan Penelitian ......................................................................................... 2
1.3. Batasan Masalah........................................................................................... 2
1.4. Sistematika Penulisan .................................................................................. 3
BAB II TEORI PENUNJANG ............................................................................... 5

2.1. Tinjauan Pustaka .......................................................................................... 5


2.2. Hidroponik ................................................................................................... 6
2.2.1. Sistem Hidroponik Nutrient Film Technique ............................................ 6

2.3. Parameter Larutan Nutrisi ............................................................................ 7


2.4. Larutan pH ................................................................................................... 9
2.5. Larutan Nutrisi AB Mix ............................................................................. 10
2.6. Fuzzy Logic ................................................................................................ 11
2.6.1. Fuzzy Logic Tipe Sugeno ....................................................................... 14

2.7. Mikrokontroler ........................................................................................... 15


2.7.1. ESP32 ..................................................................................................... 16
2.7.2. Konfigurasi Pin ESP32 ........................................................................... 17
2.8. Sensor ......................................................................................................... 20

v
2.8.1. pH sensor ................................................................................................ 20

2.8.2. TDS Sensor ............................................................................................. 21

2.9. Driver ......................................................................................................... 22


2.9.1. Driver motor L298N ............................................................................... 22

2.9.2. Relay ....................................................................................................... 23

2.10. Motor Servo ............................................................................................ 23


2.11. Pompa ..................................................................................................... 25
2.11.1. Diaphragm Pump .................................................................................... 25

2.11.2. Peristaltic Pump ...................................................................................... 25

2.12. Internet of Things ................................................................................... 26


2.13. MQTT ..................................................................................................... 26
2.14. Node - Red .............................................................................................. 27
2.15. JSON (Java Script Object Notation) ...................................................... 28
2.16. SQLite .................................................................................................... 29
BAB III METODE PENELITIAN........................................................................ 30

3.1. System Development Life Cycle ................................................................. 30


3.2. Perancangan Hardware .............................................................................. 31
3.2.1. Diagram Blok Sistem .............................................................................. 32

3.2.2. Diagram Blok Sistem Kendali ................................................................ 33

3.2.3. Perancangan Skematik Sistem ................................................................ 36

3.2.4. Perancangan PCB.................................................................................... 39

3.3. Perancangan Software ................................................................................ 41


3.3.1. Diagram Alir ........................................................................................... 41

3.3.2. Sub Process Pada Diagram Alir Sistem .................................................. 43

3.3.3. Data Flow Diagram ................................................................................. 53

3.3.4. Perancangan Fuzzy logic ......................................................................... 55

3.3.5. Perancangan Node-Red ........................................................................... 62

vi
3.3.5. Pembuatan Database SQLite................................................................... 70

3.3.6. Hosting Node-Red Pada Server .............................................................. 71


BAB IV HASIL PENGUJIAN DAN ANALISIS ................................................. 72

4.1. Hasil Implementasi Perangkat.................................................................... 72


4.1.1. Hasil Perancangan Board ........................................................................ 72

4.1.2. Hasil Pengimplemantasian Perangkat Pada Plant ................................... 74

4.2. Hasil Pengujian Hardware.......................................................................... 75


4.2.1. Pengujian sensor dan kalibrasi ................................................................ 75

4.2.2. Pengujian kendali close loop dan fuzzy logic.......................................... 79

4.3. Pengujian Software .................................................................................... 94


4.3.1. Pengujian Proses Koneksi WiFi dan MQTT .......................................... 95

4.3.2. Pengujian Akses Dashboard ................................................................... 96

4.3.3. Pengujian Waktu ..................................................................................... 98

4.3.4. Pengujian Pengiriman Data..................................................................... 98

4.3.5. Pengujian Penyimpanan Database ....................................................... 103

4.4. Pengujian Sistem Selama 4 Hari .............................................................. 105


BAB V KESIMPULAN DAN SARAN .............................................................. 107

5.1. Kesimpulan .............................................................................................. 107


5.2. Saran ......................................................................................................... 108
DAFTAR PUSTAKA ......................................................................................... 109

vii
DAFTAR LAMPIRAN

LAMPIRAN A PERTUMBUHAN TANAMAN ............................................... A-1


LAMPIRAN B KALIBRASI SENSOR ............................................................ B-1
LAMPIRAN C CODING ESP32 ........................................................................ C-1

viii
DAFTAR GAMBAR

Gambar 2. 1 Sistem hidroponik Nutrient Film Technique [12]. ............................. 7


Gambar 2. 2 Larutan pH naik dan pH turun.......................................................... 10
Gambar 2. 3 Larutan nutrisi AB mix. ................................................................... 10
Gambar 2. 4 Representasi kurva segitiga. ............................................................. 12
Gambar 2. 5 Representasi kurva trapesium........................................................... 13
Gambar 2. 6 Struktur mikrokontroler.................................................................... 15
Gambar 2. 7 Konfigurasi pin out ESP32............................................................... 17
Gambar 2. 8 Analog pH sensor. ............................................................................ 20
Gambar 2. 9 Analog TDS sensor SEN0244 .......................................................... 21
Gambar 2. 10 Driver motor L298N ...................................................................... 22
Gambar 2. 11 Modul relay. ................................................................................... 23
Gambar 2. 12 Motor servo MG90S. ..................................................................... 24
Gambar 2. 13 Diaphragm pump. ........................................................................... 25
Gambar 2. 14 Peristaltic pump. ............................................................................. 26
Gambar 2. 15 Protokol MQTT. ............................................................................. 27
Gambar 2. 16 Tampilan Node-Red. ...................................................................... 28
Gambar 2. 17 Contoh format JSON. ..................................................................... 29
Gambar 3. 1 System Development Life Cycle……………………………………30
Gambar 3. 2 Diagram Blok Sistem. ...................................................................... 32
Gambar 3. 3 Diagram blok sistem kendali close loop TDS. ................................. 33
Gambar 3. 4 Diagram blok sistem kendali close loop pH..................................... 34
Gambar 3. 5 Diagram blok sistem kendali fuzzy logic TDS. ............................... 35
Gambar 3. 6 Diagram blok sistem kendali fuzzy logic pH. .................................. 35
Gambar 3. 7 Wiring rangkaian sistem................................................................... 37
Gambar 3. 8 Layout PCB modul input.................................................................. 40
Gambar 3. 9 Layout PCB main board. .................................................................. 40
Gambar 3. 10 Layout PCB modul output. ............................................................ 41
Gambar 3. 11 Diagram alir sistem. ....................................................................... 42
Gambar 3. 12 Sub proses menghubungkan perangkat ke WiFi dan MQTT. ........ 44

ix
Gambar 3. 13 Sub proses parsing data. ................................................................. 46
Gambar 3. 14 Sub proses monitoring mode. ......................................................... 47
Gambar 3. 15 Sub proses kendali TDS menggunakan fuzzy logic. ....................... 48
Gambar 3. 16 Sub proses kendali pH menggunakan fuzzy logic. ......................... 51
Gambar 3. 17 Data flow diagram. ......................................................................... 54
Gambar 3. 18 Membership function error pada kendali TDS. .............................. 56
Gambar 3. 19 Membership function delta error pada kendali TDS. ..................... 56
Gambar 3. 20 Membership function PWM pada kendali TDS. ............................ 57
Gambar 3. 21 Membership function timer pada kendali TDS. ............................. 57
Gambar 3. 22 Membership function error pada kendali pH. ................................ 59
Gambar 3. 23 Membership function delta error pada kendali pH......................... 60
Gambar 3. 24 Membership function PWM pada kendali pH. .............................. 60
Gambar 3. 25 Membership function timer pada kendali pH. ................................ 61
Gambar 3. 26 Script function pada flow set timer. ............................................... 63
Gambar 3. 27 Flow set timer. ................................................................................ 64
Gambar 3. 28 Script pada function force on. ........................................................ 64
Gambar 3. 29 Script pada function force stop....................................................... 64
Gambar 3. 30 Flow force on dan force stop. ......................................................... 65
Gambar 3. 31 Script pada function set point. ........................................................ 66
Gambar 3. 32 Flow set point. ................................................................................ 66
Gambar 3. 33 Function gather data. ...................................................................... 67
Gambar 3. 34 Function insert data. ....................................................................... 68
Gambar 3. 35 Function select table. ...................................................................... 68
Gambar 3. 36 Flow read value. ............................................................................. 69
Gambar 3. 37 Flow read state. .............................................................................. 70
Gambar 3. 38 Tampilan pada dashboard Node-Red. ............................................ 70
Gambar 3. 39 Perintah untuk membuat database. ................................................. 71
Gambar 3. 40 Perintah untuk membuat tabel pengukuran TDS. .......................... 71
Gambar 3. 41 Perintah untuk membuat tabel pengukuran pH. ............................. 71
Gambar 4. 1 Modul input sistem…………………………………………………72
Gambar 4. 2 Main board sistem. ........................................................................... 73

x
Gambar 4. 3 Modul output sistem. ........................................................................ 73
Gambar 4. 4 Penempatan modul. .......................................................................... 74
Gambar 4. 5 Plant hidroponik setelah pengimplementasian perangkat. ............... 74
Gambar 4. 6 Grafik perbandingan nilai referensi dengan tegangan...................... 76
Gambar 4. 7 Grafik perbandingan hasil kalibrasi pada analog TDS sensor. ........ 78
Gambar 4. 8 Respon transien kendali TDS close loop dengan set point 700. ...... 80
Gambar 4. 9 Respon transien kendali TDS close loop dengan set point 1000. .... 81
Gambar 4. 10 Respon transien kendali close loop dengan set point 1300. ........... 82
Gambar 4. 11 Respon transien kendali TDS menggunakan fuzzy logic dengan set
point 700 ppm. ...................................................................................................... 83
Gambar 4. 12 Respon transien kendali TDS menggunakan fuzzy logic dengan set
point 1000 ppm. .................................................................................................... 84
Gambar 4. 13 Respon transien kendali TDS menggunakan fuzzy logic dengan set
point 1300 ppm. .................................................................................................... 85
Gambar 4. 14 Respon transien kendali pH naik metode close loop dengan set point
5,5. ......................................................................................................................... 87
Gambar 4. 15 Respon transien kendali pH turun metode close loop dengan set point
5,0. ......................................................................................................................... 88
Gambar 4. 16 Respon transien kendali pH naik menggunakan fuzzy logic dengan
set point 5,5. .......................................................................................................... 89
Gambar 4. 17 Respon transien kendali pH naik menggunakan fuzzy logic dengan
set point 6,0. .......................................................................................................... 90
Gambar 4. 18 Respon transien kendali pH naik menggunakan fuzzy logic dengan
set point 6,5. .......................................................................................................... 91
Gambar 4. 19 Respon transien kendali pH turun menggunakan fuzzy logic dengan
nilai awal 5,5 dan set point 5,0.............................................................................. 92
Gambar 4. 20 Respon transien kendali pH turun menggunakan fuzzy logic dengan
nilai awal 6,0 dan set point 5,0.............................................................................. 93
Gambar 4. 21 Proses koneksi perangkat dengan WiFi. ........................................ 95
Gambar 4. 22 Tampilan LCD jika proses koneksi gagal. ..................................... 95
Gambar 4. 23 Tampilan jika proses koneksi berhasil. .......................................... 96

xi
Gambar 4. 24 Tampilan dashboard jika diakses melalui dekstop. ........................ 97
Gambar 4. 25 Tampilan dashboard jika diakses melalui smartphone. .................. 97
Gambar 4. 26 Hasil pengujian waktu perangkat dengan waktu pada smartphone.98
Gambar 4. 27 Pengiriman data timer 1 melalui dashboard. .................................. 99
Gambar 4. 28 Data timer 1 ditampilkan pada LCD. ............................................. 99
Gambar 4. 29 Tampilan serial monitor ketika data timer 1 diterima. ................... 99
Gambar 4. 30 Pengiriman data timer 2 melalui dashboard. ................................ 100
Gambar 4. 31 Data timer 2 ditampilkan pada LCD. ........................................... 100
Gambar 4. 32 Tampilan serial monitor ketika data timer 2 diterima. ................. 100
Gambar 4. 33 Pengiriman data timer 3 melalui dashboard. ................................ 101
Gambar 4. 34 Data timer 3 ditampilkan pada LCD. ........................................... 101
Gambar 4. 35 Tampilan serial monitor ketika data timer 3 diterima. ................. 101
Gambar 4. 36 Pengiriman data set point melalui dashboard. .............................. 102
Gambar 4. 37 Data set point ditampilkan pada LCD. ......................................... 102
Gambar 4. 38 Tampilan serial monitor ketika data set point diterima. ............... 102
Gambar 4. 39 Isi tabel pengukuran TDS pada database. .................................... 103
Gambar 4. 40 Isi tabel pengukuran pH pada database. ....................................... 104
Gambar 4. 41 Tampilan tabel pengukuran pada dashboard Node-Red. ............. 104

xii
DAFTAR TABEL

Tabel 2. 1 Anjuran kebutuhan nutrisi dan pH tanaman .......................................... 8


Tabel 2. 2 Spesifikasi ESP32 ................................................................................ 16
Tabel 2. 3 Pin ESP32. ........................................................................................... 18
Tabel 2. 4 Spesifikasi analog pH sensor SEN0161 ............................................... 20
Tabel 2. 5 Spesifikasi analog TDS sensor SEN0244 ............................................ 21
Tabel 2. 6 Spesifikasi driver motor L298N ........................................................... 22
Tabel 2. 7 Spesifikasi motor servo MG90S .......................................................... 24
Tabel 3. 1 Konfigurasi pin out yang terhubung ke modul……………………….38
Tabel 3. 2 Pembentukan fungsi keanggotaan fuzzy untuk kendali tds ................. 55
Tabel 3. 3 Rules base output pwm pada kendali tds ............................................. 58
Tabel 3. 4 Rules base output timer pada kendali tds ............................................. 58
Tabel 3. 5 Pembentukan fungsi keanggotaan fuzzy pada kendali pH................... 59
Tabel 3. 6 Rules base output pwm pada kendali pH. ............................................ 61
Tabel 3. 7 Rules base output timer pada kendali pH............................................. 61
Tabel 4. 1 Hasil pengukuran pada saat kalibrasi…………………………………75
Tabel 4. 2 Hasil pengukuran dengan persamaan polinomial orde 3. .................... 77
Tabel 4. 3 Hasil pengukuran dengan persamaan polinomial orde 4. .................... 77
Tabel 4. 4 Hasil pengukuran analog pH sensor setelah kalibrasi. ......................... 79
Tabel 4. 5 Performasi kendali TDS close loop dengan set point 700. .................. 80
Tabel 4. 6 Performasi kendali TDS close loop dengan set point 1000. ................ 81
Tabel 4. 7 Performasi kendali TDS close loop dengan set point 1300. ................ 82
Tabel 4. 8 Performasi kendali TDS fuzzy logic dengan set point 700. ................. 83
Tabel 4. 9 Performasi kendali TDS fuzzy logic dengan set point 1000. ............... 84
Tabel 4. 10 Performasi kendali TDS fuzzy logic dengan set point 1300. ............. 85
Tabel 4. 11 Performasi kendali pH naik close loop dengan set point 5,5. ............ 88
Tabel 4. 12 Performasi kendali pH turun close loop dengan set point 5,0. .......... 88
Tabel 4. 13 Performasi kendali pH naik fuzzy logic dengan set point 5,5. .......... 89
Tabel 4. 14 Performasi kendali pH naik fuzzy logic dengan set point 6,0. .......... 90
Tabel 4. 15 Performasi kendali pH naik fuzzy logic dengan set point 6,5. .......... 91

xiii
Tabel 4. 16 Performasi kendali pH turun fuzzy logic dengan nilai awal 5,5 dan set
point 5,0.. .............................................................................................................. 92
Tabel 4. 17 Performasi kendali pH turun fuzzy logic dengan nilai awal 6,0 dan set
point 5,0. ............................................................................................................... 93
Tabel 4. 18 Pengendalian nilai TDS selama 4 hari. ............................................ 105
Tabel 4. 19 Pengendalian nilai pH selama 4 hari. ............................................... 105

xiv
DAFTAR SINGKATAN

Pemakian
Singkatan Arti pertama kali
pada halaman
TDS Total Dissolved Solids 1
pH power of Hidrogen 1
PID Proportional Integral Derevative 1
IoT Internet of Things 2
NFT Nutrient Film Technique 2
MQTT Message Queuing Telemetry Transport 3
PWM Pulse Width Modulation 3
ppm part per million 8
ADC Analog to Digital Converter 16
JSON Java Script Object Notation 27
SDLC System Development Life Cycle 29
LCD Liquid Crystal Display 31
PSU power supply unit 38
NTP Network Time Protokol 41
VPS Virtual Private Server 68

xv
BAB I PENDAHULUAN

1.1. Latar Belakang


Urban farming menggunakan sistem hidroponik telah mendapatkan popularitas
dalam beberapa tahun ini. Hal ini dikarenakan lahan pertanian yang semakin
terbatas sehingga sistem hidroponik menjadi solusi untuk budidaya tanaman dengan
lahan yang terbatas [1][2]. Sistem hidroponik menggunakan air sebagai media
tumbuh tanaman menggantikan tanah dengan mengandalkan nutrisi yang diperoleh
dari pupuk berupa campuran bahan kimia [3]. Namun metode bertani menggunakan
sistem hidroponik memerlukan perawatan khusus dalam mengendalikan Total
Dissolved Solids (TDS) dan power of Hidrogen (pH) larutan nutrisi untuk
menghasilkan tanaman yang baik hingga masa panen dengan mematau rutin setiap
hari [4].

Pemeliharaan konsentrasi larutan nutrisi yang tepat diperlukan untuk


mengoptimalkan hasil. Ketidakseimbangan unsur hara akan mempengaruhi
pertumbuhan tanaman pada sistem hidroponik. Pemeliharaan yang harus dilakukan
secara rutin ini menyebabkan budidaya tanaman dengan menggunakan hidroponik
ini menjadi tidak efisien karena membutuhkan tenaga yang cukup besar serta waktu
untuk melakukan pengecekan ke lokasi sistem hidroponik berada [5]. Dengan
menerapkan precision farming yaitu memanfaatkan teknologi informasi yang
memungkinkan mengamati dan mengelola larutan nutrisi hidroponik secara efisien.
Akan tetapi diperlukan pengendalian yang tepat untuk mengatur TDS dan pH
nutrisi agar parameter tersebut dapat sesuai dengan nilai yang diinginkan, serta
sistem akuisisi data agar parameter-parameter yang dikendalikan dapat dipantau
dari jarak jauh sehingga pemeliharaan konsentrasi larutan dapat lebih efisien dan
efektif [6][7].

Pengendalian TDS dan pH dapat menggunakan berbagai metode, baik


menggunakan pengendalian Proportional Integral Derevative (PID) maupun
menggunakan kendali fuzzy logic [8][9][10][11]. Untuk mempermudah

1
pengambilan data dan penjadwalan sistem kendali pemanfaatan sistem Internet of
Things (IoT) dapat diimplementasikan agar mempermudah pemantauan larutan
nutrisi ketika berada jauh dari lokasi hidroponik.

Pada penelitian ini bertujuan untuk merancang sebuah sistem akuisisi data pada
hidroponik Nutrient Film Technique untuk mengendalikan parameter larutan nutrisi
dengan memanfaatkan metode pengendalian fuzzy logic untuk mengatur nilai TDS
dan pH sesuai dengan nilai yang dikehendaki agar tanaman dapat berkembang
secara optimal. Adapun kontroler yang digunakan adalah ESP32 karena sudah
dilengkapi dengan modul komunikasi WiFi sehingga memudahkan dalam
mengimplementasikan IoT. Analog TDS sensor SEN0244 dan analog pH sensor
SEN0161 untuk mengukur kepekatan nutrisi dan nilai pH. Serta diaphragm pump
dan water pump sebagai aktuator untuk mengendalikan nilai TDS, sedangkan
aktuator untuk mengatur nilai pH menggunakan peristaltic pump. Kemudian untuk
pembuatan sistem IoT yang akan dirancang menggunakan Node-Red. Lingkup
penelitian ini dibatasi yaitu sistem hidroponik yang digunakan adalah Nutrient Film
Technique dan metode pengendalian yang digunakan adalah fuzzy logic tipe sugeno.

1.2. Tujuan Penelitian


Penulis menetapkan beberapa tujuan pada penelitian ini, yaitu sebagai berikut :
1. Merancang sistem hidroponik nutrient film technique
2. Merancang sistem kendali TDS dan pH nutrisi menggunakan fuzzy logic
3. Mengimplementasikan teknologi Internet of Things pada kendali TDS dan pH
nutrisi menggunakan Node-Red.
4. Menganalisis tanggapan waktu kendali TDS dan pH yang dihasilkan.

1.3. Batasan Masalah


Penulis menetapkan beberapa batasan masalah pada penelitian ini, yaitu sebagai
berikut :
1. Sistem hidroponik yang digunakan adalah Nutrient Film Technique (NFT).

2
2. Jenis tanaman yang dibudidayakan adalah kangkung dan pakcoy dengan range
nilai TDS yang diatur 700 ppm hingga 1300 ppm dan range pH 5,5 hingga 6,5.
3. Perancangan yang dibuat menggunakan mikrokontroler ESP32.
4. Perancangan yang dibuat menggunakan analog TDS sensor SEN0244 dan
analog pH sensor SEN0161.
5. Metode pengendalian dilakukan secara close loop dengan
mengimplementasikan fuzzy logic tipe sugeno.
6. Perancangan fuzzy logic menggunakan dua variabel input yaitu error dan delta
error, kemudian hasil defuzzifikasi terdiri dari dua output yaitu sinyal pulse
witdh midulation (PWM) dan timer dengan 25 aturan.
7. Protokol Internet of Things yang digunakan adalah Message Queuing
Telemetry Transport (MQTT).

1.4. Sistematika Penulisan


Penulisan laporan Tugas Akhir ini disusun dengan sistematika sebagai berikut :
BAB I PENDAHULUAN, berisi tentang menguraikan penjelasan mengenai latar
belakang masalah, tujuan, batasan masalah, serta sistematika penulisan yang
menggambarkan secara umum dari bab-bab yang ada pada tugas akhir ini.

BAB II TEORI PENUNJANG, bab ini menjelaskan tentang teori dasar yang
menunjang isi dari tugas akhir ini, diantaranya menjelaskan pengertian teori yang
digunakan, komponen-komponen yang digunakan, software yang digunakan untuk
penyusunan tugas akhir, dan lain-lain yang mendasari pembahasan dari prototipe
yang dirancang.

BAB III METODE PENELITIAN, bab ini memuat mengenai langkah-langkah


dalam peracangan sistem kendali yang dibuat, dimulai dari peracangan hardware
seperti diagram blok sistem, perancangan skematik sistem, kemudian perancangan
software seperti diagram alir, peracangan IoT, serta perancangan kendali fuzzy
logic.

3
BAB IV HASIL PENGUJIAN DAN ANALISIS, bab ini menjelaskan tentang hasil
pengujian dari sistem kendali yang telah dilakukan, pengujian sistem IoT, dan
analisis respon sistem yang telah didapatkan.

BAB V KESIMPULAN DAN SARAN, bab ini menjelaskan kesimpulan dari


penelitian yang telah dilakukan dan saran untuk pengembangan penelitian
selanjutnya.

4
BAB II TEORI PENUNJANG

2.1. Tinjauan Pustaka


Berikut adalah rujukan penelitian-penelitian sebelumnya yang dijadikan acuan pada
penelitian ini :
1. Adnan Rafi, 2020, Kendali pH untuk sistem IoT hidroponik deep flow technique
berbasis fuzzy logic controller, hasil yang didapat adalah pengimplementasian
FLC pada sistem hidroponik deep flow technique mampu menjaga kestabilan pH
pada rentang 6,5 – 7,5.
2. Dian Pancawati, 2016, Implementasi fuzzy logic controller untuk mengatur pH
nutrisi pada sistem hidroponik nutrient film technique, hasil yang didapat adalah
pengendalian mampu mempertahankan pH sebesar 5,5 dengan hasil
pertumbuhan selda setinggi 20 cm dan banyak daun 7 helai selama 54 hari, hasil
respon terbaik dari implementasi fuzzy logic controller terdapat pada sistem yang
memiliki 25 aturan.
3. Fitria Suryatini, 2021, Sistem kendali nutrisi hidroponik berbasis fuzzy logic
berdasarkan objek tanam, hasil yang didapat adalah kendali fuzzy logic memiliki
nilai keberhasilan 99,15% untuk durasi output nutrisi dari perbandingan
pemodelan di MatLab. Penggunaan persamaan polynomial dapat mengurangi
error pembacaan sensor TDS dari 30,75% menjadi 2,78%. Respon waktu pada
kendali kadar nutrisi mencapai settling time pada 50 detik dan memiliki error
steady state sebesar 5,9%.
4. Annisa Nurul Sholihah, Sistem kendali TDS untuk nutrisi hidroponik deep flow
technique menggunakan fuzzy logic, hasil yang didapat adalah error pembacaan
sensor TDS terbilang kecil dengan rata-rata 0.165% dan program fuzzy logic
dapat bekerja dimana saat error lebih kecil dari set point relay yang terhubung
dengan pompa air on dan saat error melebihi set point relay yang terhubung ke
pompa air off.

5
2.2. Hidroponik
Pada saat ini telah banyak beragam sistem hidroponik yang digunakan dalam skala
komersil. Sistem hidroponik terbagi menjadi dua kelompok, yaitu kultur media
tanam dan kultur larutan nutrisi. Pada kultur dengan menggunakan media tanam,
penanaman dilakukan menggunakan media tanam padat berpori sebagai tempat
akar tanaman tumbuh atau campuran dari keduanya. Berdasarkan metode
pemberian larutan nutrisi dibedakan menjadi dua kelompok, yaitu sub irrigation
atau sistem irigasi bawah permukaan dan top irrigation atau irigasi permukaan.
Pada top irrigation sering diaplikasikan pada sistem hidroponik dengan
menggunakan penetes makan sistem hidroponik ini lebih dikenal dengan sebutan
drip irrigation system atau sistem irigasi tetes. Pada sub irrigation terbagi menjadi
dua kelompok, yaitu passive sub irrigation atau sistem irigasi dengan prinsip
kapiler, dan ebb and flow atau sistem irigasi genang dan alir.

Pada kultur larutan nutrisi, penanaman dilakukan tidak menggunakan media tanam
atau tumbuh, sehingga akar tanaman tumbuh di dalam larutan nutrisi atau udara.
Kultur larutan nutrisi dibagi menjadi tiga kelompok besar, yaitu hidroponik larutan
diam, hidroponik dengan larutan nutrisi yang disirkulasikan, dan aeroponic. Sistem
hidroponik dipilih berdasarkan pertimbangan jenis tanaman yang akan
dibudidayakan.

2.2.1. Sistem Hidroponik Nutrient Film Technique


Nutrient Film Technique (NFT) diartikan sebagai metode hidroponik yang dimana
akar tanaman tumbuh di dalam larutan nutrisi sangat dangkal yang membentuk
lapisan tipis nutrisi (nutrient film) dan tersirkulasi. Dengan demikian, tanaman
dapat memperoleh unsur hara, air, dan oksigen yang cukup. Komponen sistem NFT
adalah saluran, tangki, pompa, dan pipa.

NFT memiliki karakteristik, bahwa akar tanaman berada di udara dan larutan nutrisi
sekaligus. Sebagian akar berada pada ruang udara dalam saluran nutrisi, sehingga
dapat menyerap oksigen, sebagian yang lain terdiam dalam larutan nutrisi sehingga

6
akar tanaman dapat menyerap unsur hara dan air yang diperlukan oleh tanaman
tersebut. Saluran yang ditempatkan dengan kemiringan sudut tertentu
memungkinkan larutan nutrisi mengalir sampai ujung saluran dan ditampung
kembali dalam tangki.

Gambar 2. 1 Sistem hidroponik Nutrient Film Technique [12].

2.3. Parameter Larutan Nutrisi


Pada dasarnya, nutrisi hidroponik merupakan zat-zat yang dibutuhkan oleh tanaman
hidroponik agar dapat tumbuh dan berkembang dengan baik, tujuan pemberian
nutrisi hidroponik adalah untuk mendapatkan unsur hara yang diperlukan oleh
tumbuhan pada media tanam. Unsur hara seperti nitrogen bisa didapatkan dari tanah
akan tetapi karena media tanam hidroponik tidak menggunakan tanah, sehingga
diperlukan nutrisi khusus agar tanaman bisa tumbuh dengan baik.

Larutan nutrisi ini akan terus berubah sesuai dengan kondisi lingkungan sekitar dan
aktivitas dari tanaman, seperti penyerapan nutrisi oleh akar tanaman yang akan
merubah jumlah nutrisi yang terkandung di dalam larutan nutrisi. Berikut adalah
beberapa parameter yang diperhatikan pada penelitian ini :

7
a) TDS

TDS atau Total Dissolved Solids adalah jumlah zat padat yang terlarut baik dalam
berupa ion organik, senyawa, ataupun koloid, dan lain-lain. Satuan yang digunakan
untuk menunjukan nilai TDS pada suatu larutan adalah part per million (ppm) yang
merupakan perbandingan antara konsentrasi zat terlarut dengan zat pelarutnya
dalam perbandingan 1 juta [13].

b) pH

pH adalah singkatan dari power of hydrogen, yang merupakan pengukuran


konsentrasi ion hidrogen. Total skala pH berkisar dari 1 hingga 14, dengan 7
dianggap netral. Sebuah nilai pH kurang dari 7 dikatakan asam, sedangkan jika
sebuah nilai pH diatas 7 dikatakan basa. pH adalah derajat keasaman yang
digunakan untuk menyatakan tingkat keasaman atau kebasaan yang dimiliki oleh
suatu larutan [14].

Setiap tanaman mempunyai kebutuhan nutrisi dan pH yang berbeda-beda, agar


dapat tumbuh dengan maksimal pemberian nutrisi harus tepat. Berikut adalah tabel
kebutuhan nutrisi dan pH yang dianjurkan untuk tanaman daun.

Tabel 2. 1 Anjuran kebutuhan nutrisi dan pH tanaman [15].

Nama Sayuran pH ppm


Artichoke 6.5 – 7.5 560 – 1260
Asparagus 6.0 – 6.8 980 – 1200
Bawang Pre 6.5 – 7.0 980 – 1260
Bayam 6.0 – 7.0 1260 – 1610
Brokoli 6.0 – 6.8 1960 – 2450
Brussel Kecambah 6.5 1750 – 2100
Endive 5.5 1400 – 1680
Kailan 5.5 – 6.5 1050 – 1400

8
Kangkung 5.5 – 6.5 1050 – 1400
Kubis 6.5 – 7.0 1750 – 2100
Kubis Bunga 6.5 – 7.0 1750 – 2100
Pakcoy 7.0 1050 – 1400
Sawi Manis 5.5 – 6.5 1050 – 1400
Sawi Pahit 6.0 – 6.5 840 – 1680
Seledri 6.5 1260 – 1680
Selada 6.0 – 7.0 560 – 840

2.4. Larutan pH
Nutrisi yang diberikan kepada tanaman erat kaitannya dengan derajat keasaman
atau pH pada larutan nutrisi, dimana pH akan mempengaruhi daya larut dari unsur
hara yang berakibat pada pertumbuhan tanaman. Pada larutan nutrisi yang memiliki
nilai pH dibawah 6.0 atau asam unsur hara makro seperti kalsium, magnesium, dan
fosfor akan sulit diserap oleh tanaman yang berakibat tanaman tidak dapat
berproduksi dengan maksimal. Pada larutan nutrisi yang memiliki pH diatas 7 atau
basa unsur hara mikro seperti tembaga, mangan, seng, dan besi tidak akan bisa
diserap oleh tanaman yang berakibat tanaman akan mengalami defisiensi unsur hara
sehingga tanaman akan cepat mati [16]. Pengkondisian nilai pH pada larutan nutrisi
dilakukan dengan penambahan asam (HNO3, H3PO4 atau H2SO4) jika pH larutan
terlalu basa atau penambah basa (KOH) jika larutan terlalu asam. Pada penelitian
ini larutan untuk menambah pH menggunakan larutan kalium hidroksida (KOH)
dan untuk mengurangi jika larutan terlalu basa menggunakan asam fosfat (H3PO4).

9
Gambar 2. 2 Larutan pH naik dan pH turun.

2.5. Larutan Nutrisi AB Mix


Nutrisi AB mix atau pupuk racikan merupakan larutan yang terbuat dari bahan-
bahan kimia untuk diberikan melalui media tanam, berfungsi sebagai nutrisi
tanaman agar dapat tumbuh dengan baik. Nutrisi AB mix terdiri dari 2 nutrisi yaitu
nutrisi A dan nutrisi B, pada nutrisi A mengandung unsur kalium dan nutrisi B
mengandung sulfat dan fosfat [17].

Gambar 2. 3 Larutan nutrisi AB mix.

10
2.6. Fuzzy Logic
Pada tahun 1965 seorang guru besar di University of California yang bernama Prof.
Lotfi A. Zadeh yang merupakan pencetus ide tentang cara mekanisme pengolahan
ketidakpastian yang kemudian dikenal fuzzy logic. Sebelum adanya fuzzy logic
dikenal sebuah logika tegas (crisp logic) yang mempunyai nilai benar atau salah
secara tegas. Saat logika classic menyatakan segala sesuatu dapat diekspresikan
dalam istilah biner 0 atau 1, hitam atau putih, iya atau tidak. Logika fuzzy
memungkinkan nilai keanggotaan antara 0 dan 1 dalam bentuk linguistic, konsep
tidak pasti seperti “sedikit”, “lumayan”, dan “sangat”. Logika ini sangat
berhubungan dengan set fuzzy dan teori kemungkinan. Fuzzy logic menggunakan
pengalaman seorang ahli model matematika dari sebuah sistem untuk mengontrol
sebuah plant, dan dapat menangani sistem non linear yang kompleks dengan model
matematika yang tidak diketahui.

Tahapan membangun fuzzy logic tergantung dari metode yang digunakan, di


karekan banyak metode untuk membangun sebuah sistem fuzzy logic. Secara garis
besar fuzzy logic terdiri dari beberapa tahap, berikut adalah tahapan dari fuzzy logic:
a) Fuzzyfikasi

Proses fuzzyfikasi yaitu mengubah suatu nilai masukan menjadi suatu fungsi
keanggotaan fuzzy. Pada proses ini membership function dari variabel ditentukan.
Membership function sendiri merupakan suatu kurva yang mewakili besar dari
derajat keanggotaan masing-masing variabel input yang berada pada interval 0 dan
1.
1. Representasi kurva segitiga
Kurva segitiga merupakan gabungan antara 2 garis linear seperti pada
Gambar 2.4.

11
Gambar 2. 4 Representasi kurva segitiga.
Representasi kurva segitiga adalah sebagai berikut:
0 ; 𝑥 ≤ 𝑎 𝑎𝑡𝑎𝑢 𝑥 ≥ 𝑐
(𝑥−𝑎)
;𝑎 ≤ 𝑥 ≤ 𝑏
𝜇[𝑥] = (𝑏−𝑎) (2.1)
(𝑐−𝑥)
{ ;𝑏 ≤ 𝑥 ≤ 𝑐
(𝑐−𝑏)

Atau
𝑥−𝑎 𝑐−𝑥
𝑢[𝑥] = max (min (𝑏−𝑎 , 𝑥−𝑏) , 0) (2.2)

Dimana :
a = nilai domain terkecil yang mempunyai derajat keanggotaan nol
b = nilai domain yang mempunyai derajat keanggotaan satu
c = nilai domain terbesar yang mempunyai derajat keanggotaan nol
x = nilai input yang akan diubah ke dalam bilangan fuzzy

2. Representasi kurva trapesium


Kurva trapesium pada dasarnya adalah bentuk segitiga, hanya saja ada
beberapa titik yang memiliki nilai derajat keanggotaan 1 seperti Gambar
2.5.

12
Gambar 2. 5 Representasi kurva trapesium.
Representasi kurva trapesium adalah sebagai berikut :
0 ; 𝑥 ≤ 𝑎 𝑎𝑡𝑎𝑢 𝑥 ≥ 𝑑
(𝑥−𝑎)
;𝑎 ≤ 𝑥 ≤ 𝑏
(𝑏−𝑎)
𝜇[𝑥] = (2.3)
1 ;𝑏 ≤ 𝑥 ≤ 𝑐
(𝑑−𝑥)
{ ;𝑐 ≤ 𝑥 ≤ 𝑑
(𝑑−𝑐)

Atau
𝑥−𝑎 𝑑−𝑥
𝑢[𝑥] = max (min (𝑏−𝑎 , 1, ) , 0) (2.4)
𝑑−𝑐

Dimana :
a = nilai domain terkecil yang mempunyai derajat keanggotaan nol
b = nilai domain terkecil yang mempunyai derajat keanggotaan satu
c = nilai domain terbesar yang mempunyai derajat keanggotaan satu
d = nilai domain terbesar yang mempunyai derajat keanggotaan nol
x = nilai input yang akan diubah ke dalam bilangan fuzzy
b) Fuzzy logic inference
Merupakan proses mengaplikasikan aturan atau rules base pada masukan fuzzy
yang dihasilkan dalam proses fuzzyfikasi. Mengevaluasi tiap aturan dengan
masukan yang dihasilkan dari proses fuzzyfikasi dengan mengevaluasi
hubungan antara derajat keanggotaannya. Rules base pada fuzzy logic
merupakan suatu bentuk aturan relasi “if-then” seperti if x is A then y is B, dimana
A dan B adalah linguistic values yang didefinisikan dalam rentang variabel x
dan y. Pernyataan “x is A” disebut antecedent atau premis. Pernyataan “y is B”
disebut consequent atau kesimpulan.

13
c) Defuzzifikasi
Defuzzifikasi merupakan proses pengubahan data–data fuzzy kembali ke dalam
bentuk numerik yang dapat diproses ke dalam peralatan pengendalian [18].

2.6.1. Fuzzy Logic Tipe Sugeno


Fuzzy logic metode sugeno merupakan metode inferensi fuzzy untuk aturan yang
direpresentasikan dalam bentuk “if-then”, dimana output atau consequent sistem
tidak berupa himpunan fuzzy, melainkan berupa konstanta atau sebuah persamaan
linear. Michio Sugeno mengusulkan penggunaan singleton sebagai membership
function dari consequent. Singleton sendiri adalah sebuah himpunan fuzzy dengan
membership function yang pada titik tertentu mempunyai sebuah nilai dan 0 di luar
titik tersebut.
Terdapat tahapan-tahapan yang harus dilakukan dalam implementasi fuzzy logic
tipe sugeno yaitu :
a) Fuzzifikasi, pada tahapan ini seperti pada proses fuzzyfikasi pada metode
lainnya dimana variabel input dari sistem fuzzy akan diubah ke dalam bentuk
himpunan fuzzy untuk digunakan dalam perhitungan nilai kebenaran dari
antecedent pada setiap aturan dalam rules base.
b) Aplikasi fungsi implikasi, tiap-tiap aturan pada rules base akan berhubungan
dengan suatu relasi fuzzy. Bentuk umum dari aturan yang digunakan dalam
fungsi implikasi adalah “if x is A then y is B” dengan x dan y adalah bentuk
skalar, A dan B adalah himpunan fuzzy.
c) Defuzzifikasi, pada metode sugeno defuzzifikasi dilakukan dengan perhitungan
Weight Average (WA) [19]:

(𝑎1 ×𝑧1 )+(𝑎2 ×𝑧2 )+(𝑎3 ×𝑧3 )+...+(𝑎𝑛 ×𝑧𝑛 )


𝑊𝐴 = (2.5)
𝑎1 +𝑎2 +𝑎3 +...+𝑎𝑧

Dimana :
WA = nilai rata-rata
𝑎𝑛 = nilai predikat aturan ke-n
𝑧𝑛 = indeks nilai output (konstanta) ke-n

14
2.7. Mikrokontroler
Mikrokontroler merupakan sebuah sistem komputer yang sebagian besar
elemennya sudah dikemas dalam satu chip IC, sehingga sering disebut juga single
chip microcomputer. Mikrokontroler merupakan sistem komputer yang mempunyai
satu atau beberapa tugas yang spesifik, berbeda dengan personal computer yang
memiliki beragam fungsi. Perbedaan lainnya adalah perbandingan RAM, ROM
yang sangat berbeda antara komputer dengan mikrokontroler. Mikrokontroler
adalah sistem microprosesor dimana di dalamnya sudah terdapat CPU, ROM,
RAM, I/O, Clock, dan peralatan internal lainnya yang sudah terhubung dan
terintegrasi satu sama lain yang dikemas dalam satu chip siap pakai. Sehingga
hanya tinggal memprogram isi dari ROM sesuai dengan aturan pengguna.

Gambar 2. 6 Struktur mikrokontroler.


Pada Gambar 2.6 Menunjukan diagram blok dari struktur mikrokontroler secara
umum. Mikrokontroler terdiri dari beberapa bagian yang saling terhubung melalui
internal bus. Berikut adalah penjelasan dan fungsi dari bagian dalam struktur
mikrokontroler :
a) ALU (Arithmetic and Logic Unit), berfungsi untuk menangani operasi aritmatika
dan juga operasi logika.
b) Accumulator Register, berfungsi sebagai tempat penyimpanan sementara hasil
suatu operasi aritmatika atau logika.

15
c) Internal RAM, merupakan memori penyimpanan data yang isinya dapat diubah
atau dihapus, biasanya berisi data-data variabel dan register. Data yang
tersimpan pada RAM akan hilang jika catu daya yang diberikan kepadanya
dimatikan.
d) Internal ROM, merupakan memori penyimpanan program atau instruksi yang
isinya tidak dapat diubah atau dihapus.
e) I/O Port, digunakan untuk berkomunikasi dengan perangkat-perangkat di luar,
maka mikrokontroler menggunakan terminal input dan output.
f) Program counter, merupakan register khusus yang berfungsi sebagai pencacah
atau penghitung eksekusi program mikrokontroler.
g) Stack pointer, merupakan bagian dari RAM yang memiliki metode penyimpanan
dan pengambilan data secara khusus. Data yang disimpan dan dibaca tidak dapat
dilakukan dengan metode acak [20].

2.7.1. ESP32
ESP32 merupakan mikrokontroler yang diperkenalkan oleh espressif system
sebagai penerus mikrokontroler ESP8266. Pada ESP32 ini sudah terdapat modul
WiFi di dalam chipnya sehingga memudahkan untuk pengaplikasian sistem Internet
of Things. Berikut adalah spesifikasi yang dimiliki oleh ESP32.

Tabel 2. 2 Spesifikasi ESP32 [21].

Attribut Detail
CPU Xtensa LX6 32-bit dual core,
operating at 160 or 240 MHz
SRAM 520 KB
FLASH 2 MB (max 64 MB)
Tegangan External Power Supply 5V – 12V
Tegangan 2,2 V – 3.6 V
Arus 80 mA

16
Pemrograman C, C++, Python, Lua, dll
Konektivitas Detail
WiFi 802.11 b / g / n
Bluetooth 4.2 + BLE (Bluetooth Low Energy)
UART 2
I/O Detail
GPIO 32
SPI 4
I2C 2
PWM 16
Analog to Digital Converter (ADC) 18 (12 – bit)
DAC 2 (8 – bit)

2.7.2. Konfigurasi Pin ESP32


Berikut adalah konfigurasi pin ESP32 dapat dilihat pada Gambar 2.7 dan Tabel 2.3
untuk keterangan dari pin ESP32.

Gambar 2. 7 Konfigurasi pin out ESP32.

17
Tabel 2. 3 Pin ESP32 [22].

Nomor Pin Nama Pin Fungsi Keterangan


1 VIN Eksternal Power 5V – 12V
Suply
2 GND Ground
3 GPIO 13 ADC2, Touch Dapat dijadikan
Sensor, HSPI input atau output
MOSI, PWM
4 GPIO 12 ADC2, Touch Dapat dijadikan
Sensor, HSPI input atau output
MISO, PWM
5 GPIO 14 ADC2, Touch Dapat dijadikan
Sensor, HSPI input atau output
CLK, PWM
6 GPIO 27 ADC2, Touch Dapat dijadikan
Sensor, PWM input atau output
7 GPIO 26 ADC2, DAC2, Dapat dijadikan
PWM input atau output
8 GPIO 25 ADC2, DAC1, Dapat dijadikan
PWM input atau output
9 GPIO 33 ADC1, Touch Dapat dijadikan
Sensor, PWM input atau output
10 GPIO 32 ADC1, Touch Dapat dijadikan
Sensor, PWM input atau output
11 GPIO 35 ADC1, PWM Hanya dapat
dijadikan Input
12 GPIO 34 ADC1, PWM Hanya dapat
dijadikan Input
13 GPIO 39 ADC1 Hanya dapat
dijadikan Input

18
14 GPIO 36 ADC1 Hanya dapat
dijadikan Input
15 EN 3.3V regulator
enable pin
16 GPIO 23 VSPI MOSI Dapat dijadikan
input atau output
17 GPIO 22 SCL Dapat dijadikan
input atau output
18 GPIO 1 TX 0 pin
19 GPIO 3 RX 0 pin
20 GPIO 21 SDA Dapat dijadikan
input atau output
21 GPIO 19 VSPI MISO, Dapat dijadikan
PWM input atau output
22 GPIO 18 VSPI CLK, PWM Dapat dijadikan
input atau output
23 GPIO 5 VSPI CS, PWM Dapat dijadikan
input atau output
24 GPIO 17 TX 2 pin, PWM Dapat dijadikan
input atau output
25 GPIO 16 RX 2 pin, PWM Dapat dijadikan
input atau output
26 GPIO 4 ADC 2, Touch Dapat dijadikan
Sensor, PWM input atau output
27 GPIO 2 ADC 2, Touch Dapat dijadikan
Sensor input atau output
28 GPIO 15 ADC 2, Touch Dapat dijadikan
Sensor, HSPI CS input atau output
29 GND
30 3.3V

19
2.8. Sensor
2.8.1. pH sensor
pH sensor adalah sebuah sensor yang digunakan untuk mengukur pH dari suatu
larutan. pH sensor terdiri dari sebuah probe pH yang terhubung dengan rangkaian
elektronik untuk mengolah dan menampilkan hasil pembacaan. Pada penelitian kali
ini sensor pH yang digunakan adalah SEN0161 pH meter.

Gambar 2. 8 Analog pH sensor.

Berikut adalah spesifikasi dari sensor pH yang digunakan dapat dilihat pada Tabel
2.4.
Tabel 2. 4 Spesifikasi analog pH sensor SEN0161 [23].

Transmitter Board
Tegangan input 3,3 V – 5,0 V
Ukuran modul 43 × 32 mm
Range pengukuran 0 – 14
Temperatur pengukuran 0 – 60 °C
Akurasi ± 0.1 pH (25 °C)
Respon time < 1 menit
Interface modul PH2.0 – 3 pin
Interface probe BNC connector

20
2.8.2. TDS Sensor
Sensor TDS (Total Dissolved Solid) merupakan sensor yang bekerja dengan cara
mendeteksi konduktivitas suatu larutan, jika suatu larutan memiliki konduktivitas
tinggi maka output sensor akan semakin besar, begitu pun sebaliknya apabila cairan
mengandung sedikit mineral maka output nya akan semakin kecil. Sensor TDS
dihubungkan dengan pin ADC mikrokontroler.

Gambar 2. 9 Analog TDS sensor SEN0244


Pada penelitian kali ini sensor TDS yang digunakan adalah SEN0244 Gravity
Analog TDS Sensor yang memiliki spesifikasi sebagai berikut.

Tabel 2. 5 Spesifikasi analog TDS sensor SEN0244 [24].

Transmitter Board
Tegangan input 3,3 V – 5,0 V
Tegangan output 0,0 V – 2,3 V
Arus kerja 3 – 6 mA
Akurasi pengukuran ± 10%
Ukuran modul 42 × 32 mm
Interface modul PH2.0 – 3 pin
Interface probe XH2.54 – 2 pin
Probe TDS

21
Jumlah jarum 2
Panjang probe 83 cm
Interface XH2.54 – 2 pin
Water proof yes

2.9. Driver
2.9.1. Driver motor L298N
Driver motor L298N adalah sebuah modul driver motor DC yang difungsikan untuk
mengontrol kecepatan serta arah perputaran motor. IC L298 merupakan sebuah IC
tipe H-Bridge yang mampu mengendalikan beban induktif seperti solenoid, relay,
motor stepper, dan motor DC. Kelebihan dari modul ini adalah kepresisian dalam
mengendalikan motor sehingga lebih mudah untuk dikendalikan.

Gambar 2. 10 Driver motor L298N


Berikut adalah spesifikasi dari modul driver motor L298N dapat dilihat pada tabel
2.6.
Tabel 2. 6 Spesifikasi driver motor L298N [25].

Spesifikasi Driver L298N


Chip L298N
Drive Voltage 5 V – 35 V
Drive Current 2A max
Tegangan operasional 5V
Arus operasional 0 – 36 mA
Daya maksimal 25

22
2.9.2. Relay
Relay adalah komponen elektronika yang berupa saklar atau switch elektrik yang
dioperasikan menggunakan listrik. Relay juga dapat disebut sebagai komponen
electromechanical yang terdiri dari dua buah bagian utama yaitu coil dan kontak
saklar. Komponen relay menggunakan prinsip elektromagnetik sebagai penggerak
kontak saklar, sehingga dengan menggunakan arus listrik yang kecil atau low power
dapat menghatarkan arus atau tegangan yang lebih tinggi.

Gambar 2. 11 Modul relay.

Relay memiliki fungsi sebagai saklar elektrik. Dalam pengaplikasiannya relay


mempunyai beberapa fungsi. Berikut adalah beberapa fungsi dari relay saat
diaplikasikan ke dalam rangkaian elektronika.
1. Mengendalikan sirkuit dengan tegangan tinggi dengan bantuan sinyal
tegangan rendah.
2. Menjalankan fungsi logika.
3. Memberikan fungsi penundaan waktu alias delay function.
4. Melindungi motor atau komponen lainnya dari kelebihan tegangan atau
korsleting listrik [26].

2.10. Motor Servo


Motor servo adalah motor dengan sistem closed feedback dimana posisi dari motor
akan diinformasikan kembali ke rangkaian pengontrol yang terdapat di dalam motor

23
servo. Dengan input kontrol yang bisa berupa sinyal analog ataupun sinyal digital,
motor servo biasa digunakan sebagai aktuator yang membutuhkan posisi putaran
motor yang cukup presisi. Sedangkan sudut dari sumbu motor dapat diatur
berdasarkan lebar pulsa yang dikirimkan ke pin sinyal pada motor servo. Motor
servo hanya bergerak mencapai sudut tertentu saja dan tidak bergerak secara
kontinyu, tetapi untuk beberapa keperluan motor servo ini dapat dimodifikasi
sehingga bisa bergerak secara kontinyu [27]. Pada penelitian ini motor servo yang
digunakan adalah motor servo MG90S sebagai mekanik penggerak dari sensor
TDS. Berikut adalah tampak hardware dari motor servo MG90S dapat dilihat pada
Gambar 2.12 dan spesifikasi dapat dilihat pada Tabel 2.7.

Gambar 2. 12 Motor servo MG90S.

Tabel 2. 7 Spesifikasi motor servo MG90S

Spesifikasi Servo MG90S


Operating Voltage 4,8V – 6V
Rotation Angle 180 degrees
Weigth 13,4 g
Dimension 22,5 x 12 x 35,5 mm
Operating temperature 0 – 55 °C

24
2.11. Pompa
2.11.1. Diaphragm Pump
Diaphragm pump adalah pompa yang termasuk kategori positive displacement
pump, dimana adalah jenis pompa yang mampu menghisap dan mendorong keluar
fluida dengan menggunakan diafragma atau membran sebagai komponen yang
bekerja bolak-balik. Dinamika membran nantinya akan menghasilkan daya hisap
fluida ketika membran bergerak mundur dan daya tekan keluar fluida ketika
membran bergerak maju [28].

Gambar 2. 13 Diaphragm pump.

2.11.2. Peristaltic Pump


Peristaltic pump adalah pompa yang termasuk ke dalam pompa positive
displacement yang digunakan untuk memompa aliran fluida. Peristaltic pump
bekerja dengan tekanan dan perpindahan, hal ini digunakan terutama untuk pompa
fluida melalui tabung, yang membedakan dari pompa lain adalah bagian dari pompa
lain aliran fluida masuk ke dalam bagian pompa sehingga bersentuhan. Pada
peristaltic pump mekanisme kerja pompa ini tidak bersentuhan langsung dengan
fluida. Fluida ini mengalir ke dalam casing pompa melalui selang [29].

25
Gambar 2. 14 Peristaltic pump.

2.12. Internet of Things


IoT atau Internet of Things merupakan sebuah konsep yang bertujuan untuk
memperluas manfaat konektivitas dari internet yang tersambung secara terus-
menerus sehingga memungkinkan menghubungkan mesin, peralatan, dan benda
fisik lainnya dengan jaringan internet, sehingga mesin dapat berkolaborasi dan
bahkan bertindak berdasarkan informasi baru yang diperoleh secara independent.
Internet of Things adalah sebuah gagasan dimana semua benda dapat
berkomunikasi satu dengan yang lain sebagai bagian dari satu kesatuan sistem
terpadu menggunakan jaringan internet sebagai penghubungnya. Ide awal Internet
of Things pertama kali dimunculkan oleh Kevin Ashton pada tahun 1999 [30].

2.13. MQTT
MQTT atau Message Queuing Telemetry Transport adalah protokol Internet of
Things yang ringan dan sering digunakan untuk kirim atau terima pesan antar
perangkat. Protokol MQTT berjalan dengan mengunakan TCP/IP, sehingga
protokol ini membutuhkan transportasi untuk menjalankan perintah MQTT,
bytestream dari client to server atau server to client. Berikut gambaran protokol
MQTT bekerja dapat dilihat pada Gambar 2.15.

26
Gambar 2. 15 Protokol MQTT.

MQTT mempunyai karakteristik transfer data dalam paket ukuran rendah, sehingga
sangat membantu dalam mengembangkan teknologi remote dengan perangkat
terbatas. Prinsip MQTT adalah meminimalisasi bandwidth jaringan dan kebutuhan
resource perangkat dan tetap menjamin keandalan dan beberapa tingkat jaminan
tersampaikannya pesan. Prinsip inilah yang membuat protokol MQTT sangat ideal
untuk pengaplikasian IoT. Pertukaran pesan pada MQTT adalah model
publish/subscribe yang merupakan model alternatif dari client-server. Pada MQTT
client (publisher/subscriber) berkomunikasi langsung dengan sebuah endpoint
pada sebuah topic melalui broker. MQTT broker berfungsi untuk menangani data
publish dan subscribe dari berbagai perangkat [31].

2.14. Node-Red
Node-Red merupakan sebuah tool berbasis browser untuk membuat aplikasi dari
Internet of Things yang dimana lingkungan pemrogramannya berbasis visual
sehingga mempermudah penggunaannya untuk membuat aplikasi dengan
menghubungkan node-node yang berada pada pallete sehingga menghasilkan
sebuah flow. Berikut adalah tampilan dari Node-Red dapat dilihat pada Gambar
2.16.

27
Gambar 2. 16 Tampilan Node-Red.
Flow terbentuk dari node-node yang saling berhubungan, setiap node mempunyai
tugas tertentu. Walaupun Node-Red di desain untuk keperluan aplikasi Internet of
Things, Node-Red juga dapat digunakan untuk keperluan umum dan untuk berbagai
macam jenis aplikasi [32].

2.15. JSON (Java Script Object Notation)


JSON atau Java Script Object Notation adalah sebuah format pertukaran data yang
ringan dan mudah dibaca serta mudah ditulis oleh manusia, JSON juga mudah
dibuat dan diterjemahkan oleh komputer. Format ini dibuat berdasarkan bagian dari
bahasa pemrograman Java Script. JSON merupakan format teks yang tidak
bergantung pada bahasa pemrograman apapun dikarenakan mengunakan bahasa
yang umum digunakan oleh programmer. JSON terbuat dari dua struktur :
a) Kumpulan pasangan nilai atau nama. Pada beberapa bahasa hal ini biasanya
dinyatakan sebagai object, record, struct, dictionary, hash table, keyed list, dan
associative array.
b) Daftar nilai terurutkan (an ordered list of values). Pada kebanyakan bahasa hal
ini dinyatakan sebagai array, vector, list, atau sequence.

Struktur data ini disebut sebagai struktur data universal, yang pada dasarnya semua
bahasa pemrograman modern mendukung struktur data ini dalam bentuk yang sama
maupun berlainan [33]. JSON menggunakan bentuk sebagai berikut :

28
a) Object adalah sepasang nilai atau nama yang tidak terurutkan. Object dimulai
dengan “{” (kurung kurawal buka) dan diakhiri dengan “}” (kurung kurawal
tutup). Setiap nama diikuti dengan “ : ” (titik dua) dan setiap pasangan nama atau
nilai dipisahkan oleh “ , ” (koma).
b) Array merupakan kumpulan nilai yang terurutkan, array dimulai dengan “ [ ”
(kurung kotak tutup buka) dan diakhiri dengan “ ] ” (kurung kotak tutup). Setiap
nilai dipisahkan oleh “ , ” (koma).

Gambar 2. 17 Contoh format JSON.


2.16. SQLite
SQLite adalah sebuah library perangkat lunak yang menyediakan database tanpa
konfigurasi dan tanpa menggunakan server. SQLite merupakan mesin database
SQL tertanam dan tidak memiliki proses server terpisah seperti kebanyakan
database SQL lainnya. Pada SQLite read dan write langsung dapat ke file disk
biasa. Format database dapat lintas platform, fitur inilah yang menjadikan SQLite
sebagai format file aplikasi [34].

29
BAB III METODE PENELITIAN

3.1. System Development Life Cycle


Pada penelitian ini menggunakan metode System Development Life Cycle (SDLC)
dimana metode ini merupakan model konseptual yang dalam sebuah manajemen
proyek untuk menggambarkan tahapan yang terlibat dalam proyek pengembangan.
Setiap sistem perangkat keras ataupun perangkat lunak akan melalui proses
pengembangan yang dapat dianggap sebagai sebuah proses berulang dengan
beberapa langkah. System Development Life Cycle digunakan untuk memberikan
kerangka kerja untuk menentukan fase dan langkah yang terlibat dalam
pengembangan sistem.

Adapun tahapan atau langkah-langkah yang ada dalam metode SDLC seperti yang
ditunjukan pada Gambar 3.1 adalah perencanaan (planning), analisis (analysis),
desain (design), implementasi (implementation), uji coba (testing), dan pengelolaan
(maintenance).

Gambar 3. 1 System Development Life Cycle.

30
a) Perencanaan (planning), merupakan sebuah tahapan awal untuk mendefenisikan
masalah dan ruang lingkup sistem yang ada, apa saja yang akan dilakukan dan
tujuan akhir yang akan dicapai dari suatu sistem yang akan diteliti.
b) Analisis (analysis), pada tahapan ini dilakukan pengumpulan informasi,
menganalisis, dan memvalidasi dari sistem yang telah ada sebelumnya,
kemudian menentukan kebutuhan serta persyaratan dari sistem baru yang akan
dikembangkan.
c) Desain (design), tahap ini adalah kelanjutan dari tahapan sebelumnya dimana
pada tahap desain mencakup perancangan software maupun hardware sesuai
dengan kebutuhan sistem yang telah dianalisis.
d) Implementasi (implementation), merupakan sebuah tahap mengintegrasikan
semua komponen sistem yang telah di desain, pada tahapan ini akan dilakukan
penerapan algoritma fuzzy logic yang telah didesain ke dalam sistem yang telah
di integrasikan.
e) Uji coba (testing), setelah sistem berhasil di integrasikan selanjutnya merupakan
tahap uji coba dimana pada tahapan ini sistem akan di uji coba untuk diamati
apakah hasil dari sistem tersebut sudah sesuai yang diharapkan atau tidak.
f) Pengelolaan (maintenance), tahap ini akan melibatkan perubahan atau
pembaruan sistem setelah di uji coba apakah hardware atau software yang
mungkin perlu peningkatkan, penyesuaian atau perubahan agar lebih sesuai
dengan kebutuhan atau tujuan dari sistem yang dirancang.

3.2. Perancangan Hardware


Untuk perancangan dan implementasi dari sistem kendali TDS dan pH, diperlukan
beberapa hal dalam proses perancangannya. Mulai dari perancangan komponen
yang akan digunakan, memilih spesifikasi yang tepat untuk sistem, tujuannya agar
sistem yang dirancang sesuai dengan apa yang diharapkan.

31
3.2.1. Diagram Blok Sistem
Pada penelitian kali ini adalah merancang sebuah sistem kendali dan akuisisi data
untuk sistem hidroponik nutrient film technique menggunakan metode fuzzy logic
dengan implementasi Internet of Things (IoT) untuk memudahkan pengendalian
dan monitoring nilai nutrisi dan pH larutan nutrisi. Sistem pengendalian ini
dirancang untuk mengendalikan serta memonitoring parameter sesuai dengan
jadwal yang sudah diatur pada dashboard Node-Red sebagai tools IoT. Berikut
adalah diagram blok dari sistem secara keseluruhan.

Gambar 3. 2 Diagram Blok Sistem.

Dari diagram blok pada Gambar 3.2, terlihat bahwa alat yang akan dirancang terdiri
dari beberapa bagian :
a) Bagian input menggunakan analog TDS sensor dan analog pH sensor untuk
membaca nilai TDS dan pH yang terkandung dalam tandon larutan nutrisi.
b) Bagian kontrol yaitu ESP32 yang akan menerima data dari Node-Red berupa
penjadwalan kontrol TDS dan pH, serta mengirimkan nilai-nilai parameter yang
terbaca.
c) Bagian output menggunakan diaphragm pump untuk menyalurkan nutrisi ke
dalam tandon larutan nutrisi guna menaikan kadar TDS pada larutan. Aerator
pump digunakan untuk menyalurkan air ke dalam tandon nutrisi guna

32
mengurangi kadar TDS pada larutan. Kemudian peristaltic pump digunakan
untuk menyalurkan larutan penambah dan penurun pH ke dalam tandon larutan
nutrisi.
d) Bagian driver, menggunakan driver motor L298N untuk mengatur dan
menggerakan kecepatan pump. Relay digunakan sebagai switch untuk
mematikan serta menyalakan aerator pump.
e) Bagian mekanik, menggunakan 1 buah motor servo untuk memasukan sensor
TDS.
f) Bagian interface untuk menampilkan hasil pengukuran secara langsung
menggunakan Liquid Crystal Display (LCD) 16x2.
g) MQTT Broker, digunakan untuk menangani data pengukuran yang akan
dikirimkan ke platform IoT.
h) Platform IoT, untuk platform IoT sendiri pada penelitian kali ini adalah
menggunakan Node-Red yang merupakan tools pemrograman untuk mengolah
dan menampilkan data hasil pengukuran.
i) Penyimpanan, untuk penyimpanan data hasil-hasil pengukuran akan
ditempatkan pada database SQLite.

3.2.2. Diagram Blok Sistem Kendali


Untuk perancangan sistem kendali yang akan digunakan penulis menggunakan dua
buah metode yang nantinya akan dibandingkan hasil respon output. Yang pertama
adalah menggunakan sistem kendali close loop. Berikut adalah diagram blok untuk
sistem kendali close loop untuk TDS dan pH.

Gambar 3. 3 Diagram blok sistem kendali close loop TDS.

33
Gambar 3. 4 Diagram blok sistem kendali close loop pH.

Keterangan blok diagram pada sistem kendali close loop:


a) Blok input, pada bagian blok input merupakan sebuah nilai set point yang akan
kita atur baik dalam pengendalian TDS maupun pH.
b) Blok proses, pada bagian blok ini nilai set point yang diinginkan akan diproses
atau diolah pada mikrokontroler, nilai yang akan diproses pada miktrokontroler
ini merupakan nilai error, yang nantinya digunakan untuk memutuskan apakah
nilai TDS atau pH akan dinaikan atau diturunkan, dan hasil keluaran dari blok
ini adalah berupa PWM dan timer, dimana PWM dan timer yang diatur adalah
konstan untuk tiap pengendali TDS dan pH adalah 255 untuk PWM dan 2 detik
untuk timer.
c) Blok aktuator, pada bagian blok ini aktuator akan bekerja sesuai dengan sinyal
PWM dan timer yang diatur. Dimana pada pengendalian TDS diaphragm pump
akan mengalirkan larutan nutrisi ke tandon nutrisi, dan water pump akan
mengalirkan air ke dalam tandon nutrisi guna mengurangi kandungan nutrisinya.
Kemudian pada pengendalian pH terdapat dua buah peristaltic pump untuk
menaikan nilai pH dengan mengalirkan larutan pH naik ke tandon nutrisi dan
menurunkan nilai pH dengan mengalirkan larutan pH turun ke tandon nutrisi.
d) Blok plant, pada blok ini merupakan sebuah objek yang dikendalikan yaitu
tandon berisi larutan nutrisi.
e) Blok sensor, pada pengendalian TDS sensor TDS akan mengukur nilai TDS
aktual setelah aksi pengontrolan yang selanjutnya akan diumpan balikan untuk
dibandingkan dengan set point sehingga menghasilkan sinyal error. Sedangkan

34
pada pengendalian pH larutan, sensor yang digunakan untuk membaca pH
larutan secara aktual adalah analog pH sensor.

Yang kedua adalah sistem kendali dengan mengimplementasikan algoritma fuzzy


logic. Berikut adalah blok diagram sistem kendalinya.

Gambar 3. 5 Diagram blok sistem kendali fuzzy logic TDS.

Gambar 3. 6 Diagram blok sistem kendali fuzzy logic pH.

Keterangan blok diagram pada sistem kendali menggunakan fuzzy logic:


a) Blok input, pada bagian blok input merupakan sebuah nilai set point yang akan
kita atur baik dalam pengendalian TDS maupun pH. Yang selanjutnya nilai ini
yang akan dibandingkan dengan nilai TDS dan pH aktual sehingga
menghasilkan nilai error dan delta error.

35
b) Blok proses, nilai yang akan diproses pada miktrokontroler ini merupakan nilai
error dan delta error yang digunakan sebagai variabel input untuk diproses
menggunakan algoritma fuzzy logic. Hasil keluaran dari fuzzy logic ini berupa
nilai PWM dan timer untuk mengontrol kecepatan dari pompa dan lama
waktunya pompa tersebut bekerja.
c) Blok aktuator, pada bagian blok ini aktuator akan bekerja sesuai dengan sinyal
PWM dan timer yang dihasilkan dari defuzzyfikasi. Dimana pada pengendalian
TDS diaphragm pump akan mengalirkan larutan nutrisi ke tandon nutrisi, dan
water pump akan mengalirkan air ke dalam tandon nutrisi guna mengurangi
kandungan nutrisinya. Kemudian pada pengendalian pH terdapat dua buah
peristaltic pump untuk menaikan nilai pH dengan mengalirkan larutan pH naik
ke tandon nutrisi dan menurunkan nilai pH dengan mengalirkan larutan pH turun
ke tandon nutrisi.
d) Blok plant, pada blok ini merupakan sebuah objek yang dikendalikan yaitu
tandon berisi larutan nutrisi.
e) Blok sensor, sama seperti pada sistem kendali close loop, pengendalian TDS
sensor TDS akan mengukur nilai TDS aktual setelah aksi pengontrolan yang
selanjutkan akan diumpan balikan untuk dibandingkan dengan set point
sehingga menghasilkan nilai error dan delta error sebagai variabel input untuk
fuzzy logic. Sedangkan pada pengendalian pH larutan, sensor yang digunakan
untuk membaca pH larutan secara aktual adalah analog pH sensor.

3.2.3. Perancangan Skematik Sistem


Perancangan sistem kendali dan akuisisi data untuk sistem hidroponik NFT
menggunakan metode fuzzy logic dengan implementasi Internet of Things (IoT)
dibuat menggunakan beberapa komponen hardware dan software yang
diintegrasikan. Perancangan yang telah dibuat dapat dilihat pada skematik
rangkaian pada Gambar 3.7.

36
Gambar 3. 7 Wiring rangkaian sistem.

Untuk lebih jelasnya mengenai konfigurasi pin yang digunakan pada sistem ini
dapat dilihat pada tabel 3.1. Sistem yang dirancang menggunakan dua buah sensor
analog yaitu analog TDS sensor dan analog pH sensor yang dihubungkan dengan
pin ADC 2 pada ESP32, untuk analog TDS sensor dihubungkan dengan pin 35
sedangkan analog pH sensor dihubungkan dengan pin 34. Kemudian untuk
mekanik memasukan sensor TDS ke dalam tandon larutan nutrisi menggunakan
servo, dimana pin PWM untuk servo TDS terhubung ke pin 19.

Untuk menampilkan hasil pengukuran secara langsung pada perangkat


menggunakan LCD I2C 16x2 dengan menghubungkan pin SCL pada LCD ke pin
22 pada ESP32 dan pin SDA pada LCD dihubungkan ke pin 21. Driver motor
digunakan untuk menggerakan diaphragm pump dan peristaltic pump, terdapat dua
buah driver motor untuk driver motor yang pertama digunakan untuk menggerakan

37
peristaltic pump pH naik dan peristaltic pump pH turun dimana pin ENA
dihubungkan dengan pin PWM pada ESP32 yaitu pin 32, pin IN1 dihubungkan
dengan pin 33, pin IN2 dihubungkan dengan ground, pin IN3 dihubungkan dengan
pin 26, pin IN4 dihubungkan dengan ground, dan pin ENB dihubungkan dengan
pin PWM yaitu pin 25. Tujuan pin IN2 dan IN4 pada driver motor dihubungkan ke
ground adalah untuk menghemat penggunaan pin dan juga pompa yang digunakan
tidak perlu melakukan forward atau reverse, cukup forward saja karena hanya
mengalirkan ke satu arah saja. Kemudian untuk driver motor yang kedua digunakan
untuk menggerakan diaphragm pump, dimana ENA dihubungkan dengan pin 27,
pin IN1 dihubungkan dengan pin 14, dan pin IN2 dihubungkan dengan pin ground.
Pin IN3, IN4, dan ENB tidak digunakan. Kemudian untuk menggerakan water
pump menggunakan modul relay 2 channel, IN2 dihubungkan dengan pin 13.

Tabel 3. 1 Konfigurasi pin out yang terhubung ke modul.

Pin yang terhubung Buck Power


Komponen Pin
ke ESP32 Converter Supply 12V
Analog Analog Pin 35 - -
TDS Vcc Pin 3.3V - -
Sensor Gnd Pin Gnd - -
Analog Pin 34 - -
Analog pH
Vcc Pin 3.3V - -
Sensor
Gnd Pin Gnd - -
PWM Pin 19 - -
Servo TDS Vcc - 5V -
Gnd - Gnd -
PWM Pin 18 - -
Servo pH Vcc - 5V -
Gnd - Gnd -
SCL Pin 22 - -
LCD I2C SDA Pin 21 - -
16x2 Vcc - 5V -
Gnd - Gnd -
12V - - 12V
Driver Gnd - - Gnd
Motor 1 5V - - -
ENA Pin 32 - -

38
IN1 Pin 33 - -
IN2 Pin Gnd - -
IN3 Pin 26 - -
IN4 Pin Gnd - -
ENB Pin 25 - -
12V - - 12V
Gnd - - Gnd
5V - - -
ENA Pin 27 - -
Driver
IN1 Pin 14 - -
Motor 2
IN2 Pin Gnd - -
IN3 - - -
IN4 - - -
ENB - - -
Gnd Pin Gnd - -
Modul IN1 - - -
Relay 2 ch IN2 Pin 13 - -
Vcc Pin 3.3V - -

3.2.4. Perancangan PCB


Pada perancangan PCB, hardware yang akan dirancang terbagi menjadi tiga buah
bagian yaitu modul input yang terdiri dari perangkat-perangkat sensor, mekanik
untuk sensor, dan connector untuk menghubungkan modul input dengan main
board. Main board terdiri dari power supply unit (PSU) 12 V, buck converter untuk
menurunkan tegangan 12 V ke 5 V untuk keperluan power external ESP32 dan
beberapa modul yang membutuhkan tegangan 5 V, kemudian connector untuk
LCD, modul input dan modul output. Modul output terdiri dari dua buah driver
L298N, modul relay, dan connector untuk menghubungkan modul output dengan
main board. Connector yang digunakan adalah connector JST. Berikut adalah
layout PCB yang dirancang.

39
Gambar 3. 8 Layout PCB modul input.

Gambar 3. 9 Layout PCB main board.

40
Gambar 3. 10 Layout PCB modul output.

3.3. Perancangan Software


Untuk mengimplementasikan proses kendali fuzzy logic dan Internet of Things agar
sesuai yang diharapkan, diperlukanlah peracangan software untuk membuat cara
kerja dari algoritma yang akan diimplementasikan pada perangkat, perancangan
fuzzy logic yang akan digunakan, kemudian aliran data dari sistem, dan juga sistem
IoT nya.

3.3.1. Diagram Alir


Untuk memahami cara kerja dari sistem yang dibuat dapat dilihat pada diagram alir
pada Gambar 3.11. Sistem pengendalian dibuat secara sequence dimana proses
pengendalian TDS dilakukan terlebih dahulu dan setelah proses pengendalian TDS
selesai maka akan dilanjutkan dengan proses pengendalian pH. Berikut adalah
diagram alir dari sistem.

41
Gambar 3. 11 Diagram alir sistem.

Penjelasan dari diagram alir pada Gambar 3.11 adalah :


1. Diawali dengan start yang menandakan awal mulai diagram alir ini bekerja.
2. Melakukan inisialisasi pada fungsi WiFi, MQTT broker, Network Time
Protokol (NTP) server, input, output, dan variabel-variabel yang digunakan
dalam program.
3. Selanjutnya masuk ke dalam proses menghubungkan perangkat ke dalam
jaringan WiFi, setelah proses koneksi berhasil kemudian masuk ke dalam
proses menghungkan perangkat dengan MQTT broker.
4. Ketika perangkat menerima data dari MQTT broker maka, data-data tersebut
akan diuraikan terlebih dahulu pada sub proses parsing data.

42
5. Setelah sistem menerima data dari MQTT berupa data timer untuk proses
pengendalian, data timer tersebut akan parsing dan dibandingkan dengan data
waktu yang didapat dari NTP server. Jika waktu yang didapat dari NTP server
sudah sama dengan data timer makan sistem akan masuk ke dalam mode
pengendalian. Kemudian terdapat data force on dimana jika data tersebut
bernilai 1 atau true maka sistem akan menjalankan proses pengendalian tanpa
harus sesuai dengan jadwal yang ditentukan.
6. Jika data timer sudah dengan waktu dari NTP server atau data force on bernilai
1 maka sistem akan menjalan proses pengendalian TDS terlebih dahalu, setelah
proses pengendalian TDS selesai, akan dilanjutkan dengan proses
pengendalian pH. Apabila data timer masih belum sesuai dengan NTP server
maka sistem akan masuk ke dalam monitoring mode.
7. Setelah proses pengendalian selesai maka program akan kembali ke proses
pengecekan data dari MQTT broker dan pengecekan data timer dengan NTP
server. Apabila sistem dimatikan maka program berakhir.

3.3.2. Sub Process Pada Diagram Alir Sistem


Setelah di atas dijelaskan tentang cara kerja sistem melalui proses diagram alir,
karena pada diagram alir tersebut terdapat sub proses sistem maka selanjutnya akan
dijelaskan lebih lanjut pada bagian sub proses dari diagram alir sistem. Terdapat 4
buah sub process yang ada pada sistem ini, yaitu sub proses connect WiFi dan
MQTT broker, sub proses parsing data, sub proses kendali TDS, serta sub proses
kendali pH.

a) Sub proses connect WiFi dan MQTT broker

Berikut adalah sub proses untuk menghubungkan perangkat dengan WiFi dan
MQTT broker dapat dilihat pada diagram alir pada Gambar 3.12.

43
Gambar 3. 12 Sub proses menghubungkan perangkat ke WiFi dan MQTT.

Pada sub proses menghubungakan WiFi, diawali dengan setup ssid dan
password yang akan digunakan untuk sebagai penyedia layanan konektifitas
untuk perangkat. Kemudian selanjutnya adalah proses koneksi perangkat ke
jaringan yang sesuai dengan ssid dan password yang sudah di setup, pada saat

44
proses koneksi LCD akan menampilkan notifikasi “Connecting WiFi” dan
variabel attempt bertambah, apabila proses koneksi telah 40 kali gagal mencoba
untuk menghubungkan dengan jaringan maka LCD akan menampilkan notifikasi
“Connecting Fail” dan ESP32 akan restart kembali dari awal. Setelah proses
menghubungkan perangkat dengan jaringan berhasil selanjutnya adalah proses
menghubungkan perangkat dengan MQTT server dimana setup config yang
dilakukan adalah dengan memasukan MQTT server yang akan digunakan dan
port yang akan digunakan, pada penelitian kali ini adalah menggunakan broker
MQTTX, setting MQTT server yang digunakan adalah broker.emqx.io dan port
yang digunakan adalah 1883, ketika proses menghubungkan perangkat dengan
MQTT broker telah berhasil maka akan dilanjutkan ke proses selanjutnya.

b) Sub proses parsing data


Pada sub proses ini berfungsi untuk menguraikan data-data yang dikirimkan dari
MQTT broker ke ESP32. Dimana data-data yang dikirimkan dalam bentuk
format JSON, dan data akan di deserialize atau proses konversi data string ke
dalam bentuk object kemudian disimpan ke dalam variabel. Ketika data yang
diterima merupakan data timer dan memiliki key [0][“timer1”] maka value yang
ada di dalam key tersebut akan disimpan dalam variabel timer 1, apabila data
yang dikirimkan memiliki key [1][“timer2”] maka value yang ada di dalam key
tersebut akan disimpan ke dalam variabel timer 2, begitu pun seterusnya apabila
data tersebut memiliki key [2][“timer3”] maka value nya akan disimpan ke dalam
variabel timer 3. Data – data timer yang berada di dalam variabel timer kemudian
akan disimpan di dalam EEPROM. Ketika data yang diterima adalah data set
point dan memiliki key [0][“tds_set”] maka value nya akan disimpan ke dalam
variabel set point TDS dan apabila data memiliki key [1][“ph_set] maka value
nya akan disimpan ke dalam variabel set point pH. Kemudian data set point yang
sudah disimpan pada variabel selanjutnya akan disimpan kembali ke dalam
EEPROM.

45
Jika data yang diterima memiliki key [0][“force_on”], value yang dimiliki key
tersebut akan disimpan di dalam variabel force on, jika data yang diterima
memiliki key [0][“force_stop”], value yang dimiliki key tersebut akan disimpan
di dalam variabel force stop. Key yang dikirimkan dari MQTT broker ke ESP32
telah disesuaikan dengan atau diatur di dalam Node-Red. Berikut adalah sub
proses untuk parsing data dapat dilihat pada Gambar 3.13.

Gambar 3. 13 Sub proses parsing data.

46
c) Sub proses monitoring mode

Berikut adalah sub proses dari monitoring mode dapat dilihat pada Gambar 3.14.

Gambar 3. 14 Sub proses monitoring mode.


Sub proses akan bekerja apabila sistem belum masuk ke dalam proses
pengendalian, dimana data force on masih bernilai “0” dan data timer masih
belum sama dengan NTP server. Apabila waktu sekarang dikurang dengan
waktu sebelumnya sudah lebih dari sama dengan interval sampling maka timer
sampling aktif dan servo TDS akan aktif untuk memasukan analog TDS sensor
ke dalam tandon nutrisi. Waktu Sekarang diambil dari fungsi millis pada ESP32
yang merupakan waktu internal setiap milli secara independen. Kemudian
sistem akan melakukan pengukuran nilai TDS dan pengukuran ADC dari analog
pH sensor yang selanjutnya akan dilakukan proses filtering untuk mendapatkan
nilai pH yang stabil. Ketika timer sampling sudah berjalan selama 30 detik maka
data-data hasil pengukuran akan dikirimkan ke MQTT dan servo TDS akan

47
kembali ke posisi awal. Apabila timer sampling belum berjalan selama 30 detik
maka proses pembacaan nilai TDS dan pH akan dilakukan kembali.

d) Sub proses kendali TDS

Berikut adalah sub proses dari kendali TDS dengan algoritma fuzzy logic dapat
dilihat pada Gambar 3.15.

Gambar 3. 15 Sub proses kendali TDS menggunakan fuzzy logic.

48
Pada sub proses ini ketika sistem sudah mulai melaksanakan proses
pengendalian TDS maka sub proses ini akan aktif, diawali dengan menyalanya
servo dimana servo akan bergerak 90° untuk mencelupkan sensor TDS ke dalam
larutan nutrisi, selanjutnya adalah proses pembacaan nilai TDS dimana pada
proses ini akan dilakukan selama 10 detik agar pembacaan yang dihasilkan
stabil. Sesudah nilai TDS didapatkan, nilai tersebut akan dibandingkan dengan
nilai threshold, dimana nilai threshold ini merupakan nilai ambang pada
program yang dibuat terdapat dua buah nilai threshold yaitu nilai threshold atas
dan nilai threshold bawah, nilai threshold bawah ini diambil dari nilai set point
dikurang dengan nilai set point yang sudah dikalikan dengan set point.
Sedangkan nilai threshold atas diambil dari nilai set point ditambah dengan nilai
set point yang sudah dikalikan dengan set point.

Ketika nilai pembacaan TDS sudah berada antara nilai threshold bawah dan nilai
threshold atas maka timer kontrol akan aktif selama 3 menit dan runonce akan
aktif untuk mencegah timer kontrol ini mengulang lagi perhitungannya pada
loop berikutnya, dan apabila nilai pembacaan TDS belum menyentuh nilai
threshold maka timer kontrol tidak akan aktif terlebih dahulu. Setelah
membandingkan nilai threshold selanjutnya nilai pembacaan TDS akan
dikirimkan ke MQTT broker dan ditampilkan ke LCD.

Selanjutnya adalah proses mencari nilai error, nilai error ini didapat dari hasil
pengurangan set point dengan nilai pembacaan TDS, setelah itu proses mencari
nilai delta error dengan mengurangkan nilai error saat ini dengan nilai error
sebelumnya, kemudian nilai error akan disimpan di dalam variabel last error.
nilai error dan delta error ini akan dijadikan variabel input fuzzy logic.

Setelah mendapatkan nilai error dan delta error, selanjutnya adalah proses
fuzzyfikasi. Nilai error dan delta error ini akan diubah ke dalam bentuk fuzzy
input, yang berupa nilai linguistik yang ditentukan berdasarkan fungsi
keanggotaan. Fuzzy inference system akan melakukan penalaran menggunakan

49
fuzzy input dan fuzzy rules yang telah dibuat sehingga menghasilkan fuzzy output,
setelah mendapatkan fuzzy output pada defuzzifikasi akan diubah ke dalam suatu
nilai tegas.

Hasil proses defuzzyfikasi berupa nilai PWM dan timer untuk aktuator bekerja.
Nilai PWM dan timer ini digunakan untuk menjalan diaphragm pump,
sedangkan untuk water pump hanya menggunakan nilai timer nya saja untuk
lama waktunya water pump ini bekerja. Apabila nilai error lebih dari sama
dengan nol maka hanya diaphragm pump yang akan bekerja berdasarkan nilai
PWM dan timer, apabila nilai error kurang dari nol maka hanya water pump saja
yang bekerja berdasarkan nilai timer. Dan kondisi aktuator ini ketika bekerja
akan dikirimkan ke MQTT broker untuk dimonitoring apakah bekerja atau tidak.
Diaphragm pump atau water pump ini akan bekerja hingga timer selesai. Jika
timer sudah selesai maka Diaphragm pump atau water pump yang tadinya
bekerja akan dipadamkan.

Jika timer kontrol tidak aktif maka proses akan kembali lagi ke proses
pembacaan nilai TDS, apabila timer kontrol sudah aktif maka akan masuk ke
kondisi berikutnya yaitu memastikan apakah timer kontrol sudah aktif selama 3
menit, apabila timer kontrol belum berjalan selama 3 menit maka proses akan
kembali lagi ke proses pembacaan nilai TDS, jika timer sudah berjalan 3 menit
maka runonce akan diubah ke 0 kembali untuk proses pengendalian TDS pada
jadwal berikutnya, dan servo akan padam sehingga bergerak ke 0°.

50
e) Sub proses kendali pH

Berikut adalah sub proses dari kendali pH dapat dilihat pada Gambar 3.16.

Gambar 3. 16 Sub proses kendali pH menggunakan fuzzy logic.

Pada sub proses kendali pH sedikit berbeda dengan kendali TDS pada bagian
pembacaan pengukuran nilai pH, waktu yang diatur untuk mengukur pH adalah
30 detik, pertama ketika sistem sudah selesai melaksanakan proses pengendalian
TDS maka sub proses kendali pH ini akan aktif, diawali dengan melakukan
pembacaan nilai ADC dari sensor pH dan mendapatkan nilai pH, kemudian nilai
pH tersebut akan dilakukan proses filtering dengan cara merata-ratakan nilai pH

51
yang didapat selama proses pengukuran 30 detik agar hasil nilai pembacaan pH
yang didapatkan stabil. Sesudah nilai pH didapatkan, nilai tersebut akan
dibandingkan dengan nilai threshold, dimana nilai threshold cara kerjanya sama
seperti yang sudah diuraikan pada sub proses kendali TDS.

Ketika nilai pembacaan pH sudah berada antara nilai threshold bawah dan nilai
threshold atas maka timer kontrol akan aktif selama 5 menit dan runonce akan
aktif untuk mencegah timer kontrol ini mengulang lagi perhitungannya pada
loop berikutnya, dan apabila nilai pembacaan pH belum menyentuh nilai
threshold maka timer kontrol tidak akan aktif terlebih dahulu. Setelah
membandingkan nilai threshold selanjutnya nilai pembacaan TDS akan
dikirimkan ke MQTT broker dan ditampilkan ke LCD.

Selanjutnya adalah proses mencari nilai error, nilai error ini didapat dari hasil
pengurangan set point dengan nilai pembacaan pH, setelah itu proses mencari
nilai delta error dengan mengurangkan nilai error saat ini dengan nilai error
sebelumnya, kemudian nilai error akan disimpan di dalam variabel last error.
nilai error dan delta error ini akan dijadikan variabel input fuzzy logic.

Setelah mendapatkan nilai error dan delta error, selanjutnya adalah proses
fuzzyfikasi. Nilai error dan delta error ini akan diubah ke dalam bentuk fuzzy
input, yang berupa nilai linguistik yang ditentukan berdasarkan fungsi
keanggotaan. Fuzzy inference system akan melakukan penalaran menggunakan
fuzzy input dan fuzzy rules yang telah dibuat sehingga menghasilkan fuzzy output,
setelah mendapatkan fuzzy output pada defuzzifikasi akan diubah ke dalam suatu
bilangan riil.

Hasil proses defuzzyfikasi berupa nilai PWM dan timer untuk aktuator bekerja.
Nilai PWM dan timer ini digunakan untuk menjalankan peristaltic pump.
Apabila nilai error lebih dari sama dengan nol maka hanya peristaltic pump
untuk menaikan nilai pH yang akan bekerja berdasarkan nilai PWM dan timer,

52
apabila nilai error kurang dari nol maka peristaltic pump untuk menurunkan pH
saja yang bekerja berdasarkan nilai PWM dan timer. Dan kondisi aktuator ini
ketika bekerja akan dikirimkan ke MQTT broker untuk dimonitoring apakah
sedang aktif atau tidak. Peristaltic pump ini akan bekerja hingga timer selesai.
Jika timer sudah selesai maka Peristaltic pump yang tadinya bekerja akan
dipadamkan.

Jika timer kontrol tidak aktif maka proses akan kembali lagi ke proses
pembacaan nilai pH, apabila timer kontrol sudah aktif maka akan masuk ke
kondisi berikutnya yaitu memastikan apakah timer kontrol sudah aktif selama 3
menit, apabila timer kontrol belum berjalan selama 5 menit maka proses akan
kembali lagi ke proses pembacaan nilai pH, jika timer sudah berjalan 5 menit
maka runonce akan diubah ke 0 kembali untuk proses pengendalian pH pada
jadwal berikutnya.

3.3.3. Data Flow Diagram


Untuk melihat aliran data yang secara jelas dapat dilihat pada Gambar 3.17 dalam
diagram dapat dilihat terdapat data yang disiapkan pada proses fuzzy logic berupa
pembacaan sensor dan kondisi aktuator. Data yang dikirimkan dalam format string
dengan struktur data “nilai TDS, nilai pH” pada paket data sensor, sedangkan untuk
paket data aktuator memiliki struktur data “state pH up, state pH down, state TDS
up, state TDS down”. Kemudian pada proses pengambilan data Node-Red akan
mengambil data yang diperlukan dengan mengakses MQTT broker. Data
pembacaan sensor dan kondisi aktuator tersebut akan di parsing berdasarkan “,”.

Kemudian pada entitas Node-Red akan mengirimkan beberapa data berupa data
timer, data set point, dan data force. Data-data tersebut akan di serialize terlebih
dahulu atau konversi object data ke dalam bentuk string pada proses serialize data
kemudian dipublikasikan ke MQTT broker dalam format JSON yang kemudian
data tersebut akan di parsing atau diuraikan pada proses dan deserialize dan
schedule. Kemudian data time set dan set point akan disimpan pada entitas

53
EEPROM dan data set point akan dikirimkan ke proses fuzzy logic. Data force akan
masuk ke entitas state control, data force ini digunakan untuk memberikan control
signal pada proses fuzzy logic tanpa bergantung dengan jadwal. Data time set akan
dikirimkan ke entitas time control dimana pada entitas ini digunakan untuk
membandingkan data jadwal dengan waktu aktual, apabila data timer sama dengan
waktu aktual maka entitas time control akan mengirimkan control signal ke proses
fuzzy logic.

Gambar 3. 17 Data flow diagram.

54
3.3.4. Perancangan Fuzzy logic
Untuk metode pengendalian yang akan diimplementasikan adalah fuzzy logic tipe
sugeno dengan menggunakan dua buah variabel input yaitu error dan delta error
dan dua buah variabel output hasil defuzzyfikasi yaitu nilai PWM dan timer untuk
mengendalikan pompa.

a) Fuzzy logic untuk kendali TDS

Pada bagian fuzzyfikasi variabel input error terdapat 5 membership function yaitu
negatif error besar, negatif error kecil, zero error, positif error kecil, dan positif
error besar. Kemudian untuk variabel input delta error terdapat 5 membership
function yaitu negatif delta error besar, negatif delta error kecil, zero delta error,
positif delta error kecil, dan positif delta error besar. Dan untuk variabel output
PWM terdapat 3 buah membership function yaitu lambat, sedang, dan cepat. Untuk
variabel output timer terdapat 3 buah membership function bentar, sedang, dan
lama. Berikut adalah tabel pembentukan fungsi keanggotaan fuzzy dapat dilihat
pada Tabel 3.2.
Tabel 3. 2 Pembentukan fungsi keanggotaan fuzzy untuk kendali TDS.

I/O Variabel Range Membership function Type Parameter


Negatif Error Besar (NB-Er) trapmf [-250 -250 -200 -100]
Negatif Error Kecil (NK-Er) trimf [-200 -100 0]
Input 1 Error [-250 250] Zero Error (Z-Er) trimf [-100 0 100]
Positif Error Kecil (PK-Er) trimf [0 100 200]
Positif Error Besar (PB-Er) trapmf [100 200 250 250]
Negatif dError Besar (NB-dEr) trapmf [-150 -150 -100 -50]
Negatif dError Kecil (NK-dEr) trimf [-100 -50 0]
Delta
Input 2 [-150 150] Zero dError (Z-dEr) trimf [-50 0 50]
Error
Positif dError Kecil (PK-dEr) trimf [0 50 100]
Positif dError Besar (PB-dEr) trapmf [50 100 150 150]
Lambat Constant [178]
Output
1
PWM [0 1] Sedang Constant [204]
Cepat Constant [255]
Bentar Constant [0]
Output
Timer [0 1] Sedang Constant [1000]
2
Lama Constant [2000]

55
Dan berikut adalah hasil perancangan membership function pada MATLAB
menggunakan fuzzy logic toolbox.

Gambar 3. 18 Membership function error pada kendali TDS.

Gambar 3. 19 Membership function delta error pada kendali TDS.

56
Gambar 3. 20 Membership function PWM pada kendali TDS.

Gambar 3. 21 Membership function timer pada kendali TDS.

Rules base yang dirancang pada pengendalian TDS ini menggunakan 25 basis
aturan, dapat dilihat pada Tabel 3.3 Untuk mengendalikan nilai PWM dan Tabel
3.4 Untuk nilai timer untuk lama bekerjanya aktuator.

57
Tabel 3. 3 Rules base output PWM pada kendali TDS.

NB - Er NK - Er Z - Er PK - Er PB - Er
NB - dEr Cepat Sedang Lambat - -
NK- dEr Cepat Sedang Lambat - -
Z - dEr Cepat Sedang Lambat - -
PK - dEr Cepat Sedang Lambat - -
PB - dEr Sedang Sedang Lambat - -

Tabel 3. 4 Rules base output timer pada kendali TDS.

NB - Er NK - Er Z - Er PK - Er PB - Er

NB - dEr Lama Sedang Sedang Sedang Lama

NK- dEr Lama Sedang Bentar Sedang Lama

Z - dEr Lama Sedang Bentar Sedang Lama

PK - dEr Sedang Sedang Bentar Sedang Lama

PB - dEr Sedang Sedang Sedang Sedang Lama

b) Fuzzy logic untuk kendali pH

Untuk perancangan fuzzy logic pada kendali pH sama seperti pada fuzzy logic
kendali TDS hanya saja perbedaan dari nilai parameter tiap membership function
yang digunakan dan juga rules base yang digunakan. Berikut adalah tabel
pembentukan fungsi keanggotaan pada kendali pH.

58
Tabel 3. 5 Pembentukan fungsi keanggotaan fuzzy pada kendali pH.

I/O Variabel Range Membership function Type Parameter


Negatif Error Besar (NB-Er) trapmf [-1,5 -1,5 -0,4 -0,1]
Negatif Error Kecil (NK-Er) trimf [-0,4 -0,1 0 ]
Input 1 Error [-1,5 1,5] Zero Error (Z-Er) trimf [-0,1 0 0,1]
Positif Error Kecil (PK-Er) trimf [0 0,1 0,4]
Positif Error Besar (PB-Er) trapmf [0,1 0,4 1,5 1,5]
Negatif dError Besar (NB-dEr) trapmf [-1.5 -1.5 -0,4 -0,1]
Negatif dError Kecil (NK-dEr) trimf [-0,4 -0,1 0 ]
Delta
Input 2 [-1,5 1,5] Zero dError (Z-dEr) trimf [-0,1 0 0,1]
Error
Positif dError Kecil (PK-dEr) trimf [0 0,1 0,4]
Positif dError Besar (PB-dEr) trapmf [0,1 0,4 1,5 1,5]
Lambat Constant [127]
Output
1
PWM [0 1] Sedang Constant [178]
Cepat Constant [255]
Bentar Constant [0]
Output
Timer [0 1] Sedang Constant [2500]
2
Lama Constant [5000]

Berikut adalah hasil perancangan membership function pada MATLAB


menggunakan fuzzy logic toolbox.

Gambar 3. 22 Membership function error pada kendali pH.

59
Gambar 3. 23 Membership function delta error pada kendali pH.

Gambar 3. 24 Membership function PWM pada kendali pH.

60
Gambar 3. 25 Membership function timer pada kendali pH.

Rules base yang dirancang pada pengendalian pH ini menggunakan 25 basis aturan
sama seperti pada pengendalian TDS hanya saja basis aturannya yang berbeda baik
untuk PWM dan timer, rules base yang digunakan dapat dilihat pada Tabel 3.6
Untuk mengendalikan nilai PWM dan Tabel 3.7 untuk nilai timer untuk lama
bekerjanya aktuator.
Tabel 3. 6 Rules base output PWM pada kendali pH.

NB - Er NK - Er Z - Er PK - Er PB - Er
NB - dEr Cepat Sedang Lambat Sedang Sedang
NK- dEr Cepat Sedang Lambat Sedang Cepat
Z - dEr Cepat Sedang Lambat Sedang Cepat
PK - dEr Cepat Sedang Lambat Sedang Cepat
PB - dEr Sedang Sedang Lambat Sedang Cepat

Tabel 3. 7 Rules base output timer pada kendali pH.

NB - Er NK - Er Z - Er PK - Er PB - Er
NB - dEr Lama Lama Sedang Bentar Bentar
NK- dEr Lama Lama Bentar Bentar Sedang
Z - dEr Lama Sedang Bentar Sedang Lama
PK - dEr Sedang Bentar Bentar Lama Lama
PB - dEr Bentar Bentar Sedang Lama Lama

61
3.3.5. Perancangan Node-Red
Pada perancangan Node-Red terdiri dari beberapa grup flow, grup flow time set
untuk melakukan penjadwalan pengendalian perangkat, grup flow force on dan
force off untuk menyalakan pengendalian TDS dan pH tanpa perlu sesuai dengan
jadwal dan mematikan pengendalian ketika sedang bekerja. Grup flow set point
untuk mengatur nilai set point TDS dan pH yang akan dikirimkan ke perangkat.
Grup flow read value untuk mengolah data pembacaan nilai TDS dan pH yang
dikirimkan dari ESP32 ke MQTT broker. Grup flow read state untuk mengolah data
kondisi dari aktuator yang dikirimkan ESP32 ke MQTT broker.

a) Grup flow timer set


Pada grup timer set terdiri dari 3 node text input yang diatur dalam mode time
picker yang nantinya waktu yang ingin atur dimasukan ke dalam node tersebut,
data waktu yang dimasukan pada node text input ini akan diubah format nya pada
node date/time formatter ke dalam bentuk jam dan menit yang time zone nya
disesuaikan dengan tempat dimana perangkat berada. Terdapat juga 3 buah node
switch dimana node ini berfungsi sebagai switch untuk timer, ketika switch ini
dinyalakan maka data timer yang sudah diatur akan bisa aktif dan data timer akan
dikirimkan sesuai dengan data yang sudah diatur, sebaliknya ketika switch ini
dimatikan maka data timer yang sudah diatur maka data yang akan dikirimkan
akan bernilai “0”.

Kemudian node join digunakan untuk menggabungkan beberapa data atau pesan
ke dalam satu data. Data-data yang sudah digabungkan tersebut maka akan
diubah ke dalam format JSON pada node function untuk script yang digunakan
pada node function dapat dilihat pada Gambar 3.26.

62
Gambar 3. 26 Script function pada flow set timer.

Node JSON digunakan untuk mengkonversi bentuk json string ke object.


kemudian data yang sudah berbentuk JSON ini akan dikirim kan melalui MQTT
broker dengan topic /SendValue. Berikut adalah flow time set yang sudah
dihubungkan antar nodenya

63
Gambar 3. 27 Flow set timer.

b) Grup flow Force On / Stop


Pada grup flow ini terdiri dari 2 buah node button untuk menyalakan
pengendalian pada perangkat secara paksa dan mematikannya secara paksa,
dimana sebelum dikirimkan ke MQTT broker data dari force on dan force off
ini diubah dalam bentuk JSON pada node function. Berikut adalah script pada
node function untuk force on dapat dilihat pada Gambar 3.28 dan force stop
dapat dilihat pada Gambar 3.29.

Gambar 3. 28 Script pada function force on.

Gambar 3. 29 Script pada function force stop.

64
Berikut adalah flow force on dan force stop yang sudah dihubungkan antar
flownya dapat dilihat pada Gambar 3.30.

Gambar 3. 30 Flow force on dan force stop.

c) Grup flow set point


Pada grup flow set point terdiri dari 2 buah node text input yang diubah dalam
mode number jadi pada node ini hanya bisa dimasukan nilai dalam bentuk angka
saja. Node text input yang pertama adalah untuk memasukan nilai set point untuk
pH dan yang kedua untuk set point TDS. Kemudian data-data set point
digabungkan menggunakan node join. Data-data set point yang telah
dihubungkan selanjutnya diubah format nya ke dalam bentuk JSON pada node
function dan node json. Berikut adalah script yang digunakan pada node function
dapat dilihat pada Gambar 3.31.

65
Gambar 3. 31 Script pada function set point.

Setelah data set point diubah ke dalam format JSON selanjutnya data tersebut
dikirimkan ke MQTT broker dengan topic yang sama yaitu /SendValue. Berikut
adalah grup flow set point yang sudah dihubungkan antar node nya dapat dilihat
pada Gambar 3.32.

Gambar 3. 32 Flow set point.

d) Grup flow read value


Pada grup flow ini digunakan untuk membaca data yang dikirimkan ESP32 ke
MQTT broker sehingga dapat ditampilkan pada dashboard Node-Red yang
sudah dibuat. Sebelum data tersebut bisa ditampilkan data-data yang dikirim

66
ESP32 harus diolah terlebih dahulu. Diawali dengan membaca data dari MQTT
broker dengan topic /ReadValue kemudian data tersebut dipisahkan berdasarkan
koma (,) dengan menggunakan node csv karena data yang dikirimkan berbentuk
paket yang terdiri dari pembacaan nilai TDS dan pH. Data yang dihasilkan pada
node csv akan terdiri dari 2 buah kolom, kolom yang pertama adalah pembacaan
nilai TDS, dan kolom yang kedua adalah pembacaan nilai pH. Setelah data
tersebut dipisahkan maka data akan masuk ke dalam node change dimana pada
node ini akan mengganti nilai pembacaan payload atau pesan menjadi
pembacaan yang lebih spesifik, pada node change pertama data payload akan
diambil data payload kolom pertamanya saja yang merupakan nilai TDS, dan
node change kedua data payload akan diambil kolom keduanya saja yang
merupakan nilai pH. Data-data ini kemudian akan ditampilkan menggunakan
node gauge dan node chart. Data-data hasil pembacaan disimpan ke dalam
database SQLite, dengan mengubah payload dari pembacaan TDS dan pH
kedalam variabel flow, kemudian masuk ke dalam function gather data, pada
function ini data tanggal, waktu, dan pengukuran akan dijadikan pesan. Berikut
adalah script dari function gather data.

Gambar 3. 33 Function gather data.

67
Setelah melewati function gather flow, data akan masuk ke dalam node function
insert data TDS dan insert data pH, pada function ini msg.topic akan diubah ke
dalam menjadi perintah query untuk memasukan nilai pembacaan ke dalam
database berikut adalah script pada function insert data.

Gambar 3. 34 Function insert data.

Setelah memasukan hasil pengukuran ke dalam database, data hasil pengukuran


akan ditampilkan pada dashboard dalam bentuk tabel dengan menggunakan
perintah query select table pada database, perintah ini dimasukan ke dalam
function dan msg.topic diubah menjadi perintah query setelah itu node function
akan dihubungkan dengan node table untuk menampilkan data dari database
Berikut adalah script function select table dan grup flow read value yang
nodenya sudah dihubungkan dapat dilihat pada Gambar 3.35 dan Gambar 3.36.

Gambar 3. 35 Function select table.

68
Gambar 3. 36 Flow read value.
e) Grup flow read state
Pada grup ini digunakan untuk membaca state atau kondisi aktuator apakah
sedang dalam kondisi nyala atau dalam kondisi mati. Data pembacaan kondisi
yang dikirimkan ESP32 ke MQTT broker dengan topic /ReadState akan masuk
ke dalam node csv terlebih dahalu untuk dipisahkan berdasarkan koma (,) ,
dimana data yang dikirimkan dalam bentuk paket yang terdiri dari state
peristaltic pump pH naik, state peristaltic pump pH turun, state diaphragm
pump, dan state water pump. Data yang sudah dipisahkan masih ke dalam satu
paket pesan atau payload akan tetapi tiap pesannya sudah terpisah berdasarkan
kolom, dimana kolom satu adalah state peristaltic pump pH naik, kolom kedua
adalah state peristaltic pump pH turun, kolom ketiga state diaphragm pump, dan
kolom keempat adalah state water pump. Data-data tersebut akan masuk ke
dalam node change untuk mengambil nilai state tersebut berdasarkan kolomnya
yang berisi data state. Setelah itu tiap data state akan ditampilkan dalam bentuk
led pada dashboard. Berikut adalah flow read state yang sudah dihubungkan
setiap node nya dapat dilihat pada Gambar 3.37.

69
Gambar 3. 37 Flow read state.

Berikut adalah tampilan dashboard yang sudah dirancang berdasarkan flow yang
sudah dibuat dapat dilihat pada Gambar 3.38.

Gambar 3. 38 Tampilan pada dashboard Node-Red.

3.3.5. Pembuatan Database SQLite


Untuk penyimpanan data hasil pengukuran TDS dan pH, data – data tersebut akan
disimpan di dalam sebuah database, database yang digunakan untuk sistem kali ini
adalah SQLite. Pada database yang dirancang terdapat dua buah tabel pengukuran
yaitu tabel pengukuran TDS yang terdiri dari tiga buah values date, time, TDS value
dan untuk tabel pengukuran pH terdiri dari tiga buah values date, time, pH value.
Untuk proses pembuatan database masuk ke dalam terminal server. Berikut adalah
tahapan dalam pembuatan database dapat dilihat Gambar 3.39, Gambar 3.40, dan
Gambar 3.41.

70
Gambar 3. 39 Perintah untuk membuat database.

Gambar 3. 40 Perintah untuk membuat tabel pengukuran TDS.

Gambar 3. 41 Perintah untuk membuat tabel pengukuran pH.

3.3.6. Hosting Node-Red Pada Server


Untuk membuat dashboard Node-Red dapat diakses secara remote maka diperlukan
untuk hosting Node-Red terlebih dahulu pada server. Untuk hosting Node-Red
diperlukan sebuah Virtual Private Server (VPS), kemudian menginstal software
yang diperlukan yaitu Node-Red dan SQLite pada server dan import flow Node-Red
yang sebelumnya sudah dibuat pada Node-Red lokal.

71
BAB IV HASIL PENGUJIAN DAN ANALISIS

4.1. Hasil Implementasi Perangkat


4.1.1. Hasil Perancangan Board
Hasil perancangan dari layout PCB yang sudah dibuat terbagi menjadi tiga bagian,
yaitu modul input, main board, modul output. Pada modul input terdiri dari
transmitter board untuk sensor TDS, transmitter board untuk sensor pH, dan
connector untuk motor servo sebagai mekanik untuk sensor TDS. Berikut adalah
hasil modul input yang sudah dibuat dapat dilihat pada Gambar 4.1.

Gambar 4. 1 Modul input sistem.

Kemudian untuk main board sendiri terdari PSU 12V, buck converter, ESP32, dan
berbagai connector untuk LCD, modul input, dan modul output. Berikut adalah
hasil main board yang sudah dirancang dapat dilihat pada Gambar 4.2.

72
Gambar 4. 2 Main board sistem.

Untuk modul output sendiri terdiri dari driver motor L298N dan relay. Berikut
adalah hasil modul output yang sudah dirancang dapat dilihat pada Gambar 4.3.

Gambar 4. 3 Modul output sistem.

73
4.1.2. Hasil Pengimplemantasian Perangkat Pada Plant
Berikut adalah penempatan modul input, main board, dan modul output pada plant
hidroponik.

Gambar 4. 4 Penempatan modul.

Gambar 4. 5 Plant hidroponik setelah pengimplementasian perangkat.

74
4.2. Hasil Pengujian Hardware
Pengujian perangkat mencakup pengujian sensor pH dan sensor TDS, penerimaan
data pada perangkat, pengujian jadwal pengontrolan, pengujian sistem secara close
loop, dan pengujian sistem dengan implementasi fuzzy logic.

4.2.1. Pengujian sensor dan kalibrasi


a) Kalibrasi Sensor TDS

Pada pengujian ini sensor-sensor yang digunakan akan dikalibrasi terlebih dahulu.
Kalibrasi dilakukan dengan membandingkan pembacaan sensor dengan alat ukur
yang dijadikan referensi. Alat ukur yang dijadikan referensi untuk kalibrasi sensor
TDS adalah TDS meter dan untuk kalibrasi sensor pH adalah pH meter. Berikut
adalah pembacaan analog TDS sensor dengan menggunakan persamaan sebelum
dilakukan adjustment dapat dilihat pada Tabel 4.1.
Tabel 4. 1 Hasil pengukuran pada saat kalibrasi.

persamaan
Larutan Error
No ADC Voltage bawaan
(ppm) (%)
hasil (ppm)
1 57 54 0.04 17 70,175
2 198 604 0.49 184 7,070
3 401 1071 0.86 314 21,695
4 496 1386 1.12 412 16,935
5 618 1607 1.29 484 21,682
6 844 1789 1.44 547 35,189
7 1100 1960 1.58 615 44,090
Error rata-rata 30,977

Nilai referensi yang digunakan merupakan larutan nutrisi yang sudah diukur dengan
TDS meter. Berdasarkan hasil pengukuran pada tabel nilai error yang dihasilkan
cukup besar sehingga pembacaan tidak akan akurat. Untuk persamaan bawaan yang

75
digunakan merupakan persamaan yang didapat pada website resmi dari dfrobot.
Berikut adalah persamaan yang digunakan.
𝑡𝑑𝑠 = ((133,42 × 𝑉𝑜𝑙𝑡𝑎𝑔𝑒 3 ) − (255,86 × 𝑉𝑜𝑙𝑡𝑎𝑔𝑒 2 ) + (857,39 × 𝑉𝑜𝑙𝑡𝑎𝑔𝑒)) × 0,5 (4.1)
Dikarenakan hasil error pengukuran yang cukup besar maka adjustment dilakukan
dengan membandingkan nilai referensi dengan tegangan yang terbaca oleh ESP32.
Berikut adalah perbandingan nilai referensi dengan tegangan yang terbaca dapat
dilihat pada Gambar 4.6.

Perbandingan tds dengan voltage


1200

1000

800
ppm

600

400

200

0
0 0,2 0,4 0,6 0,8 1 1,2 1,4 1,6 1,8
Voltage (V)

Gambar 4. 6 Grafik perbandingan nilai referensi dengan tegangan.

Berdasarkan grafik tersebut didapatkan persamaan polinomial orde ke-3 dan orde
ke-4. Berikut adalah persamaan polinomial orde ke-3 dan ke-4.
𝑦 = 504.41𝑥 3 − 821.86𝑥 2 + 711𝑥 + 22.652 (4.2)

𝑦 = 913.98𝑥 4 − 2556.2𝑥 3 + 2437𝑥 2 − 416.27𝑥 + 69.331 (4.3)

Variabel x merupakan besaran tegangan yang dihasilkan oleh analog TDS sensor
nantinya akan dibaca oleh ESP32. Persamaan yang didapatkan tersebut akan
diimplementasikan ke dalam program yang dibuat. Berikut adalah hasil dari
pengukuran TDS dengan menggunakan rumus polinomial orde ke-3 dan orde ke-4.

76
Tabel 4. 2 Hasil pengukuran dengan persamaan polinomial orde 3.

polinomial
Larutan Error
No. orde 3
(ppm) (%)
hasil (ppm)
1 57 52 8.771
2 198 231 16.666
3 401 348 13.216
4 496 494 0.403
5 618 654 5.825
6 844 832 1.421
7 1100 1052 4.363
Error rata-rata 7.237

Tabel 4. 3 Hasil pengukuran dengan persamaan polinomial orde 4.

polinomial
Larutan
No. orde 4 Error (%)
(ppm)
hasil (ppm)
1 57 57 0
2 198 197 0.505
3 401 393 1.995
4 496 508 2.419
5 618 635 2.750
6 844 816 3.317
7 1100 1097 0.272
Error rata-rata 1.608

77
Gambar 4. 7 Grafik perbandingan hasil kalibrasi pada analog TDS sensor.

Dari hasil yang didapat terlihat bahwa dengan mengimplementasikan persamaan


polinomial orde ke-4 pembacaan yang dihasilkan sangat baik dengan error rata-rata
adalah 1,608 % sedangkan pembacaan TDS dengan mengimplementasikan
persamaan polinomial orde ke-3 mempunyai error rata-rata sebesar 7,237 %.

b) Kalibrasi sensor pH

Pada kalibrasi sensor pH media yang digunakan adalah pH buffer 4,01 dan pH
buffer 6,86, pengujian hanya dilakukan dengan dua titik pengukuran dikarenakan
sensor pH merupakan sensor linear. Kalibrasi dilakukan dengan membandingkan
ADC yang dihasilkan dengan pH media yang digunakan, pada pengukuran pH
buffer 4,01 nilai ADC yang dihasilkan adalah 7 dan pengukuran pH buffer 6,86
nilai ADC yang dihasilkan pada serial monitor adalah 1152. Dengan menggunakan
persamaan linear maka persamaan pengukuran yang didapat adalah sebagai berikut.

𝑦 = 0,0025𝑥 + 3,9926 (4.4)

78
Dimana “y” merupakan pH yang terbaca dan “x” merupakan nilai ADC yang
terbaca. Dengan menggunakan persamaan 4.4 hasil perbandingan pembacaan
analog pH sensor setelah kalibrasi dan sebelum dikalibrasi dengan menggunakan
persamaan bawaan dapat dilihat pada Tabel 4.3.

Tabel 4. 4 Hasil pengukuran analog pH sensor setelah kalibrasi.

Sebelum Kalibrasi Setelah Kalibrasi


pH
Media Analog pH Analog pH
meter Error (%) Error (%)
sensor sensor
pH buffer
4,04 3,83 5.198% 4,05 0,247%
4,01
pH buffer
6,78 6,45 4.867% 6,81 0,442%
6,86
Air 7,10 6,77 4.647% 7,12 0,281%
Error rata- Error rata–
4,904% 0,323%
rata rata

Dari hasil yang didapat dengan menggunakan persamaan 4.4 hasil pengukuran pH
tidak berbeda jauh dengan nilai referensi dengan rata-rata error 0,323% sedangkan
pembacaan pH sebelum dilakukan kalibrasi memiliki rata-rata error 4,904%.

4.2.2. Pengujian kendali close loop dan fuzzy logic


Pengujian kendali close loop dan fuzzy logic dilakukan sebagai perbandingan
respon transien yang dihasilkan antara kendali dengan menggunakan metode close
loop dengan menggunakan fuzzy logic.
a) Kendali TDS
Pada pengujian kendali close loop TDS timer aktuator yang diatur adalah
konstan 2 detik dan nilai PWM yang diatur adalah konstan 255. Berikut adalah
hasil respon transien yang dihasilkan pada pengujian kendali close loop.

79
1200

1000

800
ppm

600

400

200

0
60
0
20
40

80
100
120
140
160
180
200
220
240
260
280
300
320
340
360
380
400
420
440
460
480
500
520
540
560
580
Time (s)

TDS actual Set Point

Gambar 4. 8 Respon transien kendali TDS close loop dengan set point 700.

Tabel 4. 5 Performasi kendali TDS close loop dengan set point 700.

Kendali TDS close loop set point 700


Time Delay 77,5 s
Rise Time 126,08 s
Peak Time 140 s
Settling Time -
Maximum Overshoot 28,70%

80
1600
1400
1200
1000
ppm

800
600
400
200
0

260

500
0
20
40
60
80
100
120
140
160
180
200
220
240

280
300
320
340
360
380
400
420
440
460
480

520
540
560
580
Time (s)

TDS actual Set Point

Gambar 4. 9 Respon transien kendali TDS close loop dengan set point 1000.

Tabel 4. 6 Performasi kendali TDS close loop dengan set point 1000.

Kendali TDS close loop set point 1000


Time Delay 64,04 s
Rise Time 85,29 s
Peak Time 120 s
Settling Time -
Maximum Overshoot 44,78%

81
1600

1400

1200

1000
ppm

800

600

400

200

260

500
0
20
40
60
80
100
120
140
160
180
200
220
240

280
300
320
340
360
380
400
420
440
460
480

520
540
560
580
Time (s)

TDS actual Set Point

Gambar 4. 10 Respon transien kendali close loop dengan set point 1300.

Tabel 4. 7 Performasi kendali TDS close loop dengan set point 1300.

Kendali TDS close loop set point 1300


Time Delay 98.12 s
Rise Time 120.73 s
Peak Time 170 s
Settling Time -
Maximum Overshoot 23,49%

82
Berikut adalah hasil respon transien dari kendali fuzzy logic untuk mengatur nilai
TDS.
1200

1000

800
ppm

600

400

200

0
60

300
0
20
40

80
100
120
140
160
180
200
220
240
260
280

320
340
360
380
400
420
440
460
480
500
520
540
560
580
Time (s)

TDS actual Set Point

Gambar 4. 11 Respon transien kendali TDS menggunakan fuzzy logic dengan set
point 700 ppm.

Tabel 4. 8 Performasi kendali TDS fuzzy logic dengan set point 700.

Kendali TDS fuzzy logic set point 700


Time Delay 60,33 s
Rise Time 101,5 s
Peak Time -
Settling Time 170 s
Maximum Overshoot -

83
1200

1000

800
ppm

600

400

200

0
60

300
0
20
40

80
100
120
140
160
180
200
220
240
260
280

320
340
360
380
400
420
440
460
480
500
520
540
560
580
Time (s)

TDS actual Set Point

Gambar 4. 12 Respon transien kendali TDS menggunakan fuzzy logic dengan set
point 1000 ppm.

Tabel 4. 9 Performasi kendali TDS fuzzy logic dengan set point 1000.

Kendali TDS fuzzy logic set point 1000


Time Delay 72,48 s
Rise Time 87,05 s
Peak Time -
Settling Time 190 s
Maximum Overshoot -

84
1600

1400

1200

1000

800

600

400

200

440
460
0
20
40
60
80
100
120
140
160
180
200
220
240
260
280
300
320
340
360
380
400
420

480
500
520
540
560
580
Series1 Series2

Gambar 4. 13 Respon transien kendali TDS menggunakan fuzzy logic dengan set
point 1300 ppm.

Tabel 4. 10 Performasi kendali TDS fuzzy logic dengan set point 1300.

Kendali TDS fuzzy logic set point 1300


Time Delay 120 s
Rise Time 128,26 s
Peak Time -
Settling Time 200 s
Maximum Overshoot -

Pada pengendalian TDS menggunakan metode close loop tanpa implementasi


fuzzy logic, hasil respon transien sistem menunjukan nilai yang sangat fluktuatif
dikarenakan ketika nilai pembacaan TDS di bawah set point sinyal PWM yang
diberikan ke diaphragm pump konstan 255 dan timer yang diatur konstan 2 detik
hal ini menyebabkan volume larutan nutrisi yang diberikan ke tandon nutrisi
cukup banyak sehingga nilai TDS akan naik secara signifikan. Penyebab lainnya
adalah perbandingan larutan nutrisi dengan air, dimana dengan menambahkan
sedikit larutan nutrisi ke dalam air akan menaikan nilai TDS cukup tinggi,

85
sebaliknya untuk menurunkan nilai TDS pada tandon nutrisi diperlukan volume
air yang cukup banyak. Seperti yang ditunjukan pada Gambar 4.7 penurunan
nilai TDS relatif lebih lambat sedangkan untuk menaikan nilai TDS relatif lebih
cepat.

Pada pengendalian TDS dengan mengimplementasikan fuzzy logic hasil respon


transien sistem cukup baik, dimana nilai TDS dapat dipertahankan berada
didekat set point hal ini dikarenakan sinyal PWM dan timer yang diberikan ke
diaphragm pump adaptif tergantung sinyal error, delta error, membership
function input, konstanta output, dan rules base yang dibuat, sehingga volume
larutan nutrisi yang dialirkan akan semakin sedikit jika mendekati nilai set point.

Jika dibandingkan antara pengendalian nilai TDS menggunakan close loop


dengan fuzzy logic performa yang dihasilkan lebih baik menggunakan kendali
fuzzy logic dapat dilihat pada Gambar 4.12 dengan set point 700 ppm kendali
fuzzy logic sangat baik dalam mempertahankan nilai TDS dengan error steady
state sekitar 7%, kemudian delay time dan rise time yang didapat lebih cepat
dibandingkan kendali close loop. Begitu pun pada percobaan dengan set point
1000 ppm hasil respon transien sistem dengan menggunakan fuzzy logic pada
Gambar 4.13 memperlihatkan pengendalian fuzzy logic dapat mempertahankan
nilai TDS dengan error steady state sekitar 8%. Akan tetapi delay time dan rise
time yang dihasilkan sedikit lebih lambat jika dibandingan dengan kendali close
loop, dimana delay time pada kendali fuzzy logic 72.48 detik sedangkan kendali
close loop 64.04 detik, kemudian untuk rise time pada kendali fuzzy logic 87.05
detik sedangkan pada kendali close loop 85.29 detik. Pada percobaan dengan set
point 1300 ppm kendali close loop menunjukan delay time dan rise time yang
lebih cepat dibandingkan menggunakan kendali fuzzy logic. Pada kendali fuzzy
logic delay time yang dihasilkan 120 detik sedangkan kendali close loop lebih
cepat dengan waktu 98.12 detik. Kemudian rise time yang dihasilkan kendali
fuzzy logic adalah 128.26 detik sedangkan kendali close loop 120.73 detik. Akan
tetapi pada pengendalian close loop terdapat overshoot sebesar 23.49%.

86
Dengan demikian pada percobaan pengendalian nilai TDS dengan set point 700
ppm kendali fuzzy logic lebih unggul jika dilihat delay time, rise time, dan
stabilitas dalam mempertahankan nilai TDS mendekati set point. Pada percobaan
pengendalian nilai TDS dengan set point 1000 ppm dan 1300 ppm kendali close
loop lebih unggul dalam jika dilihat dari delay time dan rise time, akan tetapi
nilai TDS yang dihasilkan cenderung sangat fluktuatif sehingga larutan nutrisi
menjadi lebih boros.

b) Kendali pH
Pada pengujian kendali close loop pH, timer aktuator yang diatur adalah konstan
5 detik dengan nilai PWM konstan 255. Pengujian kendali close loop pH
dilakukan dengan menaikan dan menurunkan nilai pH. Berikut adalah hasil
respon transien kendali close loop pH.
6

5,8

5,6
pH

5,4

5,2

4,8
0 60 120 180 240 300 360 420 480 540 600 660 720 780 840 900 960 1020
Time (s)

pH actual Set Point

Gambar 4. 14 Respon transien kendali pH naik metode close loop dengan set
point 5,5.

87
Tabel 4. 11 Performasi kendali pH naik close loop dengan set point 5,5.

Kendali pH naik close loop set point 5,5


Time Delay 240 s
Rise Time 260 s
Peak Time 360
Settling Time -
Maximum Overshoot 30.6 %

5,8

5,6

5,4

5,2

4,8
0 60 120 180 240 300 360 420 480 540 600 660 720 780 840 900 960 1020

pH actual Set Point

Gambar 4. 15 Respon transien kendali pH turun metode close loop dengan set
point 5,0.

Tabel 4. 12 Performasi kendali pH turun close loop dengan set point 5,0.

Kendali pH turun close loop set point 5,0


Time Delay 240 s
Rise Time 390 s
Peak Time 570 s
Settling Time -
Maximum Overshoot 6%

88
Berikut adalah hasil respon transien dari kendali fuzzy logic untuk mengatur nilai
pH naik dapat dilihat pada Gambar 4.15, Gambar 4.16, dan Gambar 4.17.
6
5,9
5,8
5,7
5,6
5,5
pH

5,4
5,3
5,2
5,1
5
4,9
4,8

660
0

60

120

180

240

300

360

420

480

540

600

720

780

840

900

960

1020
Time (s)

pH actual Set Point

Gambar 4. 16 Respon transien kendali pH naik menggunakan fuzzy logic dengan


set point 5,5.

Tabel 4. 13 Performasi kendali pH naik fuzzy logic dengan set point 5,5.

Kendali pH naik fuzzy logic set point 5,5


Time Delay 180 s
Rise Time 510 s
Peak Time -
Settling Time 660 s
Maximum Overshoot -

89
6,4
6,2
6
5,8
pH

5,6
5,4
5,2
5
4,8
60

600
0

120

180

240

300

360

420

480

540

660

720

780

840

900

960

1020
Time (s)

pH actual Set Point

Gambar 4. 17 Respon transien kendali pH naik menggunakan fuzzy logic dengan


set point 6,0.

Tabel 4. 14 Performasi kendali pH naik fuzzy logic dengan set point 6,0.

Kendali pH naik fuzzy logic set point 6,0


Time Delay 315 s
Rise Time 540 s
Peak Time -
Settling Time 690 s
Maximum Overshoot -

90
6,8
6,6
6,4
6,2
6
pH

5,8
5,6
5,4
5,2
5
4,8
0 60 120 180 240 300 360 420 480 540 600 660 720 780 840 900 960 1020
Time (s)

pH actual Set Point

Gambar 4. 18 Respon transien kendali pH naik menggunakan fuzzy logic dengan


set point 6,5.

Tabel 4. 15 Performasi kendali pH naik fuzzy logic dengan set point 6,5.

Kendali pH naik fuzzy logic set point 6,5


Time Delay 440 s
Rise Time 652.6 s
Peak Time -
Settling Time 840 s
Maximum Overshoot -

91
5,6
5,5
5,4
5,3
5,2
5,1
5
4,9
4,8
4,7

900
0

60

120

180

240

300

360

420

480

540

600

660

720

780

840

960

1020
pH actual Set Point

Gambar 4. 19 Respon transien kendali pH turun menggunakan fuzzy logic dengan


nilai awal 5,5 dan set point 5,0.

Tabel 4. 16 Performasi kendali pH turun fuzzy logic dengan nilai awal 5,5 dan set
point 5,0..

Kendali pH turun fuzzy logic set point 5,0


Time Delay 440 s
Rise Time -
Peak Time -
Settling Time -
Maximum Overshoot -

92
6,4

6,2

5,8

5,6

5,4

5,2

4,8

900
0

60

120

180

240

300

360

420

480

540

600

660

720

780

840

960

1020
pH actual Set Point

Gambar 4. 20 Respon transien kendali pH turun menggunakan fuzzy logic dengan


nilai awal 6,0 dan set point 5,0.

Tabel 4. 17 Performasi kendali pH turun fuzzy logic dengan nilai awal 6,0 dan set
point 5,0.

Kendali pH turun fuzzy logic set point 5,0


Time Delay 570 s
Rise Time -
Peak Time -
Settling Time -
Maximum Overshoot -

Pada pengendalian nilai pH naik menggunakan kendali close loop, respon


transien sistem yang dihasilkan menunjukan nilai yang berosilasi terus menerus
seperti pada Gambar 4.10, hal ini disebabkan karena sinyal kendali PWM dan
timer yang diatur adalah konstan dengan nilai PWM 255 dan timer 5 detik. Jika
dibandingkan dengan kendali fuzzy logic hasil respon transien sistem seperti
pada Gambar 4.15 menunjukan respon yang sangat baik dimana nilai pH dapat
mendekati set point tanpa adanya overshoot, dikarenakan volume larutan pH
naik yang dialirkan ke dalam tandon nutrisi tergantung dari sinyal error dan

93
delta error sehingga volume larutan pH naik yang dialirkan akan semakin sedikit
jika nilai aktual mendekati nilai set point. Jika dilihat dari performasi antara
kendali close loop dan fuzzy logic pada percobaan pH naik dengan nilai pH awal
5,0 dan set point 5,5. Delay time pada kendali fuzzy logic lebih cepat dengan
waktu 180 detik sedangkan pada kendali close loop delay time yang dihasilkan
adalah 240 detik. Akan tetapi pada kendali close loop rise time yang dihasilkan
lebih cepat dibandingkan kendali fuzzy logic, dimana pada kendali close loop
rise time yang dihasilkan adalah 260.2 detik sedangkan pada kendali fuzzy logic
adalah 510 detik.

Pada pecobaan kendali pH naik dengan menggunakan fuzzy logic pada set point
6,0 dan 6,5 seperti pada Gambar 4.16 dan 4.17. Berdasarkan hasil respon transien
dengan mengimplementasikan kendali fuzzy logic nilai pH dapat mendekati set
point tanpa adanya overshoot dengan error steady state dibawah 5%, akan tetapi
respon yang dihasilkan cukup lambat dikarenakan sampling time yang dilakukan
adalah 30 detik agar larutan pH dapat terlebih dahulu terlarut merata pada tandon
nutrisi.

Kemudian pada percobaan pH turun dengan menggunakan fuzzy logic hasil


respon transien menunjukan nilai pH yang dikendalikan tidak dapat mendekati
set point sedangkan pada kendali close loop nilai pH dapat mencapai set point.
Adapun hal yang menyebabkan nilai pH tidak dapat mendekati set point pada
kendali fuzzy logic adalah aturan yang dibuat masih belum tepat dan waktu
pengendalian yang dibutuhkan harus lebih lama. Pada percobaan pengendalian
pH turun kendali close loop lebih unggul jika dibandingkan fuzzy logic.

4.3. Pengujian Software


Hasil pengujian software mencakup pengujian proses koneksi WiFi dan MQTT,
Pengujian akses dashboard yang telah dibuat menggunakan desktop atau
smartphone, dan pengujian pengiriman data yang telah dirancang.

94
4.3.1. Pengujian Proses Koneksi WiFi dan MQTT
Pada pengujian WiFi dan MQTT, SSID dan password sudah diatur di dalam
program yang dibuat, proses koneksi WiFi akan ditampilkan pada LCD. Berikut
adalah proses koneksi perangkat dengan WiFi.

Gambar 4. 21 Proses koneksi perangkat dengan WiFi.

Perangkat akan mencoba menghubungkan dengan WiFi yang sudah tersedia


sebanyak 40 kali, ketika proses koneksi gagal dan perangkat sudah mencoba
menghubungkan sebanyak 40 kali maka perangkat akan menampilkan “connecting
fail” dan melakukan restart, kemudian masuk kembali ke proses koneksi. Berikut
adalah tampilan perangkat jika proses koneksi gagal dapat dilihat pada Gambar
4.21.

Gambar 4. 22 Tampilan LCD jika proses koneksi gagal.

95
Jika proses koneksi WiFi dan MQTT berhasil maka perangkat akan menampilkan
waktu saat ini dan nilai timer 1 yang diatur. Pada proses koneksi MQTT tidak
ditampilkan pada LCD, jika proses koneksi WiFi berhasil tetapi proses koneksi
MQTT gagal, maka tampilan akan tetap “connecting” hingga perangkat berhasil
terhubung dengan MQTT broker. Berikut adalah tampilan ketika perangkat sudah
terhubung dengan WiFi dan MQTT broker.

Gambar 4. 23 Tampilan jika proses koneksi berhasil.

4.3.2. Pengujian Akses Dashboard


Untuk membuka dashboard yang sudah dibuat dilakukan dengan mengakses
melalui IP Public dari server. Pada pengujian kali ini IP Puclic yang digunakan
adalah 68.183.184.227 dengan port 1880 untuk mengakses Node-Red. Kemudian
untuk mengakses dashboard Node-Red hanya tinggal membuka
http://68.183.184.227:1880/ui/. Berdasarkan hasil pengujian dashboard sudah
dapat diakses melalui desktop maupun smartphone secara remote. Berikut adalah
hasil tampilan dashboard jika diakses melalui desktop dan smartphone.

96
Gambar 4. 24 Tampilan dashboard jika diakses melalui dekstop.

Gambar 4. 25 Tampilan dashboard jika diakses melalui smartphone.

97
4.3.3. Pengujian Waktu
Pada pengujian waktu, waktu yang ada perangkat akan dibandingkan dengan waktu
yang sebenarnya untuk menguji keakuratan waktu yang tampilkan pada perangkat
menggunakan NTP server pengujian dilakukan dengan membandingkan waktu
yang ditampilkan pada perangkat dengan waktu yang ditampilkan pada smartphone
berdasarkan hasil pengamatan dengan menggunakan NTP server, waktu yang
ditampilkan pada perangkat sama dengan waktu yang ditampilkan pada smartphone
berikut adalah hasil pengujian waktu.

Gambar 4. 26 Hasil pengujian waktu perangkat dengan waktu pada smartphone.

4.3.4. Pengujian Pengiriman Data


Pengujian pengiriman data dilakukan melalui smartphone dengan mengakses
dashboard Node-Red kemudian data timer 1, data timer 2, data timer 3, dan data set
point dikirimkan ke perangkat melalui MQTT Broker. Berdasarkan hasil pengujian
data-data yang dikirimkan dapat diterima perangkat dan ditampilkan pada LCD.
Berikut adalah hasil dari pengujian pengiriman data.

98
Gambar 4. 27 Pengiriman data timer 1 melalui dashboard.

Gambar 4. 28 Data timer 1 ditampilkan pada LCD.

Gambar 4. 29 Tampilan serial monitor ketika data timer 1 diterima.

99
Gambar 4. 30 Pengiriman data timer 2 melalui dashboard.

Gambar 4. 31 Data timer 2 ditampilkan pada LCD.

Gambar 4. 32 Tampilan serial monitor ketika data timer 2 diterima.

100
Gambar 4. 33 Pengiriman data timer 3 melalui dashboard.

Gambar 4. 34 Data timer 3 ditampilkan pada LCD.

Gambar 4. 35 Tampilan serial monitor ketika data timer 3 diterima.

101
Gambar 4. 36 Pengiriman data set point melalui dashboard.

Gambar 4. 37 Data set point ditampilkan pada LCD.

Gambar 4. 38 Tampilan serial monitor ketika data set point diterima.

102
4.3.5. Pengujian Penyimpanan Database
Pada pengujian database hasil pengukuran TDS dan pH disimpan pada database
yang sudah dibuat. Untuk pengukuran TDS nilai disimpan pada tabel pengukuran
TDS dan untuk pengukuran pH nilai disimpan pada tabel pengukuran pH.
Kemudian data yang berada pada database diambil kembali untuk dimunculkan
pada dashboard Node-Red. Berdasarkan hasil pengujian data hasil pengukuran
dapat disimpan dengan baik dan dimunculkan pada dashboard Node-Red. Berikut
adalah hasil penyimpanan pada database.

Gambar 4. 39 Isi tabel pengukuran TDS pada database.

103
Gambar 4. 40 Isi tabel pengukuran pH pada database.

Gambar 4. 41 Tampilan tabel pengukuran pada dashboard Node-Red.

104
4.4. Pengujian Sistem Selama 4 Hari
Pengujian ini dilakukan untuk melihat nilai TDS dan pH selama 4 hari
pengimplementasian perangkat. Untuk penjadwalan pemberian nilai TDS dan pH
dilakukan pada jam 9 pagi dengan mengatur jadwal pada Node-Red. Berikut adalah
hasil nilai TDS dan pH selama 4 hari pengimplementasian perangkat.
Tabel 4. 18 Pengendalian nilai TDS selama 4 hari.

Hari Set Tanggal Jam Nilai TDS Jam Nilai Tds


Point pada awal setelah
(ppm) pengendalian pengendalian
1 700 19/7/2022 10:28 254 10:43 701
2 800 20/7/2022 09:00 945 09:11 767
3 800 21/7/2022 09:00 480 09:10 773
4 800 22/7/2022 09:00 852 09:04 804

Tabel 4. 19 Pengendalian nilai pH selama 4 hari.

Hari Set Tanggal Jam Nilai pH Jam Nilai pH


Point pada awal setelah
pengendalian pengendalian
1 6,5 19/7/2022 10:43 5,63 10:51 6,59
2 6,5 20/7/2022 09:11 7,15 09:21 6,51
3 6,5 21/7/2022 09:10 6,73 09:14 6,47
4 6,5 22/7/2022 09:04 7,1 09:11 6,43

Hasil pengujian pengedalian dapat berjalan sesuai dengan jadwal yang telah diatur,
pada hari pertama sistem dijalankan tanpa penjadwalan untuk mengendalikan
larutan nutrisi pada tandon yang masih berisi air baku, sehingga pengendalian
dilakukan tanpa penjadwalan pada hari berikutnya pengendalian dijadwalkan pada
jam 9 pagi, nilai TDS pada awal pengukuran menunjukan peningkatan yaitu 945
ppm kemudian setelah selesai pengendalian nilai TDS turun menjadi 767 ppm, pada
kendali pH nilai awal menunjukan 7,15 dimana nilai ini cukup jauh dari set point

105
yang telah ditentukan, setelah pengendalian pH selesai nilai pH yang didapat adalah
6,51. Pada hari ke 3 nilai TDS pada awal pengendalian turun menjadi 480 ppm
setelah selesai pengendalian nilai TDS menunjukan 773 ppm, kemudian pada
pengendalian pH nilai awal menunjukan 6,73 setelah selesai pengendalian nilai pH
turun menjadi 6,47. Pada hari ke 4 nilai TDS pada awal pengendalian menunjukan
854 ppm dimana selisihnya tidak terlalu jauh dengan set point sehingga waktu
pengendalian cenderung lebih cepat. Nilai akhir TDS yang didapatkan adalah 804.
Kemudian pada pengendalian pH nilai awal menunjukan kenaikan yaitu 7,1 setelah
selesai pengendalian nilai pH yang didapat adalah 6,43. Setelah dilakukannya
pengujian selama 4 hari, sistem pengendalian yang telah dirancang menunjukan
hasil yang baik dan dapat bekerja sesuai dengan jadwal yang telah diatur, hasil
pengendalian dapat mendekati nilai set point yang diatur.

106
BAB V KESIMPULAN DAN SARAN

5.1. Kesimpulan
Berdasarkan hasil pengujian yang telah dilakukan dapat diambil kesimpulan
sebagai berikut :
1. Perancangan pada sistem ini menggunakan dua sensor yaitu sensor analog
TDS sensor SEN0224 dan analog pH sensor SEN0161. Berdasarkan hasil
pengujian sensor TDS penggunaan persamaan polinomial orde-4 pada
kalibrasi analog TDS sensor SEN0244 dapat memberikan pembacaan yang
lebih baik dibandingkan menggunakan persamaan polinomial orde-3 dan
persamaan bawaan dari sensor dengan rata-rata error 1,608%. Pada
pengujian analog pH sensor SEN0161 setelah dilakukan kalibrasi memiliki
rata-rata error sebesar 0,323%.
2. Proses penjadwalan dalam mengendalikan nilai TDS dan pH dapat bekerja
sesuai dengan waktu yang ditentukan, serta dengan pengimplementasian IoT
memudahkan pemantauan nilai TDS dan pH ketika proses pengendalian
berlangsung.
3. Sistem kendali fuzzy logic yang telah dirancang dengan menggunakan 25
aturan dapat mengendalikan nilai TDS dan pH larutan nutrisi untuk mencapai
set point. Hasil respon transien pada pengendalian nilai TDS larutan nutrisi
memiliki delay time dan rise time sedikit lebih lambat jika dibandingkan
kendali close loop dengan error steady state dibawah 8%. Sedangkan hasil
respon transien pada pengendalian nilai pH naik larutan nutrisi menghasilkan
respon transien tanpa adanya overshoot, dan delay time yang dihasilkan lebih
cepat dibandingkan dengan menggunakan kendali close loop. Akan tetapi rise
time pada kendali fuzzy logic lebih lambat jika dibandingkan dengan
menggunakan kendali close loop dengan error steady state dibawah 5%.
4. Penggunaan protokol MQTT sebagai komunikasi antara ESP32 dengan
Node-Red telah diuji dan telah bekerja dengan baik. Pengiriman data timer,
data force on, data set point dari Node-Red dapat diterima oleh ESP32, begitu
pula sebaliknya pengiriman data pembacaan nilai TDS dan pH dari ESP32

107
dapat diterima oleh Node-Red dan berhasil ditampilkan pada dashboard
kemudian disimpan pada database SQLite.

5.2. Saran
Dalam perancangan sistem akuisisi data untuk nutrient analyst hidroponik berbasis
fuzzy logic dan Node-Red, terdapat beberapa saran untuk pengembangan dari
peneliatian ini, diantaranya :
1. Perancangan fuzzy logic diubah menggunakan tipe fuzzy logic yang lain
seperti tipe mamdani.
2. Penambahan parameter suhu air pada larutan nutrisi, agar dapat menghitung
temperature compensation guna mendapatkan pembacaan nilai TDS dan pH
yang akurat.
3. Penambahan mekanisme gateway dalam menghimpun data sebelum
dikirimkan ke database pada server.

108
DAFTAR PUSTAKA

[1] S. T. Cortes et al., “Assesing Problem And Prospects Of Urban Agriculture


In Cebu City , Philippines : Towards Developing Action Plans
Corresponding author : sylvester.cortes@ctu.edu.ph More than half of the
global population is now residing in urban areas because their huma,” vol. 7,
no. 1, pp. 264–291, 2022.
[2] U. Kelompok, T. Di, and J. Dan, “Pelatihan Sistem Otomasi Pertanian
Hidroponik Untuk Kelompok Tani di Jatinangor dan Cimahi Dalam Rangka
Pemulihan Ekonomi,” vol. 5, pp. 507–514, 2022.
[3] P. B. Menjadi et al., “Pelatihan Bangga Menjadi Petani Hidroponik Pada
Komunitas Pemuda Di Desa Cigugur Girang Kabupaten Bandung Barat.”
[4] Herman and N. Surantha, “Intelligent Monitoring And Controlling System
For Hydroponics Precision Agriculture,” 2019 7th Int. Conf. Inf. Commun.
Technol. ICoICT 2019, no. July 2019, 2019, doi:
10.1109/ICoICT.2019.8835377.
[5] F. Suryatini, S. Pancono, S. B. Bhaskoro, and P. M. S. Muljono, “Sistem
Kendali Nutrisi Hidroponik berbasis Fuzzy Logic berdasarkan Objek
Tanam,” ELKOMIKA J. Tek. Energi Elektr. Tek. Telekomun. Tek. Elektron.,
vol. 9, no. 2, p. 263, 2021, doi: 10.26760/elkomika.v9i2.263.
[6] E. K. Tan, Y. W. Chong, M. Niswar, B. Y. Ooi, and A. Basuki, “An IoT
Platform for Urban Farming,” Proc. - 2020 Int. Semin. Intell. Technol. Its
Appl. Humanification Reliab. Intell. Syst. ISITIA 2020, pp. 51–55, 2020, doi:
10.1109/ISITIA49792.2020.9163781.
[7] K. Kularbphettong, U. Ampant, and N. Kongrodj, “An Automated
Hydroponics System Based on Mobile Application,” Int. J. Inf. Educ.
Technol., vol. 9, no. 8, pp. 548–552, 2019, doi: 10.18178/ijiet.2019.9.8.1264.
[8] F. F. Dzikriansyah, R. Hudaya, and C. W. Nurhaeti, “Sistem Kendali
Berbasis PID untuk Nutrisi Tanaman Hidroponik,” Ind. Res. Work. Natl.
Semin., pp. 621–626, 2017, [Online]. Available: http://irwns.polban.ac.id/.
[9] R. Novianto Prabowo and A. Qurthobi, “Perancangan Kontrol Kadar

109
Keasaman Menggunakan Hybrid Fuzzy PID Pada Sistem Hidroponik Untuk
Pertumbuhan Tomat”
[10] A. N. Sholihah, A. R. Al Tahtawi, and S. W. Jadmiko, “Sistem Kendali TDS
untuk Nutrisi Hidroponik Deep Flow Technique (Annisa Nurul Sholihah,
Adnan Rafi Al Tahtawi, Sarjono Wahyu Jadmiko : 1-5) Sistem Kendali TDS
untuk Nutrisi Hidroponik Deep Flow Technique Menggunakan Fuzzy Logic
(TDS Control System for Hyd,” J. Electr. Eng. Inf. Technol., vol. 19, pp. 1–
5, 2021.
[11] D. Pancawati and A. Yulianto, “Implementasi Fuzzy Logic Controller untuk
Mengatur Ph Nutrisi pada Sistem Hidroponik Nutrient Film Technique
(NFT),” J. Nas. Tek. ELEKTRO, vol. 5, no. 2, Jul. 2016, doi:
10.20449/jnte.v5i2.284.
[12] D. R. Susilawati and M. Si, Dasar-Dasar Bertatanam Secara Hidroponik.
[13] R. Zamora, H. Harmadi, and W. Wildian, “Perancangan Alat Ukur Tds
(Total Dissolved Solid) Air Dengan Sensor Konduktivitas Secara Real
Time,” Sainstek J. Sains dan Teknol., vol. 7, no. 1, p. 11, 2016, doi:
10.31958/js.v7i1.120.
[14] A. Harvyandha et al., “Telemetri Pengukuran Derajat Keasaman Secara
Realtime Menggunakan Raspberry pi 1 ,2,3,” J. Jartel, vol. 9, no. 4, pp. 519–
524, 2019.
[15] B. WN, “Tabel PPM dan pH Nutrisi Hidroponik,” 2016.
http://hidroponikpedia.com/tabel-ppm-dan-ph-nutrisi-hidroponik/ (accessed
Jun. 29, 2022).
[16] V. Ayudyana and Asrizal, “Rancang Bangun Sistem Pengontrolan pH
Larutan Untuk Mahasiswa Fisika , FMIPA Universitas Negeri Padang Staf
Pengajar Jurusan Fisika , FMIPA Universitas Negeri Padang,” Pillar of
PhysicsPhysics, vol. 12, pp. 53–60, 2019.
[17] S. A. Pohan and O. Oktoyournal, “Pengaruh Konsentrasi Nutrisi A-B Mix
Terhadap Pertumbuhan Caisim Secara Hidroponik (Drip system),”
Lumbung, vol. 18, no. 1, pp. 20–32, 2019, doi:
10.32530/lumbung.v18i1.179.

110
[18] A. Munandar, “Sistem Pengereman Otomatis Menggunakan Logika Fuzzy
Berbasis Mikrokontroler,” Univ. Komput. Indones., vol. 4, no. 1, p. 17, 2016.
[19] D. L. Rahakbauw, “Penerapan Logika Fuzzy Metode Sugeno Untuk
Menentukan Jumlah Produksi Roti Berdasarkan Data Persediaan Dan
Jumlah Permintaan,” BAREKENG J. Ilmu Mat. dan Terap., vol. 9, no. 2, pp.
121–134, 2015, doi: 10.30598/barekengvol9iss2pp121-134.
[20] Achmad Fiqhi Ibadillah and R. Alfita, Mikrokontroler dan Aplikasinya,
Cetakan 1. Malang: Media Nusa Creative, 2017.
[21] E. A. Prastyo, “Arsitektur dan Fitur ESP32,” 2019.
https://www.edukasielektronika.com/2019/07/arsitektur-dan-fitur-esp32-
module-esp32.html (accessed Jun. 28, 2022).
[22] Last Minute Engineers, “ESP32 Pinout Reference,”
Https://Lastminuteengineers.Com/Esp32-Pinout-Reference/, 2022. ESP32
Pinout Reference (accessed Jun. 30, 2022).
[23] Anonim, “SEN0161 PH meter.”
https://wiki.dfrobot.com/PH_meter_SKU__SEN0161_]. (accessed Jun. 30,
2022).
[24] Anonim, “SEN0244 Gravity Analog TDS Sensor Meter For Arduino.”
https://wiki.dfrobot.com/Gravity__Analog_TDS_Sensor___Meter_For_Ar
duino_SKU__SEN0244 (accessed Jun. 30, 2022).
[25] I. R. Muttaqin and D. B. Santoso, “Prototype Pagar Otomatis Berbasis
Arduino Uno Dengan Sensor Ultrasonic Hc-SR04,” JE-Unisla, vol. 6, no. 2,
p. 41, 2021, doi: 10.30736/je-unisla.v6i2.695.
[26] D. Kho, “Pengertian dan Fungsi Relay.”
https://teknikelektronika.com/pengertian-relay-fungsi-relay/ (accessed Jun.
30, 2022).
[27] A. I. Salim, Y. Saragih, and R. Hidayat, “Implementasi Motor Servo SG 90
Sebagai Penggerak Mekanik Pada E. I. Helper (ELECTRONICS
INTEGRATION HELMET WIPER),” Electro Luceat, vol. 6, no. 2, pp. 236–
244, 2020, doi: 10.32531/jelekn.v6i2.256.
[28] A. Daniarsyah, “Mengenal Diaphragm Pump,” 2021.

111
https://wira.co.id/diaphragm-pump-adalah/ (accessed Jun. 30, 2022).
[29] M. Riza, Rancang Bangun Pompa Peristaltik Dengan Mekanisme
Penggerak Manual. 2017.
[30] Y. Efendi, “Internet Of Things (Iot) Sistem Pengendalian Lampu
Menggunakan Raspberry Pi Berbasis Mobile,” J. Ilm. Ilmu Komput., vol. 4,
no. 2, pp. 21–27, 2018, doi: 10.35329/jiik.v4i2.41.
[31] D. I. Saputra, G. M. Karmel, and Y. B. Zainal, “Perancangan Dan
Implementasi Rapid Temperature Screening Contactless Dan Jumlah Orang
Berbasis Iot Dengan Protokol Mqtt,” J. Energy Electr. Eng., vol. 2, no. 1, pp.
20–30, 2020, doi: 10.37058/jeee.v2i1.2147.
[32] S. Mulyono, M. Qomaruddin, and M. Anwar, “Penggunaan Node-RED pada
Sistem Monitoring dan Kontrol Green House berbasis Protokol MQTT,” J.
Transistor Elektro dan Inform. (TRANSISTOR EI, vol. 3, no. 1, pp. 31–44,
2018.
[33] Y. Herdiana, “Aplikasi Rumus Matematika Sma Berbasis Mobile,” J. Ilm.
Komput. dan Inform. ( KOMPUTA ), p. 8, 2014.
[34] S. T. Bhosale, T. Patil, and P. Patil, “SQLite: Light Database System,” Int.
J. Comput. Sci. Mob. Comput., vol. 44, no. 4, pp. 882–885, 2015.

112
LAMPIRAN A
PERTUMBUHAN TANAMAN

Gambar A. 1 Pertumbuhan tanaman hari ke-1.

Gambar A. 2 Pertumbuhan tanaman hari ke-20.

A-1
LAMPIRAN B
KALIBRASI SENSOR

Gambar B. 1 Kalibrasi sensor TDS.

Gambar B. 2 Hasil pengukuran TDS meter.

Gambar B. 3 Hasil pengukuran pH meter.

B-1
LAMPIRAN C
CODING ESP32

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <analogWrite.h>

#include <WiFi.h>
#include <ArduinoJson.h>
#include <Servo.h>
#include <millisDelay.h>

#include <PubSubClient.h>
#include <WiFiUdp.h>
#include <NTPClient.h>

#include <EEPROM.h>

#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <AsyncElegantOTA.h>

#include "MegunoLink.h"
#include "Filter.h"

#define PROG_NAME "OTA Test"


#define PROG_VERSION "1.0"
#define BAUD 115200

void serial_setup() {
Serial.begin(BAUD);

C-1
Serial.print("Prog Name :");
Serial.print(PROG_NAME);
Serial.println();
Serial.print("Prog Ver :");
Serial.print(PROG_VERSION);
Serial.println();
}

void eeprom_setup() {
EEPROM.begin(512);
}

void EEPROM_put(int Address, String Data) {


int size_data = Data.length();
int i;
for (i = 0; i < size_data; i++) {
EEPROM.write(Address + i, Data[i]);
}
EEPROM.write(Address + size_data, '\0');
EEPROM.commit();
}

String EEPROM_get(int Address) {


char Data[100];
int len = 0;
unsigned char k;
k = EEPROM.read(Address);
while (k != '\0' && len < 100) {
k = EEPROM.read(Address + len);
Data[len] = k;
len++;

C-2
}
Data[len] = '\0';
return String(Data);
}

void EEPROM_put_float(int address, float Data) {


EEPROM.writeFloat(address, Data);
EEPROM.commit();
}

float EEPROM_get_float(int address) {


float float_data;
float_data = EEPROM.readFloat(address);

return float_data;
}

#define tds_servo_pin 19

Servo ArmServo;

void servo_setup(int pin_servo_tds) {


ArmServo.attach(pin_servo_tds);
ArmServo.write(90);

delay(500);
}

void servo_control(int pin_servo, int degree) {


ArmServo.attach(pin_servo);
ArmServo.write(degree);

C-3
}

void set_motor(int Switch, int pwmVal, int pwm, int in) {


analogWrite(pwm, pwmVal);
if (Switch == 1) {
digitalWrite(in, HIGH);
} else {
digitalWrite(in, LOW);
}
}

#define tds_sensor_pin 35

int adc_value_tds;
float voltage_tds;
int tds_value;

float tds_value_func() {
adc_value_tds = analogRead(tds_sensor_pin);
voltage_tds = (adc_value_tds * 3.3) / 4096.0;
int val_tds = (913.98 * pow(voltage_tds, 4)) - (2556.2 * pow(voltage_tds, 3)) +
(2437 * pow(voltage_tds, 2)) - (416.26 * voltage_tds) + (70.0);

return val_tds;
}

void tds_sensor_setup() {
pinMode(tds_sensor_pin, INPUT);
}

void tds_read() {

C-4
tds_value = tds_value_func();
}

#define ph_sensor_pin 34

// variable for sampling ph


int adc_value_ph;
int adc_value_ph_temp = 0;
int buffer_index_adc = 0;
int avg_adc_ph;
float ph_value_sampler;

// variable for average ph value


float ph_value;
float avg_ph_temp = 0;
int buffer_index_ph = 0;

// variable for millis delay


unsigned long time_adc_ph_sampling = 0;
unsigned long time_ph_sampling = 0;

void ph_sensor_setup() {
pinMode(ph_sensor_pin, INPUT);
}

void ph_filter() {
if ((millis() - time_adc_ph_sampling) >= 50U) {
time_adc_ph_sampling = millis();
adc_value_ph = analogRead(ph_sensor_pin);
adc_value_ph_temp = adc_value_ph + adc_value_ph_temp;

C-5
buffer_index_adc++;
}

if ((millis() - time_ph_sampling) >= 1000U) {


time_ph_sampling = millis();
avg_adc_ph = (adc_value_ph_temp / buffer_index_adc);
ph_value_sampler = 0.0032 * avg_adc_ph + 4.0127;

buffer_index_adc = 0;
adc_value_ph_temp = 0;

avg_ph_temp = ph_value_sampler + avg_ph_temp;


buffer_index_ph++;
}
}

void ph_read() {
ph_value = avg_ph_temp / buffer_index_ph;

avg_ph_temp = 0;
buffer_index_ph = 0;
}

#define pwm_M3 27
#define in_M3 14
#define water_pump 13

int state_tds = 0; // variable for control actuator after reading function done
int runonce_tds = 0; // variable for active timer once, prevent function timer
always execute

C-6
int pwm_tds_control; // pwm value for control speed pump, this value can be
generate from fuzzy or can be set to constant value
int time_tds_control; // time value for control timer pump, this value can be
generate from fuzzy or can be set to constant value

int state_M3 = 0; // for indicator tds up


int state_pump = 0; // for indicator tds down

millisDelay timer_tds_control; // timer for tds control

void tds_control_setup() {
pinMode(in_M3, OUTPUT);
pinMode(water_pump, OUTPUT);

digitalWrite(water_pump, HIGH);
}

void tds_control_loop(int pwm_tds_value, int time_tds_value, float


error_tds_con) {
pwm_tds_control = pwm_tds_value;
time_tds_control = time_tds_value;

if (state_tds == 1) {
if (runonce_tds == 0) {
timer_tds_control.start(time_tds_control);
runonce_tds = 1;
}

if (error_tds_con >= 0) {
set_motor(1, pwm_tds_control, pwm_M3, in_M3);
digitalWrite(water_pump, HIGH);

C-7
state_M3 = 1;
state_pump = 0;
} else {
set_motor(0, 0, pwm_M3, in_M3);
digitalWrite(water_pump, LOW);

state_M3 = 0;
state_pump = 1;
}
}

if (timer_tds_control.justFinished()) {
set_motor(0, 0, pwm_M3, in_M3);
digitalWrite(water_pump, HIGH);

state_M3 = 0;
state_pump = 0;

runonce_tds = 0;
state_tds = 0;
}
}

// *** set pwm value and time value to constant for close loop ***//

#define pwm_M1 32
#define in_M1 33
#define pwm_M2 25
#define in_M2 26

C-8
int state_ph = 0; // variable for control actuator after reading function done
int runonce_ph = 0; // variable for active timer once, prevent function timer
always execute

int pwm_ph_control; // pwm value for control speed pump, this value can be
generate from fuzzy or can be set to constant value
int time_ph_control; // time value for control timer pump, this value can be
generate from fuzzy or can be set to constant value

int state_M1 = 0; // for indicator pH up


int state_M2 = 0; // for indicator pH down

millisDelay timer_ph_control; // timer for ph control

void ph_control_setup() {
pinMode(in_M1, OUTPUT);
pinMode(in_M2, OUTPUT);
}

void ph_control_loop(int pwm_ph_value, int time_ph_value, float error_ph_con)


{
pwm_ph_control = pwm_ph_value;
time_ph_control = time_ph_value;

if (state_ph == 1) {
if (runonce_ph == 0) {
timer_ph_control.start(time_ph_control);
runonce_ph = 1;
}

if (error_ph_con >= 0) {

C-9
set_motor(1, pwm_ph_control, pwm_M1,in_M1);
set_motor(0, pwm_ph_control, pwm_M2, in_M2);

state_M1 = 1;
state_M2 = 0;
} else {
set_motor(0, pwm_ph_control, pwm_M1, in_M1);
set_motor(1, pwm_ph_control, pwm_M2, in_M2);

state_M1 = 0;
state_M2 = 1;
}
}

if (timer_ph_control.justFinished()) {
set_motor(0, 0, pwm_M1, in_M1);
set_motor(0, 0 , pwm_M2, in_M2);

state_M1 = 0;
state_M2 = 0;

runonce_ph = 0;
state_ph = 0;
}
}

// *** set pwm value and time value to constant for close loop ***//

LiquidCrystal_I2C lcd(0x27, 16, 2);

unsigned long time_change_lcd = 0;

C-10
unsigned long time_display_lcd = 0;

int change_disp = 0;

void lcd_setup() {
lcd.begin();
lcd.setCursor(0, 0);
lcd.print("Nutrient Control");
delay(1000);
}

void lcd_loop(int tds_disp_value, float ph_disp_value, String time_now, String


time_1_set, String time_2_set, String time_3_set, float sp_tds, float sp_ph) {
if ((millis() - time_change_lcd) >= 2000) {
lcd.begin();
time_change_lcd = millis();
change_disp++;
}
if ((millis() - time_display_lcd) >= 500) {
time_display_lcd = millis();
if (change_disp == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("tds :");
lcd.setCursor(6, 0);
lcd.print(tds_disp_value);

lcd.setCursor(0, 1);
lcd.print("pH :");
lcd.setCursor(6, 1);
lcd.print(ph_disp_value);

C-11
}

if (change_disp == 1) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time Now :");
lcd.setCursor(11, 0);
lcd.print(time_now);

lcd.setCursor(0, 1);
lcd.print("T1 :");
lcd.setCursor(5, 1);
lcd.print(time_1_set);
}

if (change_disp == 2) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T2 :");
lcd.setCursor(5, 0);
lcd.print(time_2_set);
lcd.setCursor(0, 1);
lcd.print("T3 :");
lcd.setCursor(5, 1);
lcd.print(time_3_set);
}

if (change_disp == 3) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sp tds :");

C-12
lcd.setCursor(9, 0);
lcd.print(sp_tds);
lcd.setCursor(0, 1);
lcd.print("sp ph :");
lcd.setCursor(9, 1);
lcd.print(sp_ph);
}

if (change_disp == 4) {
change_disp = 0;
}
}
}

#define wifi_ssid "Blok G-11"


#define wifi_password "urpass"

#define wifi_attemp 40

void wifi_setup() {
int attemp = 0;
WiFi.begin(wifi_ssid, wifi_password);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Connecting Wi-Fi");

delay(100);

C-13
attemp++;

if (attemp >= wifi_attemp) {


Serial.println("Connecting failed");

lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Connecting Fail");

delay(500);

ESP.restart();
}
}
}

void wifi_loop() {
if (WiFi.status() != WL_CONNECTED) {
wifi_setup();
}
}

const char* mqtt_server = "broker.emqx.io";


const int mqtt_port = 1883;
const char* client_id = "mqttx_6cf1e567";

const char* ch_publish_1 = "/ReadValue";


const char* ch_publish_2 = "/ReadState";
const char* ch_subscribe = "/SendValue";

WiFiClient MQTTclient;

C-14
PubSubClient client(MQTTclient);

#define MQTT_STR_MAX 256

char sPayload[MQTT_STR_MAX];
char sTopic[32];
char publishLog[MQTT_STR_MAX + 100];

void mqtt_setup() {
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);

Serial.print("MQTT connecting to ");


Serial.print(mqtt_server);
Serial.print(":");
Serial.println(mqtt_port);

while (!client.connected()) {
String client_ID = "esp32-client";

if (client.connect(client_ID.c_str(), client_id, "")) {


Serial.println("Public emqx mqtt broker connected");
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(1000);
}
}
client.subscribe(ch_subscribe);
}

C-15
void mqtt_loop() {
if (!client.connected()) {
mqtt_setup();
}

client.loop();
}

WiFiUDP ntpUDP;
NTPClient time_client(ntpUDP, "pool.ntp.org", 25200);

String TimeH = "";


String TimeM = "";
time_t epochTime;

void time_setup() {
time_client.begin();
}

void time_loop() {
time_client.update();
epochTime = time_client.getEpochTime();
}

// function to get hour


String GetH() {
TimeH = time_client.getHours();
if (TimeH.length() < 2) {
TimeH = "0" + TimeH;
}
return TimeH;

C-16
}

// function to get minutes


String GetM() {
TimeM = time_client.getMinutes();
if (TimeM.length() < 2) {
TimeM = "0" + TimeM;
}
return TimeM;
}

// Variable timer for received data from MQTT


const char* timer_1;
const char* timer_2;
const char* timer_3;

// Variable timer for store data timer


String timer_1_store = "no time";
String timer_2_store = "no time";
String timer_3_store = "no time";
String timer_1_eeprom = "no time";
String timer_2_eeprom = "no time";
String timer_3_eeprom = "no time";

float setpoint_tds_store;
float setpoint_ph_store;
float setpoint_tds;
float setpoint_ph;

int runonce_time = 0;

C-17
bool force_stop = false;
bool force_on = false;

int state_control = 0;

int runonce_threshold = 0;

String HOURS;
String MINS;
String TIME_NOW;

void callback(char* topic, byte* message, unsigned int length) {


char str[length + 1];
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("]");

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


Serial.print((char)message[i]);
str[i] = (char)message[i];
}
Serial.println();
DynamicJsonDocument doc(5000);
deserializeJson(doc, str);

if (doc[0]["Timer1"]) {
timer_1 = doc[0]["Timer1"];
timer_1_store = String(timer_1);
EEPROM_put(10, timer_1_store);
}

C-18
if (doc[1]["Timer2"]) {
timer_2 = doc[1]["Timer2"];
timer_2_store = String(timer_2);
EEPROM_put(30, timer_2_store);
}

if (doc[2]["Timer3"]) {
timer_3 = doc[2]["Timer3"];
timer_3_store = String(timer_3);
EEPROM_put(50, timer_3_store);
}

if (doc[0]["TDS_SET"]) {
setpoint_tds_store = doc[0]["TDS_SET"];
EEPROM_put_float(70, setpoint_tds_store);
}

if (doc[1]["PH_SET"]) {
setpoint_ph_store = doc[1]["PH_SET"];
EEPROM_put_float(90, setpoint_ph_store);
}

if (doc[0]["Force_Stop"]) {
force_stop = doc[0]["Force_Stop"];
}

if (doc[0]["Force_on"]) {
force_on = doc[0]["Force_on"];
}

if (doc[0]["close_loop"]) {

C-19
state_control = doc[0]["close_loop"];
}
}

void check_state() {
HOURS = GetH();
MINS = GetM();
TIME_NOW = HOURS + ":" + MINS;

timer_1_eeprom = EEPROM_get(10);
timer_2_eeprom = EEPROM_get(30);
timer_3_eeprom = EEPROM_get(50);

setpoint_tds = EEPROM_get_float(70);
setpoint_ph = EEPROM_get_float(90);

if (TIME_NOW == timer_1_eeprom) {
if (runonce_time == 0) {
state_control = 1;
runonce_time = 1;
}
}

if (TIME_NOW == timer_2_eeprom) {
if (runonce_time == 0) {
state_control = 1;
runonce_time = 1;
}
}

if (TIME_NOW == timer_3_eeprom) {

C-20
if (runonce_time == 0) {
state_control = 1;
runonce_time = 1;
}
}

if (TIME_NOW != timer_1_eeprom && TIME_NOW != timer_2_eeprom &&


TIME_NOW != timer_3_eeprom) {
runonce_time = 0;
}

if (force_stop == true) {
state_control = 0;
runonce_time = 0;

buffer_index_adc = 0;
adc_value_ph_temp = 0;

buffer_index_ph = 0;
avg_ph_temp = 0;

state_tds = 0;
state_ph = 0;

runonce_tds = 0;
runonce_ph = 0;

set_motor(0, 0, pwm_M3, in_M3);


digitalWrite(water_pump, HIGH);
state_M3 = 0;
state_pump = 0;

C-21
set_motor(0, 0, pwm_M1, in_M3);
set_motor(0, 0, pwm_M2, in_M3);
state_M1 = 0;
state_M2 = 0;

runonce_threshold = 0;

send_packet(ch_publish_1, ch_publish_2);

force_stop = false;
}

if (force_on == true) {
state_control = 1;
force_on = false;
}
}

char data_value[100];
char data_state[100];

float error_tds_value;
float error_ph_value;

unsigned long time_send_packet = 0;

char* data_sensor_packet(int tds_send_val, float ph_send_val, float error_tds,


float error_ph) {
sprintf(data_value, "%d, %f, %f, %f", tds_send_val, ph_send_val, error_tds,
error_ph);

C-22
return data_value;
}

char* data_state_packet(int M1, int M2, int M3, int w_pump) {


sprintf(data_state, "%d, %d, %d, %d", M1, M2, M3, w_pump);

return data_state;
}

void send_packet(const char* ch_publish1, const char* ch_publish2) {


if ((millis() - time_send_packet) >= 100) {
time_send_packet = millis();
client.publish(ch_publish1, data_sensor_packet(tds_value, ph_value,
voltage_tds, avg_adc_ph));
client.publish(ch_publish2, data_state_packet(state_M1, state_M2, state_M3,
state_pump));
}
}

float derror_tds_value;
float derror_ph_value;

float last_tds_error = 0.0;


float last_ph_error = 0.0;

void get_error_derror_tds() {
error_tds_value = setpoint_tds - tds_value;
derror_tds_value = error_tds_value - last_tds_error;
delay(1);
last_tds_error = error_tds_value;

C-23
}

void get_error_derror_ph() {
error_ph_value = setpoint_ph - ph_value;
derror_ph_value = error_ph_value - last_ph_error;
delay(1);
last_ph_error = error_ph_value;
}

int runonce_read = 0; // for read at first time

void timercontrol_tds() {
tds_threshold_n = setpoint_tds - (setpoint_tds * 0.05);
tds_threshold_p = setpoint_tds + (setpoint_tds * 0.05);

if (tds_value >= tds_threshold_n && tds_value <= tds_threshold_p &&


runonce_threshold == 0) {
runonce_threshold = 1;
timer_loop.start(180000);
}

if (timer_loop.justFinished() && runonce_threshold == 1) {


Serial.println("tds control finished");

set_motor(0, 0, pwm_M3, in_M3);


digitalWrite(water_pump, HIGH);

state_M3 = 0;
state_pump = 0;

runonce_tds = 0;

C-24
state_tds = 0;

send_packet(ch_publish_1, ch_publish_2);

runonce_threshold = 0;
runonce_read = 0;

last_tds_error = 0;
state_control = 2;
}
}

void timercontrol_ph() {
ph_threshold_n = setpoint_ph - (setpoint_ph * 0.05);
ph_threshold_p = setpoint_ph + (setpoint_ph * 0.05);

if (ph_value >= ph_threshold_n && ph_value <= ph_threshold_p &&


runonce_threshold == 0) {
runonce_threshold = 1;
timer_loop.start(300000);
}

if (timer_loop.justFinished() && runonce_threshold == 1) {


Serial.println("ph control finished");

set_motor(0, 0, pwm_M1, in_M1);


set_motor(0, 0 , pwm_M2, in_M2);

state_M1 = 0;
state_M2 = 0;

C-25
runonce_ph = 0;
state_ph = 0;

send_packet(ch_publish_1, ch_publish_2);

runonce_threshold = 0;
runonce_read = 0;

last_ph_error = 0;
state_control = 0;
}
}

void timercontrol_tds_nsequence() {
tds_threshold_n = setpoint_tds - (setpoint_tds * 0.05);
tds_threshold_p = setpoint_tds + (setpoint_tds * 0.05);

if (tds_value >= tds_threshold_n && tds_value <= tds_threshold_p &&


runonce_threshold == 0) {
runonce_threshold = 1;
timer_loop.start(120000);
}

if (timer_loop.justFinished() && runonce_threshold == 1) {


Serial.println("tds control finished");

set_motor(0, 0, pwm_M3, in_M3);


digitalWrite(water_pump, HIGH);

state_M3 = 0;
state_pump = 0;

C-26
runonce_tds = 0;
state_tds = 0;

send_packet(ch_publish_1, ch_publish_2);

runonce_threshold = 0;
runonce_read = 0;

last_tds_error = 0;
state_control = 0;
}
}

void timercontrol_ph_nsequence() {
ph_threshold_n = setpoint_ph - (setpoint_ph * 0.05);
ph_threshold_p = setpoint_ph + (setpoint_ph * 0.05);

if (ph_value >= ph_threshold_n && ph_value <= ph_threshold_p &&


runonce_threshold == 0) {
runonce_threshold = 1;
timer_loop.start(300000);
}

if (timer_loop.justFinished() && runonce_threshold == 1) {


Serial.println("ph control finished");

set_motor(0, 0, pwm_M1, in_M1);


set_motor(0, 0 , pwm_M2, in_M2);

state_M1 = 0;

C-27
state_M2 = 0;

runonce_ph = 0;
state_ph = 0;

send_packet(ch_publish_1, ch_publish_2);

runonce_threshold = 0;
runonce_read = 0;

last_ph_error = 0;
state_control = 0;
}
}

// Struktur Alias
typedef struct pH_Error {
float NB_Er_pH; // error negatif besar
float NK_Er_pH; // error negatif kecil
float Z_Er_pH; // zero error
float PK_Er_pH; // error positif kecil
float PB_Er_pH; // error positif besar
} pH_error;

typedef struct pH_dError {


float NB_dEr_pH; // delta error negatif besar
float NK_dEr_pH; // delta error negatif kecil
float Z_dEr_pH; // delta zero error
float PK_dEr_pH; // deltaerror positif kecil
float PB_dEr_pH; // delta error positif besar
} pH_derror;

C-28
typedef struct ppm_Error {
float NB_Er_ppm; // error negatif besar
float NK_Er_ppm; // error negatif kecil
float Z_Er_ppm; // zero error
float PK_Er_ppm; // error positif kecil
float PB_Er_ppm; // error positif besar
} ppm_error;

typedef struct ppm_dError {


float NB_dEr_ppm; // delta error negatif besar
float NK_dEr_ppm; // delta error negatif kecil
float Z_dEr_ppm; // delta zero error
float PK_dEr_ppm; // deltaerror positif kecil
float PB_dEr_ppm; // delta error positif besar
} ppm_derror;

typedef struct PWM_tds {


float lambat = 178.0;
float sedang = 204.0;
float cepat = 255.0;
} PWM_tds;

typedef struct PWM_pH {


float lambat = 127.0; //60% coba 178
float sedang = 178.0; // 80% coba 204
float cepat = 255.0; // 100%
} PWM_pH;

typedef struct TIME_PPM {


float bentar = 0.0;

C-29
float sedang = 1000.0;
float lama = 2000.0;
} TIME_PPM;

typedef struct TIME_pH {


float bentar = 0.0;
float sedang = 2500.0;
float lama = 5000.0;
} TIME_pH;

pH_error pH_Error;
pH_derror pH_dError;
ppm_error ppm_Error;
ppm_derror ppm_dError;
PWM_tds pwm_ppm; // ganti di defuzzyfikasi
PWM_pH pwm_pH;
TIME_PPM time_ppm; // ganti di defuzzifikasi
TIME_pH time_pH; // tambahin di defuzzifikasi

// Bobot
float bobot1_ppm, bobot2_ppm, bobot3_ppm, bobot4_ppm, bobot5_ppm;
float bobot6_ppm, bobot7_ppm, bobot8_ppm, bobot9_ppm, bobot10_ppm;
float bobot11_ppm, bobot12_ppm, bobot13_ppm, bobot14_ppm, bobot15_ppm;
float bobot16_ppm, bobot17_ppm, bobot18_ppm, bobot19_ppm, bobot20_ppm;
float bobot21_ppm, bobot22_ppm, bobot23_ppm, bobot24_ppm, bobot25_ppm;

float bobot1_ph, bobot2_ph, bobot3_ph, bobot4_ph, bobot5_ph;


float bobot6_ph, bobot7_ph, bobot8_ph, bobot9_ph, bobot10_ph;
float bobot11_ph, bobot12_ph, bobot13_ph, bobot14_ph, bobot15_ph;
float bobot16_ph, bobot17_ph, bobot18_ph, bobot19_ph, bobot20_ph;

C-30
float bobot21_ph, bobot22_ph, bobot23_ph, bobot24_ph, bobot25_ph;

void fuzzyfikasi_tds() {
ppm_Error.NB_Er_ppm = trap_mf(-250.0, -250.0, -200.0, -100.0,
error_tds_value);
ppm_Error.NK_Er_ppm = trap_mf(-200, -100, -100.0, 0.0, error_tds_value);
ppm_Error.Z_Er_ppm = trap_mf(-100.0, 0.0, 0.0, 100.0, error_tds_value);
ppm_Error.PK_Er_ppm = trap_mf(0.0, 100.0, 100.0, 200.0, error_tds_value);
ppm_Error.PB_Er_ppm = trap_mf(100.0, 200.0, 250.0, 250.0, error_tds_value);

ppm_dError.NB_dEr_ppm = trap_mf(-150.0, -150.0, -100.0, -50.0,


derror_tds_value);
ppm_dError.NK_dEr_ppm = trap_mf(-100.0, -50.0, -50.0, 0.0,
derror_tds_value);
ppm_dError.Z_dEr_ppm = trap_mf(-50.0, 0.0, 0.0, 50.0, derror_tds_value);
ppm_dError.PK_dEr_ppm = trap_mf(0.0, 50.0, 50.0, 100.0, derror_tds_value);
ppm_dError.PB_dEr_ppm = trap_mf(50.0, 100.0, 150.0, 150.0,
derror_tds_value);
}

void fuzzyfikasi_ph() {
pH_Error.NB_Er_pH = trap_mf(-1.5, -1.5, -0.4, -0.1, error_ph_value);
pH_Error.NK_Er_pH = trap_mf(-0.4, -0.1, -0.1, 0.0, error_ph_value);
pH_Error.Z_Er_pH = trap_mf(-0.1, 0.0, 0.0, 0.1, error_ph_value);
pH_Error.PK_Er_pH = trap_mf(0.0, 0.1, 0.1, 0.4, error_ph_value);
pH_Error.PB_Er_pH = trap_mf(0.1, 0.4, 1.5, 1.5, error_ph_value);

pH_dError.NB_dEr_pH = trap_mf(-1.5, -1.5, -0.4, -0.1, derror_ph_value);


pH_dError.NK_dEr_pH = trap_mf(-0.4, -0.1, -0.1, 0.0, derror_ph_value);
pH_dError.Z_dEr_pH = trap_mf(-0.1, 0.0, 0.0, 0.1, derror_ph_value);
pH_dError.PK_dEr_pH = trap_mf(0.0, 0.1, 0.1, 0.4, derror_ph_value);

C-31
pH_dError.PB_dEr_pH = trap_mf(0.1, 0.4, 1.5, 1.5, derror_ph_value);
}

void fuzzy_inference_tds() {
bobot1_ppm = 0;
bobot2_ppm = 0;
bobot3_ppm = 0;
bobot4_ppm = 0;
bobot5_ppm = 0;
bobot6_ppm = 0;
bobot7_ppm = 0;
bobot8_ppm = 0;
bobot9_ppm = 0;
bobot10_ppm = 0;
bobot11_ppm = 0;
bobot12_ppm = 0;
bobot13_ppm = 0;
bobot14_ppm = 0;
bobot15_ppm = 0;
bobot16_ppm = 0;
bobot17_ppm = 0;
bobot18_ppm = 0;
bobot19_ppm = 0;
bobot20_ppm = 0;
bobot21_ppm = 0;
bobot22_ppm = 0;
bobot23_ppm = 0;
bobot24_ppm = 0;
bobot25_ppm = 0;

//Rules kendali ppm

C-32
if (ppm_Error.NB_Er_ppm > 0 && ppm_dError.NB_dEr_ppm > 0) {
bobot1_ppm = minimum(ppm_Error.NB_Er_ppm, ppm_dError.NB_dEr_ppm);
}
if (ppm_Error.NB_Er_ppm > 0 && ppm_dError.NK_dEr_ppm > 0) {
bobot2_ppm = minimum(ppm_Error.NB_Er_ppm,
ppm_dError.NK_dEr_ppm);
}
if (ppm_Error.NB_Er_ppm > 0 && ppm_dError.Z_dEr_ppm > 0) {
bobot3_ppm = minimum(ppm_Error.NB_Er_ppm, ppm_dError.Z_dEr_ppm);
}
if (ppm_Error.NB_Er_ppm > 0 && ppm_dError.PK_dEr_ppm > 0) {
bobot4_ppm = minimum(ppm_Error.NB_Er_ppm,
ppm_dError.PK_dEr_ppm);
}
if (ppm_Error.NB_Er_ppm > 0 && ppm_dError.PB_dEr_ppm > 0) {
bobot5_ppm = minimum(ppm_Error.NB_Er_ppm, ppm_dError.PB_dEr_ppm);
}

if (ppm_Error.NK_Er_ppm > 0 && ppm_dError.NB_dEr_ppm > 0) {


bobot6_ppm = minimum(ppm_Error.NK_Er_ppm,
ppm_dError.NB_dEr_ppm);
}
if (ppm_Error.NK_Er_ppm > 0 && ppm_dError.NK_dEr_ppm > 0) {
bobot7_ppm = minimum(ppm_Error.NK_Er_ppm,
ppm_dError.NK_dEr_ppm);
}
if (ppm_Error.NK_Er_ppm > 0 && ppm_dError.Z_dEr_ppm > 0) {
bobot8_ppm = minimum(ppm_Error.NK_Er_ppm, ppm_dError.Z_dEr_ppm);
}
if (ppm_Error.NK_Er_ppm > 0 && ppm_dError.PK_dEr_ppm > 0) {

C-33
bobot9_ppm = minimum(ppm_Error.NK_Er_ppm,
ppm_dError.PK_dEr_ppm);
}
if (ppm_Error.NK_Er_ppm > 0 && ppm_dError.PB_dEr_ppm > 0) {
bobot10_ppm = minimum(ppm_Error.NK_Er_ppm,
ppm_dError.PB_dEr_ppm);
}

if (ppm_Error.Z_Er_ppm > 0 && ppm_dError.NB_dEr_ppm > 0) {


bobot11_ppm = minimum(ppm_Error.Z_Er_ppm, ppm_dError.NB_dEr_ppm);
}
if (ppm_Error.Z_Er_ppm > 0 && ppm_dError.NK_dEr_ppm > 0) {
bobot12_ppm = minimum(ppm_Error.Z_Er_ppm, ppm_dError.NK_dEr_ppm);
}
if (ppm_Error.Z_Er_ppm > 0 && ppm_dError.Z_dEr_ppm > 0) {
bobot13_ppm = minimum(ppm_Error.Z_Er_ppm, ppm_dError.Z_dEr_ppm);
}
if (ppm_Error.Z_Er_ppm > 0 && ppm_dError.PK_dEr_ppm > 0) {
bobot14_ppm = minimum(ppm_Error.Z_Er_ppm, ppm_dError.PK_dEr_ppm);
}
if (ppm_Error.Z_Er_ppm > 0 && ppm_dError.PB_dEr_ppm > 0) {
bobot15_ppm = minimum(ppm_Error.Z_Er_ppm, ppm_dError.PB_dEr_ppm);
}

if (ppm_Error.PK_Er_ppm > 0 && ppm_dError.NB_dEr_ppm > 0) {


bobot16_ppm = minimum(ppm_Error.PK_Er_ppm,
ppm_dError.NB_dEr_ppm);
}
if (ppm_Error.PK_Er_ppm > 0 && ppm_dError.NK_dEr_ppm > 0) {
bobot17_ppm = minimum(ppm_Error.PK_Er_ppm,
ppm_dError.NK_dEr_ppm);

C-34
}
if (ppm_Error.PK_Er_ppm > 0 && ppm_dError.Z_dEr_ppm > 0) {
bobot18_ppm = minimum(ppm_Error.PK_Er_ppm, ppm_dError.Z_dEr_ppm);
}
if (ppm_Error.PK_Er_ppm > 0 && ppm_dError.PK_dEr_ppm > 0) {
bobot19_ppm = minimum(ppm_Error.PK_Er_ppm,
ppm_dError.PK_dEr_ppm);
}
if (ppm_Error.PK_Er_ppm > 0 && ppm_dError.PB_dEr_ppm > 0) {
bobot20_ppm = minimum(ppm_Error.PK_Er_ppm,
ppm_dError.PB_dEr_ppm);
}

if (ppm_Error.PB_Er_ppm > 0 && ppm_dError.NB_dEr_ppm > 0) {


bobot21_ppm = minimum(ppm_Error.PB_Er_ppm,
ppm_dError.NB_dEr_ppm);
}
if (ppm_Error.PB_Er_ppm > 0 && ppm_dError.NK_dEr_ppm > 0) {
bobot22_ppm = minimum(ppm_Error.PB_Er_ppm,
ppm_dError.NK_dEr_ppm);
}
if (ppm_Error.PB_Er_ppm > 0 && ppm_dError.Z_dEr_ppm > 0) {
bobot23_ppm = minimum(ppm_Error.PB_Er_ppm, ppm_dError.Z_dEr_ppm);
}
if (ppm_Error.PB_Er_ppm > 0 && ppm_dError.PK_dEr_ppm > 0) {
bobot24_ppm = minimum(ppm_Error.PB_Er_ppm,
ppm_dError.PK_dEr_ppm);
}
if (ppm_Error.PB_Er_ppm > 0 && ppm_dError.PB_dEr_ppm > 0) {
bobot25_ppm = minimum(ppm_Error.PB_Er_ppm,
ppm_dError.PB_dEr_ppm);

C-35
}
}

void fuzzy_inference_ph() {
bobot1_ph = 0;
bobot2_ph = 0;
bobot3_ph = 0;
bobot4_ph = 0;
bobot5_ph = 0;
bobot6_ph = 0;
bobot7_ph = 0;
bobot8_ph = 0;
bobot9_ph = 0;
bobot10_ph = 0;
bobot11_ph = 0;
bobot12_ph = 0;
bobot13_ph = 0;
bobot14_ph = 0;
bobot15_ph = 0;
bobot16_ph = 0;
bobot17_ph = 0;
bobot18_ph = 0;
bobot19_ph = 0;
bobot20_ph = 0;
bobot21_ph = 0;
bobot22_ph = 0;
bobot23_ph = 0;
bobot24_ph = 0;
bobot25_ph = 0;

if (pH_Error.NB_Er_pH > 0 && pH_dError.NB_dEr_pH > 0) {

C-36
bobot1_ph = minimum(pH_Error.NB_Er_pH, pH_dError.NB_dEr_pH);
}
if (pH_Error.NB_Er_pH > 0 && pH_dError.NK_dEr_pH > 0) {
bobot2_ph = minimum(pH_Error.NB_Er_pH, pH_dError.NK_dEr_pH);
}
if (pH_Error.NB_Er_pH > 0 && pH_dError.Z_dEr_pH > 0) {
bobot3_ph = minimum(pH_Error.NB_Er_pH, pH_dError.Z_dEr_pH);
}
if (pH_Error.NB_Er_pH > 0 && pH_dError.PK_dEr_pH > 0) {
bobot4_ph = minimum(pH_Error.NB_Er_pH, pH_dError.PK_dEr_pH);
}
if (pH_Error.NB_Er_pH > 0 && pH_dError.PB_dEr_pH > 0) {
bobot5_ph = minimum(pH_Error.NB_Er_pH, pH_dError.PB_dEr_pH);
}

if (pH_Error.NK_Er_pH > 0 && pH_dError.NB_dEr_pH > 0) {


bobot6_ph = minimum(pH_Error.NK_Er_pH, pH_dError.NB_dEr_pH);
}
if (pH_Error.NK_Er_pH > 0 && pH_dError.NK_dEr_pH > 0) {
bobot7_ph = minimum(pH_Error.NK_Er_pH, pH_dError.NK_dEr_pH);
}
if (pH_Error.NK_Er_pH > 0 && pH_dError.Z_dEr_pH > 0) {
bobot8_ph = minimum(pH_Error.NK_Er_pH, pH_dError.Z_dEr_pH);
}
if (pH_Error.NK_Er_pH > 0 && pH_dError.PK_dEr_pH > 0) {
bobot9_ph = minimum(pH_Error.NK_Er_pH, pH_dError.PK_dEr_pH);
}
if (pH_Error.NK_Er_pH > 0 && pH_dError.PB_dEr_pH > 0) {
bobot10_ph = minimum(pH_Error.NK_Er_pH, pH_dError.PB_dEr_pH);
}

C-37
if (pH_Error.Z_Er_pH > 0 && pH_dError.NB_dEr_pH > 0) {
bobot11_ph = minimum(pH_Error.Z_Er_pH, pH_dError.NB_dEr_pH);
}
if (pH_Error.Z_Er_pH > 0 && pH_dError.NK_dEr_pH > 0) {
bobot12_ph = minimum(pH_Error.Z_Er_pH, pH_dError.NK_dEr_pH);
}
if (pH_Error.Z_Er_pH > 0 && pH_dError.Z_dEr_pH > 0) {
bobot13_ph = minimum(pH_Error.Z_Er_pH, pH_dError.Z_dEr_pH);
}
if (pH_Error.Z_Er_pH > 0 && pH_dError.PK_dEr_pH > 0) {
bobot14_ph = minimum(pH_Error.Z_Er_pH, pH_dError.PK_dEr_pH);
}
if (pH_Error.Z_Er_pH > 0 && pH_dError.PB_dEr_pH > 0) {
bobot15_ph = minimum(pH_Error.Z_Er_pH, pH_dError.PB_dEr_pH);
}

if (pH_Error.PK_Er_pH > 0 && pH_dError.NB_dEr_pH > 0) {


bobot16_ph = minimum(pH_Error.PK_Er_pH, pH_dError.NB_dEr_pH);
}
if (pH_Error.PK_Er_pH > 0 && pH_dError.NK_dEr_pH > 0) {
bobot17_ph = minimum(pH_Error.PK_Er_pH, pH_dError.NK_dEr_pH);
}
if (pH_Error.PK_Er_pH > 0 && pH_dError.Z_dEr_pH > 0) {
bobot18_ph = minimum(pH_Error.PK_Er_pH, pH_dError.Z_dEr_pH);
}
if (pH_Error.PK_Er_pH > 0 && pH_dError.PK_dEr_pH > 0) {
bobot19_ph = minimum(pH_Error.PK_Er_pH, pH_dError.PK_dEr_pH);
}
if (pH_Error.PK_Er_pH > 0 && pH_dError.PB_dEr_pH > 0) {
bobot20_ph = minimum(pH_Error.PK_Er_pH, pH_dError.PB_dEr_pH);
}

C-38
if (pH_Error.PB_Er_pH > 0 && pH_dError.NB_dEr_pH > 0) {
bobot21_ph = minimum(pH_Error.PB_Er_pH, pH_dError.NB_dEr_pH);
}
if (pH_Error.PB_Er_pH > 0 && pH_dError.NK_dEr_pH > 0) {
bobot22_ph = minimum(pH_Error.PB_Er_pH, pH_dError.NK_dEr_pH);
}
if (pH_Error.PB_Er_pH > 0 && pH_dError.Z_dEr_pH > 0) {
bobot23_ph = minimum(pH_Error.PB_Er_pH, pH_dError.Z_dEr_pH);
}
if (pH_Error.PB_Er_pH > 0 && pH_dError.PK_dEr_pH > 0) {
bobot24_ph = minimum(pH_Error.PB_Er_pH, pH_dError.PK_dEr_pH);
}
if (pH_Error.PB_Er_pH > 0 && pH_dError.PB_dEr_pH > 0) {
bobot25_ph = minimum(pH_Error.PB_Er_pH, pH_dError.PB_dEr_pH);
}
}
void defuzzifikasi_tds() {
rata2bobot_pwm_ppm = (bobot1_ppm * pwm_ppm.cepat) + (bobot2_ppm *
pwm_ppm.cepat) + (bobot3_ppm * pwm_ppm.cepat) + (bobot4_ppm *
pwm_ppm.cepat) + (bobot5_ppm * pwm_ppm.sedang) + (bobot6_ppm *
pwm_ppm.sedang) + (bobot7_ppm * pwm_ppm.sedang) + (bobot8_ppm *
pwm_ppm.sedang) + (bobot9_ppm * pwm_ppm.sedang) + (bobot10_ppm *
pwm_ppm.sedang) +
(bobot11_ppm * pwm_ppm.lambat) + (bobot12_ppm *
pwm_ppm.lambat) + (bobot13_ppm * pwm_ppm.lambat) + (bobot14_ppm *
pwm_ppm.lambat) + (bobot15_ppm * pwm_ppm.lambat) + (bobot16_ppm *
pwm_ppm.sedang) + (bobot17_ppm * pwm_ppm.sedang) + (bobot18_ppm *
pwm_ppm.sedang) + (bobot19_ppm * pwm_ppm.sedang) + (bobot20_ppm *
pwm_ppm.sedang) +

C-39
(bobot21_ppm * pwm_ppm.sedang) + (bobot22_ppm *
pwm_ppm.cepat) + (bobot23_ppm * pwm_ppm.cepat) + (bobot24_ppm *
pwm_ppm.cepat) + (bobot25_ppm * pwm_ppm.cepat);

rata2bobot_time_ppm = (bobot1_ppm * time_ppm.lama) + (bobot2_ppm *


time_ppm.lama) + (bobot3_ppm * time_ppm.lama) + (bobot4_ppm *
time_ppm.sedang) + (bobot5_ppm * time_ppm.sedang) + (bobot6_ppm *
time_ppm.sedang) + (bobot7_ppm * time_ppm.sedang) + (bobot8_ppm *
time_ppm.sedang) + (bobot9_ppm * time_ppm.sedang) + (bobot10_ppm *
time_ppm.sedang) +
(bobot11_ppm * time_ppm.sedang) + (bobot12_ppm *
time_ppm.bentar) + (bobot13_ppm * time_ppm.bentar) + (bobot14_ppm *
time_ppm.bentar) + (bobot15_ppm * time_ppm.sedang) + (bobot16_ppm *
time_ppm.sedang) + (bobot17_ppm * time_ppm.sedang) + (bobot18_ppm *
time_ppm.sedang) + (bobot19_ppm * time_ppm.sedang) + (bobot20_ppm *
time_ppm.sedang) +
(bobot21_ppm * time_ppm.lama) + (bobot22_ppm *
time_ppm.lama) + (bobot23_ppm * time_ppm.lama) + (bobot24_ppm *
time_ppm.lama) + (bobot25_ppm * time_ppm.lama);

sumrata2bobot_ppm = (bobot1_ppm + bobot2_ppm + bobot3_ppm +


bobot4_ppm + bobot5_ppm + bobot6_ppm + bobot7_ppm + bobot8_ppm +
bobot9_ppm + bobot10_ppm) +
(bobot11_ppm + bobot12_ppm + bobot13_ppm + bobot14_ppm +
bobot15_ppm + bobot16_ppm + bobot17_ppm + bobot18_ppm + bobot19_ppm +
bobot20_ppm) +
(bobot21_ppm + bobot22_ppm + bobot23_ppm + bobot24_ppm +
bobot25_ppm);
}

float pwm_ppm_func() {

C-40
pwm_out_ppm = rata2bobot_pwm_ppm / sumrata2bobot_ppm;
if (isnan(pwm_out_ppm)) {
pwm_out_ppm = 255.0;
}
return pwm_out_ppm;
}

float time_ppm_func() {
time_out_ppm = rata2bobot_time_ppm / sumrata2bobot_ppm;
if (isnan(time_out_ppm)) {
time_out_ppm = 2000.0;
}
return time_out_ppm;
}

void defuzzifikasi_ph() {
rata2bobot_pwm_ph = (bobot1_ph * pwm_pH.cepat) + (bobot2_ph *
pwm_pH.cepat) + (bobot3_ph * pwm_pH.cepat) + (bobot4_ph * pwm_pH.cepat)
+ (bobot5_ph * pwm_pH.sedang) + (bobot6_ph * pwm_pH.sedang) + (bobot7_ph
* pwm_pH.sedang) + (bobot8_ph * pwm_pH.sedang) + (bobot9_ph *
pwm_pH.sedang) + (bobot10_ph * pwm_pH.sedang) +
(bobot11_ph * pwm_pH.lambat) + (bobot12_ph * pwm_pH.lambat)
+ (bobot13_ph * pwm_pH.lambat) + (bobot14_ph * pwm_pH.lambat) +
(bobot15_ph * pwm_pH.lambat) + (bobot16_ph * pwm_pH.sedang) +
(bobot17_ph * pwm_pH.sedang) + (bobot18_ph * pwm_pH.sedang) +
(bobot19_ph * pwm_pH.sedang) + (bobot20_ph * pwm_pH.sedang) +
(bobot21_ph * pwm_pH.sedang) + (bobot22_ph * pwm_pH.cepat)
+ (bobot23_ph * pwm_pH.cepat) + (bobot24_ph * pwm_pH.cepat) +
(bobot25_ph * pwm_pH.cepat);

C-41
rata2bobot_time_ph = (bobot1_ph * time_pH.lama) + (bobot2_ph *
time_pH.lama) + (bobot3_ph * time_pH.lama) + (bobot4_ph * time_pH.sedang) +
(bobot5_ph * time_pH.bentar) + (bobot6_ph * time_pH.lama) + (bobot7_ph *
time_pH.lama) + (bobot8_ph * time_pH.sedang) + (bobot9_ph * time_pH.bentar)
+ (bobot10_ph * time_pH.bentar) +
(bobot11_ph * time_pH.sedang) + (bobot12_ph * time_pH.bentar)
+ (bobot13_ph * time_pH.bentar) + (bobot14_ph * time_pH.bentar) +
(bobot15_ph * time_pH.sedang) + (bobot16_ph * time_pH.bentar) + (bobot17_ph
* time_pH.bentar) + (bobot18_ph * time_pH.sedang) + (bobot19_ph *
time_pH.lama) + (bobot20_ph * time_pH.lama) +
(bobot21_ph * time_pH.bentar) + (bobot22_ph * time_pH.sedang)
+ (bobot23_ph * time_pH.lama) + (bobot24_ph * time_pH.lama) + (bobot25_ph
* time_pH.lama);

sumrata2bobot_ph = (bobot1_ph + bobot2_ph + bobot3_ph + bobot4_ph +


bobot5_ph + bobot6_ph + bobot7_ph + bobot8_ph + bobot9_ph + bobot10_ph) +
(bobot11_ph + bobot12_ph + bobot13_ph + bobot14_ph +
bobot15_ph + bobot16_ph + bobot17_ph + bobot18_ph + bobot19_ph +
bobot20_ph) +
(bobot21_ph + bobot22_ph + bobot23_ph + bobot24_ph +
bobot25_ph);
}

float pwm_ph_func() {
pwm_out_ph = rata2bobot_pwm_ph / sumrata2bobot_ph;
if (isnan(pwm_out_ph)) {
pwm_out_ph = 255.0;
}
return pwm_out_ph;
}

C-42
float time_ph_func() {
time_out_ph = rata2bobot_time_ph / sumrata2bobot_ph;
if (isnan(time_out_ph)) {
time_out_ph = 5000.0;
}
return time_out_ph;
}

void fuzzy_tds() {
fuzzyfikasi_tds();
fuzzy_inference_tds();
defuzzifikasi_tds();
}

void fuzzy_ph() {
fuzzyfikasi_ph();
fuzzy_inference_ph();
defuzzifikasi_ph();
}
unsigned long currt;
unsigned long prevt = 0;

float pwm_tds = 0;
float pwm_ph = 0;
float time_tds = 0;
float time_ph = 0;

millisDelay Timer_measure;

unsigned long prevt_measure = 0;


int measure_state = 1;

C-43
int runonce_measure = 0;

void measurement_loop() {
if (state_control == 0) {
if ((millis() - prevt_measure) >= 300000) {
prevt_measure = millis();
measure_state = 1;
}

if (measure_state == 1) {
ph_filter();

if (runonce_measure == 0) {
Timer_measure.start(30000);
servo_control(tds_servo_pin, 0);
runonce_measure = 1;
}
}

if (Timer_measure.justFinished()) {
ph_read();
tds_read();
send_packet(ch_publish_1, ch_publish_2);
servo_control(tds_servo_pin, 90);
measure_state = 0;
runonce_measure = 0;
}
} else {
Timer_measure.stop();
measure_state = 0;
runonce_measure = 0;

C-44
}
}

void setup() {
serial_setup();
servo_setup(tds_servo_pin);
tds_sensor_setup();
ph_sensor_setup();
lcd_setup();

tds_control_setup();
ph_control_setup();

wifi_setup();
mqtt_setup();
time_setup();
}

void loop() {
currt = millis();

wifi_loop();
mqtt_loop();
time_loop();

check_state();

servo_control_loop();

main_control_fuzzy();
main_control_nsequence_loop();

C-45
measurement_loop();

lcd_loop(tds_value, ph_value, TIME_NOW, timer_1_eeprom, timer_2_eeprom,


timer_3_eeprom, setpoint_tds, setpoint_ph);
}

C-46

Anda mungkin juga menyukai