TUGAS AKHIR
Oleh
Oleh
Menyetujui,
Pembimbing
Mengetahui,
Ketua Prodi Teknik Elektro
Mengetahui
Pembimbing Mahasiswa
Bermatrai 10.000
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.
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.
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.
iv
DAFTAR ISI
ABSTRAK ............................................................................................................... i
ABSTRACT ............................................................................................................ ii
v
2.8.1. pH sensor ................................................................................................ 20
vi
3.3.5. Pembuatan Database SQLite................................................................... 70
vii
DAFTAR LAMPIRAN
viii
DAFTAR GAMBAR
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
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
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.
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).
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.
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.
4
BAB II TEORI PENUNJANG
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.
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.
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
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.
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.
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
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].
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.
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.
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)
17
Tabel 2. 3 Pin ESP32 [22].
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.
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.
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.
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.
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.
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].
25
Gambar 2. 14 Peristaltic pump.
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].
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).
29
BAB III METODE PENELITIAN
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).
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.
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.
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.
33
Gambar 3. 4 Diagram blok sistem kendali close loop pH.
34
pada pengendalian pH larutan, sensor yang digunakan untuk membaca pH
larutan secara aktual adalah analog pH sensor.
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.
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.
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.
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 - -
39
Gambar 3. 8 Layout PCB modul input.
40
Gambar 3. 10 Layout PCB modul output.
41
Gambar 3. 11 Diagram alir sistem.
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.
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.
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.
46
c) Sub proses monitoring mode
Berikut adalah sub proses dari monitoring mode dapat dilihat pada Gambar 3.14.
47
kembali ke posisi awal. Apabila timer sampling belum berjalan selama 30 detik
maka proses pembacaan nilai TDS dan pH akan dilakukan kembali.
Berikut adalah sub proses dari kendali TDS dengan algoritma fuzzy logic dapat
dilihat pada Gambar 3.15.
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.
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.
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.
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.
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.
55
Dan berikut adalah hasil perancangan membership function pada MATLAB
menggunakan fuzzy logic toolbox.
56
Gambar 3. 20 Membership function PWM 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 - -
NB - Er NK - Er Z - Er PK - Er PB - Er
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.
59
Gambar 3. 23 Membership function delta error 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
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.
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.
63
Gambar 3. 27 Flow set timer.
64
Berikut adalah flow force on dan force stop yang sudah dihubungkan antar
flownya dapat dilihat pada Gambar 3.30.
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.
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.
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.
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.
70
Gambar 3. 39 Perintah untuk membuat database.
71
BAB IV HASIL PENGUJIAN DAN ANALISIS
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.
73
4.1.2. Hasil Pengimplemantasian Perangkat Pada Plant
Berikut adalah penempatan modul input, main board, dan modul output pada plant
hidroponik.
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.
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.
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)
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)
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
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.
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.
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.
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%.
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)
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.
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)
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.
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)
Gambar 4. 10 Respon transien kendali close loop dengan set point 1300.
Tabel 4. 7 Performasi kendali TDS close loop dengan set point 1300.
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)
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.
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)
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.
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.
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.
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)
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.
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
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.
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)
Tabel 4. 13 Performasi kendali pH naik fuzzy logic dengan set point 5,5.
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)
Tabel 4. 14 Performasi kendali pH naik fuzzy logic dengan set point 6,0.
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)
Tabel 4. 15 Performasi kendali pH naik fuzzy logic dengan set point 6,5.
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
Tabel 4. 16 Performasi kendali pH turun fuzzy logic dengan nilai awal 5,5 dan set
point 5,0..
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
Tabel 4. 17 Performasi kendali pH turun fuzzy logic dengan nilai awal 6,0 dan set
point 5,0.
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.
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.
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.
96
Gambar 4. 24 Tampilan dashboard jika diakses melalui dekstop.
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.
98
Gambar 4. 27 Pengiriman data timer 1 melalui dashboard.
99
Gambar 4. 30 Pengiriman data timer 2 melalui dashboard.
100
Gambar 4. 33 Pengiriman data timer 3 melalui dashboard.
101
Gambar 4. 36 Pengiriman data set point melalui dashboard.
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.
103
Gambar 4. 40 Isi tabel pengukuran pH pada database.
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.
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
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
A-1
LAMPIRAN B
KALIBRASI SENSOR
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"
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);
}
C-2
}
Data[len] = '\0';
return String(Data);
}
return float_data;
}
#define tds_servo_pin 19
Servo ArmServo;
delay(500);
}
C-3
}
#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
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++;
}
buffer_index_adc = 0;
adc_value_ph_temp = 0;
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
void tds_control_setup() {
pinMode(in_M3, OUTPUT);
pinMode(water_pump, OUTPUT);
digitalWrite(water_pump, HIGH);
}
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
void ph_control_setup() {
pinMode(in_M1, OUTPUT);
pinMode(in_M2, OUTPUT);
}
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 ***//
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);
}
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_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++;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Connecting Fail");
delay(500);
ESP.restart();
}
}
}
void wifi_loop() {
if (WiFi.status() != WL_CONNECTED) {
wifi_setup();
}
}
WiFiClient MQTTclient;
C-14
PubSubClient client(MQTTclient);
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);
while (!client.connected()) {
String client_ID = "esp32-client";
C-15
void mqtt_loop() {
if (!client.connected()) {
mqtt_setup();
}
client.loop();
}
WiFiUDP ntpUDP;
NTPClient time_client(ntpUDP, "pool.ntp.org", 25200);
void time_setup() {
time_client.begin();
}
void time_loop() {
time_client.update();
epochTime = time_client.getEpochTime();
}
C-16
}
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;
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 (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;
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;
C-22
return data_value;
}
return data_state;
}
float derror_tds_value;
float derror_ph_value;
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;
}
void timercontrol_tds() {
tds_threshold_n = setpoint_tds - (setpoint_tds * 0.05);
tds_threshold_p = setpoint_tds + (setpoint_tds * 0.05);
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);
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);
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);
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;
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;
C-29
float sedang = 1000.0;
float lama = 2000.0;
} TIME_PPM;
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;
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);
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);
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;
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);
}
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);
}
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);
}
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;
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);
}
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);
}
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);
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);
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;
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();
C-46