Tugas Besar Mikrokontroler




KONTROL HIDROPONIK TANAMAN SELADA

1. Pendahuluan [Kembali]

Pertanian modern semakin mengeksplorasi potensi teknologi untuk meningkatkan efisiensi dan produktivitas, dan salah satu inovasi menarik dalam konteks ini adalah proyek hidroponik pintar selada. Dengan mengintegrasikan konsep hidroponik, yang merupakan metode pertanian tanpa tanah, dengan teknologi mikrokontroler dan berbagai sensor seperti turbidity, LDR, DHT11, water level, dan pH sensor, proyek ini bertujuan menciptakan sistem pertanian yang cerdas dan terotomatisasi. Mikrokontroler bertindak sebagai otak sistem, memproses data dari berbagai sensor untuk mengontrol dan mengatur lingkungan pertumbuhan tanaman secara akurat.

Melalui proyek ini, kita tidak hanya dapat memantau kondisi lingkungan, seperti tingkat kecerahan, suhu, kelembaban udara, tingkat air, dan keasaman tanah, tetapi juga dapat mengambil tindakan korektif secara otomatis. Hasilnya, diharapkan bahwa proyek hidroponik pintar ini tidak hanya meningkatkan hasil panen selada, tetapi juga memberikan solusi pertanian yang efisien dan berkelanjutan. Dengan menggunakan teknologi ini, kita dapat menjawab tantangan pertanian masa depan dan menciptakan pola pertanian yang lebih cerdas dan ramah lingkungan.

2. Tujuan [Kembali]

1. Memahami prinsip-prinsip dasar mikrokontroler dan kemampuan pengontrolan mereka dalam konteks sistem hidroponik.
2.Menciptakan solusi pertanian yang efisien dan berkelanjutan melalui penggunaan teknologi mikrokontroler, yang dapat menjadi model bagi pertanian masa depan.

3. Memberikan kesempatan kepada mahasiswa untuk merancang, memprogram, dan mengintegrasikan komponen mikrokontroler dan sensor dalam proyek pertanian.

3. Alat dan Bahan [Kembali]
A. Alat
  • Power Supply


Spesifikasi : 
Input voltage: 5V-12V
Output voltage: 5V
Output Current: MAX 3A
Output power:15W
conversion efficiency: 96%

      Battery


Spesifikasi

 


B Bahan

  • Relay


Pengertian dan Cara Kerja Relay | Panduan Teknisi

Spesifikasi tipe relay: 5VDC-SL-C

Tegangan coil: DC 5V

Struktur: Sealed type

Sensitivitas coil: 0.36W

Tahanan coil: 60-70 ohm

Kapasitas contact: 10A/250VAC, 10A/125VAC, 10A/30VDC, 10A/28VDC

Ukuran: 196154155 mm

Jumlah pin: 5

  • Motor DC 


Motor DC dan Jenis-jenisnya – Himpunan Mahasiswa Teknik Komputer

    • Dioda 10A01


    Spesifikasi


 
  • Resistor

Spesifikasi


  • LED


Spesifikasi
  • LCD 16 x 2


  • Arduino




  • Sensor Water Level
  • Sensor pH meter

  • Sensor DHT 11
  • Sensor LDR

  • Sensor Turbidity



4. Dasar Teori [Kembali]

  • Resistor

Resistor merupakan komponen elektronika dasar yang digunakan untuk membatasi jumlah arus yang mengalir dalam satu rangkaian.Sesuai dengan namanya, resistor bersifat resistif dan umumnya terbuat dari bahan karbon. Resistor memiliki simbol seperti gambar dibawah ini :


Simbol Resistor 
Resistor mempunyai nilai resistansi (tahanan) tertentu yang dapat memproduksi tegangan listrik di antara kedua pin dimana nilai tegangan terhadap resistansi tersebut berbanding lurus dengan arus yang mengalir, berdasarkan persamaan Hukum OHM :

Dimana V adalah tegangan,  I adalah kuat arus, dan R adalah Hambatan.

Di dalam resistor, terdapat ketentuan untuk membaca nilai resistor yang diwakili dengan kode warna dengan ketentuan di bawah ini :




Sebagian besar resistor yang kita lihat memiliki empat pita berwarna . Oleh karena itu ada cara membacanya seperti ketentuan dibawah ini :
1. Dua pita pertama dan kedua menentukan nilai dari resistansi
2. Pita ketiga menentukan faktor pengali, yang akan memberikan nilai resistansi.
3. Dan terakhir, pita keempat menentukan nilai toleransi.

Rumus Resistor:
Seri : Rtotal = R1 + R2 + R3 + ….. + Rn
Dimana :
Rtotal = Total Nilai Resistor
R1 = Resistor ke-1
R2 = Resistor ke-2
R3 = Resistor ke-3
Rn = Resistor ke-n

Paralel: 1/Rtotal = 1/R1 + 1/R2 + 1/R3 + ….. + 1/Rn

Dimana :
Rtotal = Total Nilai Resistor
R1 = Resistor ke-1
R2 = Resistor ke-2
R3 = Resistor ke-3
Rn = Resistor ke-n

  • Baterai
Baterai (Battery) adalah sebuah sumber energi yang dapat merubah energi kimia yang disimpannya menjadi energi listrik yang dapat digunakan seperti perangkat elektronik. Daya tahan baterai akan semakin awet jika penggunaan arusnya semakin kecil, pada contoh diatas jika arus yang diperlukan misalnya adalah 190mAH maka baterai tadi akan bertahan selama 10 jam karena pada perhitungannya :

190 mAH x 10 hours = 1900 mAH

Oleh karena itu pada spesifikasi baterai semakin tinggi atau semakin besar kapasitas arus mAH nya maka semakin lama juga umur dari baterai tersebut. Baterai AA biasanya adalah jenis yang memiliki arus paling kecil sedangkan type D bisa bertahan cukup lama karena dari segi fisik pun memang lebih besar dan pastinya lebih mahal.



  • Relay


Relay adalah komponen elektronika berupa saklar elektronik yang digerakkan oleh aruslistrik. Secara prinsip, relay merupakan tuas saklar dengan lilitan kawat pada batang besi (solenoid) di dekatnya.Ketika solenoid dialiri aruslistrik, tuasa kantertarik karena adanya gaya magnet yang terjadi pada solenoid sehingga kontak saklarakan menutup. Pada saat arus ihentikan, gaya magnet akan hilang, tuasakan kembalikeposisi semula dan konta ksaklar kembali terbuka.Relay biasanya digunakan untuk menggerakkan arus / tegangan yang besar (misalnyaperalatanlistrik 4 A / AC 220 V) denganmemakaiarus / tegangan yang kecil (misalnya 0.1 A / 12 Volt DC).

 

Gambar Bentuk dan Simbol Relay






Fungsi-fungsi dan Aplikasi Relay

Beberapa fungsi Relay yang telah umum diaplikasikan kedalam peralatan Elektronika diantaranya adalah :
    • Relay digunakan untuk menjalankan Fungsi Logika (Logic Function)
    • Relay digunakan untuk memberikan Fungsi penundaan waktu (Time Delay Function)
    • Relay digunakan untuk mengendalikan Sirkuit Tegangan tinggi dengan bantuan dari Signal Tegangan rendah.
    • Ada juga Relay yang berfungsi untuk melindungi Motor ataupun komponen lainnya dari kelebihan Tegangan ataupun hubung singkat (Short).

  • Motor DC

Motor terdiri atas 2 bagian utama yaitu stator dan motor. Pada stator terdapat lilitan (winding) atau magnet permanen, sedangkan rotor adalah bagian yang dialiri dengan sumber arus DC. Arus yang melalui medan magnet inilah yang menyebabkan rotor dapat berputar. Arah gaya elektromagnet yang ditimbulkan akibat medan magnet yang dilalui oleh arus dapat ditentukan dengan menggunakan kaidah tangan kanan.



          


Keuntungan utama motor DC adalah sebagai pengendali kecepatan, yang tidak mempengaruhi kualitas pasokan daya. Motor ini dapat dikendalikan dengan mengatur:
• Tegangan dinamo : meningkatkan tegangan dinamo akan meningkatkan kecepatan
• Arus medan : menurunkan arus medan akan meningkatkan kecepatan.

Mekanisme Kerja Motor D

Mekanisme kerja untuk seluruh jenis motor secara umum sama
  • Arus listrik dalam medan magnet akan menimbulkan gaya.
  • Jika kawat yang membawa arus dibengkokkan menjadi sebuah lingkaran/loop, maka kedua sisi loop yaitu pada sudut kanan medan magnet akan mendapat gaya pada arah yang berlawanan.
  • Pasangan gaya menghasilkan torsi untuk memutar kumparan.
  • Motor- motor memiliki beberapa loop pada dinamonya untuk memberikan tenaga putar yang lebih seragam dari medan magnetnya dihasilkan oleh susunan elektromagnetik yang disebut kumparan medan


  • Dioda

   

Dioda adalah komponen elektronika yang terdiri dari dua kutub dan berfungsimenyearahkan arus. Komponen ini terdiri dari penggabungan dua semikonduktor yang masing-masing diberi doping (penambahan material) yang berbeda, dan tambahan material konduktor untuk mengalirkan listrik.Dioda memiliki simbol sebagai berikut :

 



Secara sederhana, cara kerja dioda dapat dijelaskan dalam tiga kondisi, yaitu kondisi tanpa tegangan (unbiased), diberikan tegangan positif (forward biased), dan tegangan negatif (reverse biased).

A. Kondisi tanpa tegangan
Pada kondisi tidak diberikan tegangan akan terbentuk suatu perbatasan medan listrik pada daerah P-N junction. Hal ini terjadi diawali dengan proses difusi, yaitu bergeraknya muatan elektro dari sisi n ke sisi p. Elektron-elektron tersebut akan menempati suatu tempat di sisi p yang disebut dengan holes. Pergerakan elektron-elektron tersebut akan meninggalkan ion positif di sisi n, dan holes yang terisi dengan elektron akan menimbulkan ion negatif di sisi p. Ion-ion tidak bergerak ini akan membentuk medan listrik statis yang menjadi penghalang pergerakan elektron pada dioda.

B. Kondisi tegangan positif (Forward-bias)
Pada kondisi ini, bagian anoda disambungkan dengan terminal positif sumber listrik dan bagian katoda disambungkan dengan terminal negatif. Adanya tegangan eksternal akan mengakibatkan ion-ion yang menjadi penghalang aliran listrik menjadi tertarik ke masing-masing kutub. Ion-ion negatif akan tertarik ke sisi anoda yang positif, dan ion-ion positif akan tertarik ke sisi katoda yang negatif. Hilangnya penghalang-penghalang tersebut akan memungkinkan pergerakan elektron di dalam dioda, sehingga arus listrik dapat mengalir seperti pada rangkaian tertutup.

C. Kondisi tegangan negatif (Reverse-bias)
Pada kondisi ini, bagian anoda disambungkan dengan terminal negatif sumber listrik dan bagian katoda disambungkan dengan terminal positif. Adanya tegangan eksternal akan mengakibatkan ion-ion yang menjadi penghalang aliran listrik menjadi tertarik ke masing-masing kutub. Pemberian tegangan negatif akan membuat ion-ion negatif tertarik ke sisi katoda (n-type) yang diberi tegangan positif, dan ion-ion positif tertarik ke sisi anoda (p-type) yang diberi tegangan negatif. Pergerakan ion-ion tersebut searah dengan medan listrik statis yang menghalangi pergerakan elektron, sehingga penghalang tersebut akan semakin tebal oleh ion-ion. Akibatnya, listrik tidak dapat mengalir melalui dioda dan rangkaian diibaratkan menjadi rangkaian terbuka.

 

  • LCD 16 x 2

LCD singkatan liquid crystal display. LCD adalah salah satu jenis modul tampilan elektronik yang digunakan dalam berbagai aplikasi seperti berbagai rangkaian & perangkat seperti ponsel, kalkulator, komputer, perangkat TV, dll.

Pin Diagram LCD 16x2

Pinout LCD 16x2 ditunjukkan di bawah ini.

    • Pin1 (Ground / Source Pin): Ini adalah pin tampilan GND, digunakan untuk menghubungkan terminal GND unit mikrokontroler atau sumber daya.
    • Pin2 (VCC / Source Pin): Ini adalah pin catu tegangan pada layar, digunakan untuk menghubungkan pin catu daya dari sumber listrik.
    • Pin3 (V0 / VEE / Control Pin): Pin ini mengatur perbedaan tampilan, yang digunakan untuk menghubungkan POT yang dapat diubah yang dapat memasok 0 hingga 5V.
    • Pin4 (Register Select / Control Pin): Pin ini berganti-ganti antara perintah atau data register, digunakan untuk menghubungkan pin unit mikrokontroler dan mendapatkan 0 atau 1 (0 = mode data, dan 1 = mode perintah).
    • Pin5 (Pin Baca / Tulis / Kontrol): Pin ini mengaktifkan tampilan di antara operasi baca atau tulis, dan terhubung ke pin unit mikrokontroler untuk mendapatkan 0 atau 1 (0 = Operasi Tulis, dan 1 = Operasi Baca).
    • Pin 6 (Mengaktifkan / Mengontrol Pin): Pin ini harus dipegang tinggi untuk menjalankan proses Baca / Tulis, dan terhubung ke unit mikrokontroler & terus-menerus dipegang tinggi.
    • Pin 7-14 (Pin Data): Pin ini digunakan untuk mengirim data ke layar. Pin ini terhubung dalam mode dua-kawat seperti mode 4-kawat dan mode 8-kawat. Dalam mode 4-kawat, hanya empat pin yang terhubung ke unit mikrokontroler seperti 0 hingga 3, sedangkan dalam mode 8-kawat, 8-pin terhubung ke unit mikrokontroler seperti 0 hingga 7.
    • Pin15 (+ve pin LED): Pin ini terhubung ke +5V
    • Pin 16 (-ve pin LED): Pin ini terhubung ke GND.

Fitur LCD 16x2

    • Tegangan operasi LCD ini adalah 4.7V-5.3V
    • Ini termasuk dua baris di mana setiap baris dapat menghasilkan 16 karakter.
    • Pemanfaatan arus adalah 1mA tanpa backlight
    • Setiap karakter dapat dibangun dengan kotak 5 × 8 piksel
    • Huruf & angka LCD alfanumerik
    • Tampilan ini dapat bekerja pada dua mode seperti 4-bit & 8-bit
    • Ini dapat diperoleh dalam Backlight Biru & Hijau
    • Ini menampilkan beberapa karakter yang dibuat khusus
16x2 LCD Display Module row & column
Layar LCD 16 x 2 ini memiliki 16 Kolom dan 2 Baris . Baris ke-1 dari modul ini memiliki total 16 kolom 0 hingga 15 dan posisi baris pertama adalah 0. Juga, baris ke-2 memiliki total 16 kolom 0 hingga 15 dan posisi baris kedua adalah posisi 1. Jadi jumlah total kolom adalah 16 x 2 = 32. Ini berarti modul LCD 16 x 2 dapat menampilkan 32 karakter secara bersamaan.
  • Arduino Uno

 

Arduino merupakan rangkaian elektronik open source yang di dalamnya terdapat komponen utama, yaitu sebuah chip mikrokontroler dengan jenis AVR. Mikrokontroler adalah chip atau IC (integrated circuit) yang bisa diprogram menggunakan komputer. Tujuan memberikan program pada mikrokontroler adalah agar rangkaian elektronik dapat membaca input, memproses input dan kemudian menghasilkan output sesuai yang diinginkan. Mikrokontroler bertugas sebagai „otak‟ yang mengendalikan input, proses dan output sebuah rangkaian elektronik.


Konfigurasi Pin ATMega328P
 
ATMega328P mempunyai kaki standar 28 pin yang mempunyai fungsi yang berbeda-beda baik sebagai port ataupun sebagai fungsi yang lain. Konfigurasi 28 pin tersebut antara lain :
 
Konfigurasi Pin ATMega328P
 
1. VCC merupakan pin yang berfungsi sebagai masukan catu daya.
 
2. GND merupakan pin Ground.
 
3. Port B (PB0 – PB7) merupakan pin masukan/keluaran dua arah (full duplex) dan masing-masing port memiliki fungsi khusus.
 
4. Port C (PC0 – PC6) merupakan pin masukan/keluaran dua arah (full duplex) dan masing-masing port memiliki fungsi khusus.
 
5. Port D (PD0 – PD7) merupakan pin masukan/keluaran dua arah (full duplex) dan masing-masing port memiliki fungsi khusus.
 
6. RESET merupakan pin yang digunakan untuk mengatur atau menjalankan ulang program awal yang sudah dimasukkan ke mikrokontroler.
 
7. XTAL1 dan XTAL2, merupakan pin masukan external clock.
 
8. AVCC merupakan pin masukan tegangan ADC (Analog-Digital Converter).
 
9. AREF merupakan pin masukan referensi tegangan ADC. 

 

  • Sensor pH
Sensor pH merupakan ini digunakan untuk mengukur kadar pH yang terkandung pada tanki air hidroponik. Sensor ini beroperasi pada tegangan 3.4 hingga 5 Volt dan suhu operasi 5 hingga 60 derajat celcius. Sensor pH digunakan untuk mengukur kandungan asam pada tank nutrisi air pada kebun hidroponik.



Sensor pH meter merupakan suatu sensor yang dapat melakukan pengukuran tingkat kadar keasaman atau kebasaan yang dimiliki oleh cairan/larutan. Cara bekerja dari sensor pH air yang utama berada di bagian sensor probe dengan material terbuat dari elektroda kaca, dimana pada elektroda kaca tersebut terdapat larutan HCL yang terdapat pada bagian ujung sensor probe, sensor probe tersebit akan mengukur besaran nilai ion H3O + pada suatu larutan sehingga dapat mengetahui kadar PH pada suatu larutan/cairan[8]. Elektroda sensor pada sensor PH air terbentuk dari bahan lapisan kaca yang sensitif dengan impendasi yang kecil oleh sebab itu dapat mendapatkan hasil pembacaaan dan penilaian yang stabil dan cepat pada suhu cairan/larutan tinggi maupun rendah. Hasil dari pembacaan nilai sensor PH bisa didapatkan oleh mikrokontroler dengan menggunakan antarmuka PH 2.0 yang sudah ada pada modul sensor PH air. Sensor PH air ini sangat baik untuk digunakan dalam melakukan pembacaan kadar PH cairan dengan interval waktu yang lama.
Grafik respon sensor PH adalah :

Sensor pH adalah sensor yang digunakan untuk mengetahui derajat keasaman. pH meter adalah alat yang digunakan untuk mengukur tingkat keasaman atau kebasaan larutan. Prinsip utama kerja pH meter adalah terletak pada sensor probe berupa elektroda kaca (glass electrode) dengan jalan mengukur jumlah ion H30+ di dalam larutan. Dalam penggunaannya, sensor pH perlu dikalibrasi berkala agar keakuratannya dapat terjaga. Beberapa produsen sensor pH pada umumnya menyertakan instrumen untuk melakukan kalibrasi secara manual. Jika sensor pH dihubungjan dengan Arduino Uno, kalibrasi dapat dilakukan melalui program antarmuka kalibrasi sensor pH (pengembangan dari library sensor pH yang sudah tersedia). Hasil kalibrasi tersebut kemudian disimpan dalam EEPROM agar dapat digunakan untuk pengukuran normal.

Spesifikasi:
- Catu Daya 5 V
- Ukuran Modul: 43 mm x 32 mm
- Jangkauan Pengukuran: 0 - 14 pH
- Temperatur Kerja: 0°C - 60°C
- Akurasi: ± 0.1 pH (25°C)
- Respon Waktu: = 1 menit
- Jenis Konektor: BNC
- Antarmuka: PH 2.0
- Gain Adjustment: Potensiometer
- Indikator Daya: LED


 

  • Sensor Water Level
Water Level Sensor adalah alat yang digunakan untuk memberikan signal kepada alarm / automation panel bahwa permukaan air telah mencapai level tertentu. Sensor akan memberikan signal dry contact (NO/NC) ke panel. Detector ini bermanfaat untuk memberikan alert atau untuk menggerakkan perangkat automation lainnya. Water sensor ini telah dilengkapi dengan built-in buzzer yang berbunyi pada saat terjadi trigger. Sensor ketinggian air biasanya digunakan untuk menghitung ketinggian air di sungai, danau, atau tangki air. Sensor ini sangat mudah untuk dibuat karena bahan - bahanya sederhana.

Cara Kerja Sensor
Water level merupakan sensor yang berfungsi untuk mendeteksi ketinggian air dengan output analog kemudian diolah menggunakan mikrokontroler. Cara kerja sensor ini adalah pembacaan resistansi yang dihasilkan air yang mengenai garis lempengan pada sensor. Cara kerja sensor ini adalah pembacaan resistansi yang dihasilkan air yang mengenai garis lempengan pada sensor. Semakin banyak air yang mengenai lempengan tersebut, maka nilai resistansinya akan semakin kecil dan sebaliknya. Sensor memiliki sepuluh jejak tembaga yang terbuka, lima di antaranya adalah jejak daya dan lima lainnya adalah jejak indera. Jejak-jejak ini terjalin sehingga ada satu jejak indera di antara setiap dua jejak kekuatan. Biasanya, jejak kekuatan dan indera tidak terhubung, tetapi ketika direndam dalam air, keduanya dijembatani. Pengoperasian sensor ketinggian air cukup sederhana. Jejak daya dan indra membentuk resistor variabel (seperti potensiometer) yang resistansinya bervariasi berdasarkan seberapa banyak mereka terpapar air.
Grafik Water Level Sensor


Pengoperasian sensor ketinggian air cukup sederhana.
Jejak daya dan indra membentuk resistor variabel (seperti potensiometer) yang resistansinya bervariasi berdasarkan seberapa banyak mereka terpapar air.



Resistensi ini berbanding terbalik dengan kedalaman pencelupan sensor dalam air : Semakin banyak air yang dibenamkan sensor, semakin baik konduktivitasnya dan semakin rendah resistansinya. Semakin sedikit air yang dibenamkan sensor, semakin buruk konduktivitasnya dan semakin tinggi resistansinya. Sensor menghasilkan tegangan output yang sebanding dengan resistansi; dengan mengukur tegangan ini, ketinggian air dapat ditentukan.




Sensor ketinggian air biasanya digunakan untuk menghitung ketinggian air di sungai, danau, atau tangki air. Sensor ini sangat mudah untuk dibuat karena bahan - bahanya sederhana. Water level sensor yang dibuat sekarang terbuat dari sensor magnet, magnet, bandul dan pipa.


Cara Kerja Sensor


Pada saat ketinggian air naik, maka secara otomatis bandul bermagnet akan ikut terangkat juga, dan ketika magnet berada pada level sensor berikutnya maka sensor tersebut akan aktif dan menyalakan lampu atau peralatan lainya.


SPESIFIKASI :
Tegangan kerja: 3-5 VDC nArus kerja: < 20mA.
Tipe sensor: analog.
Max output: 2.5v (saat sensor terendam semua)
Luas area deteksi: 16x40mm nSuhu kerja: 10-30 C.
Ukuran: 20x62x8 mm.
  • Sensor DHT11
Sensor DHT11 merupakan salah satu dari beberapa sensor suhu jenis DHT. Sensor ini dapat mengukur data kelembaban beserta suhu, kemudian data yang diperoleh, secara otomatis setiap 2 detil sekali sensor ini akan mengirimkan sinyal data ke pinout data pada sensor tersebut. Sensor ini beroperasi pada tegangan 3 hingga 5 Volt DC dengan arus maksimal 2.5 mili ampere. Suhu yang dapat diukur oleh sensor ini berkisar antara - 40 hingga 80 derajat celcius, dan kelembaban dari 0 hingga 100%. Sensor DHT22 yang merupakan sensor kelembaban adalah konsentrasi uap air yang ada di dalam air. Uap air, merupakan bentuk gas dari air, umumnya tidak terlihat oleh mata manusia. Konsumsi arus pada saat pengukuran antara 1 hingga 1,5 mA. Konsums iarus pada mode siaga adalah 40 sampai 50 mA. Sinyal keluaran digital lewat bus tunggal dengan kecepatan 5 ms / operasi (MSB-first). Sensitivitas sebesar 0,1% untuk pengukuran suhu dan kelembaban.
DHT11 merupakan sebuah sensor kelembaban dan suhu, komponen ini mempunyai output sinyal digital yang dikalibrasi dengan sensor kelembaban dan suhu yang kompleks,sinyal transmisi jarak pada ruangan hingga 20 meter.
Cara kerja dari rangkaian ini sangat sederhana dimana sensor DHT11/22 akan mengeluarkan output berupa nilai analog berdasarkan hasil pengukuran suhu dan kelembaban ruangan. Nilai analog ini yang kemudian akan diterjemahkan oleh arduino menjadi nilai suhu (dalam bentuk ºC) dan kelembaban ruangan (dalam bentuk %).

Spesifikasi DHT11:
Tegangan kerja = 3.3V-5V.
Arus maksimum = 2.5mA
Range pengukuran kelembaban = 20%-80%
Akurasi pengukuran kelembaban = 5%
Range pengukuran suhu = 0°C-50°C
Akurasi pengukuran suhu = 2°C
Kecepatan pengambilan sampel tidak lebih dari 1 Hz (setiap detik)
Ukuran = 15.5 mm x 12 mm x 5.5 mm
4 pin dengan jarak 0,1 "

 


 

  • Sensor LDR
LDR atau light Dependent Resistor adalah salah satu jenis resistor yang nilai hambatannya dipengaruhi oleh cahaya yang diterima olehnya. Besarnya nilai hambatan pada LDR tergantung pada besar kecilnya cahaya yang diterima oleh LDR itu sendiri. Resistor peka cahaya atau fotoresistor adalah komponen elektronik yang resistansinya akan menurun jika ada penambahan intensitas cahaya yang mengenainya. Fotoresistor dapat merujuk pula pada light-dependent resistor (LDR), atau fotokonduktor. Fotoresistor dibuat dari semikonduktor beresistansi tinggi yang tidak dilindungi dari cahaya.



Spesifikasi LDR :

Tegangan maksimum (DC): 150V.
Konsumsi arus maksimum: 100mW.
Tingkatan Resistansi/Tahanan : 10Ω sampai 100KΩ
Puncak spektral: 540nm (ukuran gelombang cahaya)
Waktu Respon Sensor : 20ms – 30ms.

Konfigurasi PIN LDR:






Grafik Respon
Penurunan Daya Disipasi

Resistansi

Spectral Respon

Grafik Respon Sensor


  • Sensor Turbidity
Sensor turbidity difungsikan sebagai alat untuk mendeteksi kandungan nutrisi yang tercampur pada air dengan melihat kadar kekeruhan air. Sensor turbidiyty mengukur jumlah cahaya yang dihamburkan oleh padatan tersuspensi dalam cairan, seperti air. Ketika konsentrasi total padatan tersuspensi (TSS) dan total padatan terlarut (TDS) dalam suatu cairan meningkat, maka kekeruhannya juga meningkat.

Sensor kekeruhan digunakan untuk mengukur kekeruhan atau kekaburan (kekeruhan) suatu cairan, biasanya untuk menentukan kualitas air .

Untuk sampel dengan jumlah TSS dan TDS yang tinggi, perbedaan intensitas cahaya dari pancaran transmisi diukur untuk mendapatkan hasil kekeruhan, sedangkan hamburan cahaya lebih cocok untuk sampel dengan jumlah TSS dan TDS yang rendah. Karena sensor kekeruhan menggunakan cahaya untuk mendeteksi tingkat kekeruhan larutan, penting untuk mengurangi jumlah cahaya eksternal saat menggunakan sensor.

 

 

Sensor kekeruhan total padatan padat/tersuspensi menggunakan cahaya yang dihamburkan ke belakang, terdiri dari dua detektor cahaya dan lampu LED yang diposisikan pada sudut 90° dan 135°.Kekeruhan larutan dan jumlah TSS yang ada dihitung ketika detektor menerima jumlah cahaya yang dihamburkan, yang kemudian ditampilkan oleh pemancar dalam satuan yang diinginkan (biasanya g/L atau %TS).Partikel padat apa pun dalam larutan akan menyebabkan cahaya yang dipancarkan oleh lampu LED tersebar secara efektif. 

 

Grafik respon sensor turbidity


5. Percobaan [Kembali]

a. Prosedur[Kembali]
  • Siapkan segala komponen yang di butuhkan
  • Susun rangkaian sesuai panduan
  • Input codingan arduino
  • Hidupkan rangkaian
  • Apabila tidak terjadi eror, maka rangkaian selesai dibuat.

b. Hardware dan Diagram Blok[Kembali]

 

c. Rangkaian Simulasi dan Prinsip Kerja[Kembali]

 




Sensor LDR (Light Dependent Resistor): 

Ketika LDR mendeteksi tingkat cahaya, output sensor akan masuk ke kaki A2. Kemudian, arduino akan membaca nilai analog dari sensor LDR dan disimpan dalam variabel ldrSensorValue. Selanjutnya, nilai tersebut dikonversi menjadi tegangan (voltage) dengan memanfaatkan skala nilai output sensor LDR (0 hingga 1023) ke tegangan (0 hingga 5V). Tegangan hasil konversi tersebut kemudian digunakan untuk menentukan apakah intensitas cahaya di sekitar mencukupi. Jika tegangan kurang dari atau sama dengan 2V, sistem mengaktifkan LED yang terhubung dengan kaki 11 pada arduino dan menampilkan pesan di LCD yang menyatakan "Cahaya kurang" dan "LED hidup". Sebaliknya, jika tegangan lebih dari 2V, sistem mematikan LED yang terhubung dengan kaki 11 pada arduino dan menampilkan pesan "Cahaya cukup" serta "LED Mati" di LCD.


Sensor DHT11 (Suhu dan Kelembaban):  

Sensor DHT11 memonitoring suhu dan kelembaban di sekitar tanaman. Sensor DHT11 terhubung dengan kaki A0 dan arduino akan membaca nilai analog dari suhu (temperature) dan kelembaban sensor DHT. Nilai-nilainya disimpan dalam variabel `t` dan `h`. Selanjutnya, nilai kelembaban dan suhu tersebut ditampilkan di Serial Monitor untuk pemantauan. Selanjutnya, dilakukan beberapa pengecekan kondisi. Jika nilai kelembaban (`h`) kurang dari 65, maka motor humidifier diaktifkan dan pesan "Humidifier Hidup" ditampilkan di LCD. Jika kelembaban lebih besar atau sama dengan 65, motor humidifier dimatikan. Sementara itu, jika suhu (`t`) lebih besar dari 28, motor AC dihidupkan dan teks "AC Hidup" ditampilkan di LCD. Sebaliknya, jika suhu kurang dari 28, motor AC dimatikan.


 

Sensor Air (Water Level):  

Sensor water level akan membaca tinggi air media tanam selada. Sensor water level terhubung dengan kaki A3. nilai analog dari sensor tinggi air dibaca menggunakan `analogRead` dan disimpan dalam variabel `Water`. Nilai tersebut kemudian diubah ke dalam rentang persentase (0-100) menggunakan fungsi `map`. Dikarenakan selada efektif tumbuh pada media tanam air setinggi 4 cm, ketika tinggi air kurang dari persentase 63% atau setara dengan 4 cm, motor pompa diaktifkan untuk menambahkan air, dan pesan "Air ditambahkan" ditampilkan di LCD. Sebaliknya, jika persentase tinggi air lebih besar atau sama dengan 63%, motor pompa dimatikan. Selanjutnya, tinggi air dihitung berdasarkan persentase tinggi air dan ditampilkan di Serial Monitor.


 

Sensor Kekeruhan (Turbidity): 

Sensor turbidity akan mengukur kadar nutrisi pada tanaman selada yang terhubung dengan kaki A4 Arduini. Ketika sensor turbidity memberikan inputan kepada arduino, arduino akan membaca nilai analog dari sensor turbidity menggunakan `analogRead` dan disimpan dalam variabel `turbidityValue`. Nilai analog turbidity dikonversi ke dalam tegangan menggunakan rumus (5.0 / 1024.0) * turbidityValue; dan nilai turbidity (NTU) dihitung berdasarkan rumus -(1120.4 * pow(turbidity, 2) - 5742.3 * turbidity + 3702.9);.Dikarenakan PPM = 1/3 NTU. Kemudian, dilakukan pengecekan apakah nilai PPM kurang dari 560. Jika kondisi tersebut terpenuhi, motor nutrisi diaktifkan dengan menyetel pin MotorNutrisi ke HIGH, dan pesan "Nutrisi ditambahkan" ditampilkan di LCD. Jika nilai PPM tidak kurang dari 560, motor nutrisi dimatikan dengan menyetel pin MotorNutrisi ke LOW.


Sensor pH: 

Sensor pH akan mengukur pH tanaman selada yang terhubung dengan kaki A1 arduino. Arduino akan membaca nilai dari sensor pH. Pertama, terdapat loop `for` pertama yang berjalan 10 kali. Pada setiap iterasi, nilai analog dari sensor pH dibaca menggunakan fungsi `analogRead(SensorpH)` dan disimpan dalam array `buffer_arr` pada indeks ke-i. Terdapat juga penundaan eksekusi program selama 30 milidetik (`delay(30)`) untuk memastikan pembacaan yang stabil. Selanjutnya, ada loop `for` bersarang yang berfungsi untuk menyortir nilai-nilai dalam array `buffer_arr` dari yang terkecil hingga terbesar menggunakan metode *Bubble Sort*. Proses sorting ini membantu mendapatkan nilai tengah yang lebih stabil dan representatif. Setelah penyortiran, dilakukan inisialisasi variabel `avgval` ke nilai 0. Terdapat loop `for` kedua yang berjalan dari indeks 2 hingga 7 (enam nilai tengah setelah penyortiran). Setiap nilai dari array `buffer_arr` pada indeks tersebut ditambahkan ke `avgval`. Nilai rata-rata ini kemudian dihitung dan diubah ke dalam volt dengan mengonversi nilai ke dalam rentang 0-5V. Setelah mendapatkan nilai volt, nilai pH dihitung menggunakan rumus -5.70 * volt + calibration_value, yang mencakup faktor kalibrasi. Nilai pH ini kemudian ditampilkan di Serial Monitor menggunakan `Serial.print` dan `Serial.println`. Selanjutnya, terdapat serangkaian kondisi `if` yang memeriksa nilai pH dan mengambil tindakan berdasarkan kondisi tersebut. Jika nilai pH berada di antara 6 dan 7, kedua motor (HCL dan KOH) dimatikan. Jika nilai pH lebih dari 7, motor HCL dimatikan dan motor KOH diaktifkan.


d. Flowchart dan Listing Program[Kembali]

A. Flowchart

Gambar Rangkaian Visual Designer

Flowchart Setup dan Loop

Flowchart Sensor LCD

Flowchart Sensor DHT11

Flowchart Sensor Water

Flowchart Sensor Turbidity

Flowchart pH
 

B. Listing Program



#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

#include <DHT.h>

#define DHTPIN A0
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

const int MotorPompa = 8;
const int MotorHCL = 9;
const int MotorKOH = 10;
const int LEDLDR = 11;
const int MotorNutrisi = 12;
const int MotorAC = 13;
const int MotorHumidifier = A5;

const int SensorDHT =A0;
const int SensorTurbidity = A4;
const int SensorLDR = A2;
const int SensorpH = A1;
const int SensorWater = A3;

float turbidityValue = 0;

float calibration_value = 21.34;
float phval = 0;
unsigned long int avgval;
int buffer_arr[10], temp;

const int Water = 0;

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);

  pinMode(SensorDHT, INPUT);
  pinMode(SensorTurbidity, INPUT);
  pinMode(SensorLDR, INPUT);
  pinMode(SensorpH, INPUT);
  pinMode(SensorWater, INPUT);
  
  pinMode(MotorPompa, OUTPUT);
  pinMode(LEDLDR, OUTPUT);
  pinMode(MotorHCL, OUTPUT);
  pinMode(MotorKOH, OUTPUT);
  pinMode(MotorHumidifier, OUTPUT);
  pinMode(MotorAC, OUTPUT);
  pinMode(MotorNutrisi, OUTPUT);
  
  dht.begin();
}

void loop() {

    //LDR
  int ldrSensorValue = analogRead(SensorLDR);
  float voltage = ldrSensorValue * (5.0 / 1023.0);
  
  Serial.print("Tegangan LDR : ");
  Serial.println(voltage);
  if (voltage <= 2) {
    digitalWrite(LEDLDR, HIGH);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Cahaya kurang");
      lcd.setCursor(0,1);
      lcd.print("LED hidup");
      delay(30);
  } else {
     digitalWrite(LEDLDR, LOW);
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Cahaya cukup");
      lcd.setCursor(0,1);
      lcd.print("LED Mati");
      delay(30);
  }

    //DHT11

  float t = dht.readTemperature();
  float h = dht.readHumidity();
 
  Serial.print("Nilai Kelembaban : ");
  Serial.println(h);
  Serial.print("Nilai Suhu : ");
  Serial.println(t);

  if (h < 65) {
    digitalWrite(MotorHumidifier, HIGH);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Humidifier Hidup");
    delay(100);
  }
  if (h >= 65) {
    digitalWrite(MotorHumidifier, LOW);
  }

  if (t > 28) {
    digitalWrite(MotorAC, HIGH);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("AC Hidup");
    delay(100);
  }
  if (t < 28) {
    digitalWrite(MotorAC, LOW);
  }

 //water
int Water = analogRead(SensorWater);

// Konversi nilai sensor ke dalam rentang tinggi air (0-100)
float waterLevelPercentage = map(Water, 0, 1023, 0, 100);

// Jika nilai sensor nol, abaikan atau lakukan sesuatu sesuai kebutuhan
if (Water > 0) {
  Serial.print("Persen Tinggi Air : ");
  Serial.print(waterLevelPercentage);
  Serial.println("%");

  //tinggipipa = 2.5 inchi = 6.35 cm (1 inchi = 2.54)
  //Tinggi optimal tanaman selada = 4 cm
  //Persen tinggi selada optimal = 4 cm * 100/6.35 cm =63%
  if (waterLevelPercentage < 63) { 
    digitalWrite(MotorPompa, HIGH);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Air ditambahkan");
    delay(100);
  } else{
    digitalWrite(MotorPompa, LOW); 
  }

  float TinggiAir = waterLevelPercentage * 6.35/100;
  Serial.print("Tinggi Air : ");
  Serial.print(TinggiAir);
  Serial.println("cm");
}
else {
  Serial.println("Nilai sensor tinggi air kurang dari nol. Melewatkan pembacaan.");
}


//Turbidity
  int turbidityValue = analogRead(SensorTurbidity);

// Jika nilai sensor turbidity nol, abaikan atau lakukan sesuatu sesuai kebutuhan
if (turbidityValue > 0) {
  int turbidity = (5.0 / 1024.0) * turbidityValue;   // convert the analog value to voltage
  float turb = -(1120.4 * pow(turbidity, 2) - 5742.3 * turbidity + 3702.9);

  float PPM = turb/3;

  if (PPM < 560 ) {
    digitalWrite(MotorNutrisi, HIGH);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Nutrisi ditambahkan");
    delay(100);
  } else {
    digitalWrite(MotorNutrisi, LOW);
  }
  
  Serial.print("NTU : ");
  Serial.println(turb);
  Serial.print("PPM : ");
  Serial.println(PPM);

  delay(100); 
}
else {
  Serial.println("Nilai sensor turbidity kurang dari nol. Melewatkan pembacaan.");
}
    
  // pH Sensor
  for (int i = 0; i < 10; i++) {
  buffer_arr[i] = analogRead(SensorpH);
  delay(30);
  }
  
  for (int i = 0; i < 9; i++) {
    for (int j = i + 1; j < 10; j++) {
      if (buffer_arr[i] > buffer_arr[j]) {
        temp = buffer_arr[i];
        buffer_arr[i] = buffer_arr[j];
        buffer_arr[j] = temp;
      }
    }
  }
  avgval = 0;
  for (int i = 2; i < 8; i++){
  avgval += buffer_arr[i];
  float volt = (float)avgval * 5.0 / 1024 / 6;
  phval = -5.70 * volt + calibration_value;} // Convert the millivolt into pH value

  Serial.print("Nilai Sensor pH : ");
  Serial.println(phval);
 

  if (phval <= 7 && phval >= 6) {
    digitalWrite(MotorHCL, LOW);
    digitalWrite(MotorKOH, LOW);
  }
  if (phval > 7) {
    digitalWrite(MotorHCL, LOW);
    digitalWrite(MotorKOH, HIGH);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("KOH ditambahkan");
    delay(100);
  }
  if (phval < 6) {
    digitalWrite(MotorHCL, HIGH);
    digitalWrite(MotorKOH, LOW);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("HCL ditambahkan");
    delay(100);
  }


  delay(100);
}


Penjelasan Program Perbaris

#include <LiquidCrystal.h>
//Baris ini menyertakan library LiquidCrystal untuk mengendalikan display LCD
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
//Membuat objek LiquidCrystal dengan menggunakan pin 2 sebagai RS (Register Select), 3 sebagai Enable, dan 4, 5, 6, 7 sebagai pin data.

#include <DHT.h>
//Baris ini menyertakan library DHT untuk mengakses sensor suhu dan kelembaban DHT.

#define DHTPIN A0
#define DHTTYPE DHT11
//Mendefinisikan pin sensor DHT (A0) dan jenis sensor DHT yang digunakan (DHT11)

DHT dht(DHTPIN, DHTTYPE);
//Membuat objek DHT dengan menggunakan pin yang telah didefinisikan sebelumnya.

//Mendefinisikan pin untuk berbagai perangkat motor dan LED, seperti pompa, motor HCL, motor KOH, LED LDR, motor nutrisi, motor AC, dan humidifier.
const int MotorPompa = 8;
const int MotorHCL = 9;
const int MotorKOH = 10;
const int LEDLDR = 11;
const int MotorNutrisi = 12;
const int MotorAC = 13;
const int MotorHumidifier = A5;

//Mendefinisikan pin untuk berbagai sensor, termasuk sensor DHT, sensor kekeruhan (turbidity), sensor LDR, sensor pH, dan sensor air.
const int SensorDHT =A0;
const int SensorTurbidity = A4;
const int SensorLDR = A2;
const int SensorpH = A1;
const int SensorWater = A3;

float turbidityValue = 0;
//Variabel untuk menyimpan nilai kekeruhan.

//Variabel untuk kalibrasi pH dan penyimpanan nilai sementara.
float calibration_value = 21.34;
float phval = 0;
unsigned long int avgval;
int buffer_arr[10], temp;

const int Water = 0;
//Mendefinisikan konstanta untuk variable water

void setup() { //Fungsi setup() adalah bagian dari program Arduino yang dieksekusi hanya satu kali setelah mikrokontroler dihidupkan.
  Serial.begin(9600);
  //Menginisialisasi komunikasi serial dengan baud rate 9600. Ini memungkinkan Arduino berkomunikasi dengan komputer melalui koneksi serial.
  lcd.begin(16, 2);
  //Inisialisasi objek LCD dengan konfigurasi 16 kolom dan 2 baris.

  //Mendeklarasikan pin sensor sebagai input.
  pinMode(SensorDHT, INPUT);
  pinMode(SensorTurbidity, INPUT);
  pinMode(SensorLDR, INPUT);
  pinMode(SensorpH, INPUT);
  pinMode(SensorWater, INPUT);
 
  //Mendeklarasikan pin sebagai output
  pinMode(MotorPompa, OUTPUT);
  pinMode(LEDLDR, OUTPUT);
  pinMode(MotorHCL, OUTPUT);
  pinMode(MotorKOH, OUTPUT);
  pinMode(MotorHumidifier, OUTPUT);
  pinMode(MotorAC, OUTPUT);
  pinMode(MotorNutrisi, OUTPUT);
 
  dht.begin();
  //Memulai sensor DHT untuk memulai komunikasi
}

void loop() {

//LDR Sensor
  int ldrSensorValue = analogRead(SensorLDR);
  //Membaca nilai analog dari sensor LDR dan menyimpannya dalam variabel `ldrSensorValue`
  float voltage = ldrSensorValue * (5.0 / 1023.0);
  //Mengonversi nilai sensor LDR ke dalam tegangan, dengan asumsi Arduino bekerja pada tegangan 5V dan sensor memberikan keluaran antara 0 dan 1023.
 
  Serial.print("Tegangan LDR : "); //Menampilkan teks "Tegangan LDR : " ke Serial Monitor.
  Serial.println(voltage); //Menampilkan nilai tegangan LDR ke Serial Monitor.
  if (voltage <= 2) {//Jika nilai tegangan LDR kurang dari atau sama dengan 2:
    digitalWrite(LEDLDR, HIGH); //Arduino untuk mengaktifkan perangkat yang terhubung ke pin yang disebut LEDLDR dengan memberikan sinyal tegangan tinggi (5V) pada pin tersebut menggunakan fungsi digitalWrite
      lcd.clear(); //Membersihkan tampilan LCD.
      lcd.setCursor(0,0); //Memindahkan kursor LCD ke posisi baris 1, kolom 1.
      lcd.print("Cahaya kurang"); //Menampilkan teks "Cahaya kurang" di LCD.
      lcd.setCursor(0,1); //Memindahkan kursor LCD ke posisi baris 2, kolom 1.
      lcd.print("LED hidup"); //Menampilkan teks "LED hidup" di LCD.
      delay(30); //Menunda eksekusi program selama 30 milidetik.
  } else { //Jika kondisi if tidak terpenuhi, lanjutkan ke kondisi else
     digitalWrite(LEDLDR, LOW); // Memberi logika nol LED yang terhubung dengan pin LEDLDR.
      lcd.clear(); //Membersihkan tampilan LCD.
      lcd.setCursor(0,0); //Memindahkan kursor LCD ke posisi baris 1, kolom 1.
      lcd.print("Cahaya cukup");//Menampilkan teks "Cahaya cukup" di LCD.
      lcd.setCursor(0,1); //Memindahkan kursor LCD ke posisi baris 2, kolom 1.
      lcd.print("LED Mati"); //Menampilkan teks "LED Mati" di LCD.
      delay(30);//Menunda eksekusi program selama 30 milidetik.
  }

    //DHT11

  float t = dht.readTemperature();
  //Membaca suhu (temperature) dari sensor DHT dan menyimpan nilainya dalam variabel `t`.
  float h = dht.readHumidity();
  //Membaca kelembaban (humidity) dari sensor DHT dan menyimpan nilainya dalam variabel `h`.
 
  Serial.print("Nilai Kelembaban : ");//Menampilkan teks "Nilai Kelembaban : " ke Serial Monitor.
  Serial.println(h); //Menampilkan nilai kelembaban (`h`) ke Serial Monitor dan membuat baris baru.
  Serial.print("Nilai Suhu : "); //Menampilkan teks "Nilai Suhu : " ke Serial Monitor.
  Serial.println(t); //Menampilkan nilai suhu (`t`) ke Serial Monitor dan membuat baris baru.

  if (h < 65) { //Jika nilai kelembaban (`h`) kurang dari 65:
    digitalWrite(MotorHumidifier, HIGH); //Mengaktifkan motor humidifier dengan pin MotorHumidifier berlogika HIGH.
    lcd.clear(); //Membersihkan tampilan LCD
    lcd.setCursor(0,0); //Memindahkan kursor LCD ke posisi baris 1, kolom 1.
    lcd.print("Humidifier Hidup"); //Menampilkan teks "Humidifier Hidup" di LCD.
    delay(100); //Menunda eksekusi program selama 100 milidetik.
  }
  if (h >= 65) {
    //Jika kondisi pertama tidak terpenuhi, memulai blok kondisional kedua. Jika nilai kelembaban (`h`) lebih besar atau sama dengan 65:
    digitalWrite(MotorHumidifier, LOW); //Mematikan motor humidifier dengan pin MotorHumidifier berlogika LOW.
  }

  if (t > 28) {
    // Memulai blok kondisional ketiga. Jika nilai suhu (`t`) lebih besar dari 28:
    digitalWrite(MotorAC, HIGH); //Mengaktifkan motor AC dengan menyetel pin MotorAC ke HIGH.
    lcd.clear(); //Membersihkan tampilan LCD.
    lcd.setCursor(0,0); //Memindahkan kursor LCD ke posisi baris 1, kolom 1.
    lcd.print("AC Hidup"); //Menampilkan teks "AC Hidup" di LCD.
    delay(100); //Menunda eksekusi program selama 100 milidetik.
  }
  if (t < 28) {
    //Jika kondisi ketiga tidak terpenuhi, memulai blok kondisional keempat. Jika nilai suhu (`t`) kurang dari 28:
    digitalWrite(MotorAC, LOW); //Mematikan motor AC dengan menyetel pin MotorAC ke LOW.
  }

 //water
int Water = analogRead(SensorWater);
//Membaca nilai analog dari sensor water dan menyimpannya dalam variabel `Water`

float waterLevelPercentage = map(Water, 0, 1023, 0, 100);
//Mengonversi nilai sensor water ke dalam rentang persentase (0-100). Rentang asli adalah 0 hingga 1023, dan rentang yang diinginkan adalah 0 hingga 100

if (Water > 0) {
  //Jika nilai sensor tinggi air lebih besar dari 0:
  Serial.print("Persen Tinggi Air : "); // Menampilkan teks "Persen Tinggi Air : " ke Serial Monitor.
  Serial.print(waterLevelPercentage); //Menampilkan nilai persentase tinggi air ke Serial Monitor.
  Serial.println("%"); //Menambahkan karakter newline ke Serial Monitor.

  //tinggipipa = 2.5 inchi = 6.35 cm (1 inchi = 2.54)
  //Tinggi optimal tanaman selada = 4 cm
  //Persen tinggi selada optimal = 4 cm * 100/6.35 cm =63%
  if (waterLevelPercentage < 63) { //Jika persentase tinggi air kurang dari 63%:
    digitalWrite(MotorPompa, HIGH); // Mengaktifkan motor pompa dengan pin MotorPompa berlogika HIGH.
    lcd.clear(); //Membersihkan tampilan LCD.
    lcd.setCursor(0,0); //Memindahkan kursor LCD ke posisi baris 1, kolom 1.
    lcd.print("Air ditambahkan"); //Menampilkan teks "Air ditambahkan" di LCD.
    delay(100); //Menunda eksekusi program selama 100 milidetik.
  } else{//Jika kondisi diatas tidak terpenuhi, lanjutkan ke blok else.
    digitalWrite(MotorPompa, LOW);  //Mematikan motor pompa dengan menyetel pin MotorPompa ke LOW.
  }

  float TinggiAir = waterLevelPercentage * 6.35/100;
  //Menghitung tinggi air berdasarkan persentase tinggi air dan mengonversinya ke dalam sentimeter.
  Serial.print("Tinggi Air : ");
  //Menampilkan teks "Tinggi Air : " ke Serial Monitor.
  Serial.print(TinggiAir);
  //Menampilkan nilai tinggi air ke Serial Monitor.
  Serial.println("cm");
  //Menambahkan karakter newline ke Serial Monitor.
}
else { //Jika kondisi diatas tidak terpenuhi, lanjutkan ke blok else.
  Serial.println("Nilai sensor tinggi air kurang dari nol. Melewatkan pembacaan.");
  //Menampilkan pesan kesalahan ke Serial Monitor jika nilai sensor tinggi air kurang dari nol.
}


//Turbidity Sensor
  int turbidityValue = analogRead(SensorTurbidity);
  //Membaca nilai analog dari sensor turbidity dan menyimpannya dalam variabel `turbidityValue`.

if (turbidityValue > 0) { //Jika nilai sensor turbidity lebih besar dari 0:
  int turbidity = (5.0 / 1024.0) * turbidityValue;
  //  Mengonversi nilai analog turbidity ke dalam tegangan (voltage).
  float turb = -(1120.4 * pow(turbidity, 2) - 5742.3 * turbidity + 3702.9);
  //Menghitung nilai turbidity berdasarkan tegangan menggunakan rumus tertentu.
  float PPM = turb/3;
  //Menghitung nilai PPM (parts per million) berdasarkan nilai turbidity.

  if (PPM < 560 ) {//Memulai blok kondisional dalam kondisi sebelumnya. Jika nilai PPM kurang dari 560:
    digitalWrite(MotorNutrisi, HIGH); //Mengaktifkan motor nutrisi dengan pin MotorNutrisi berlogika HIGH.
    lcd.clear(); //Membersihkan tampilan LCD.
    lcd.setCursor(0,0); //Memindahkan kursor LCD ke posisi baris 1, kolom 1.
    lcd.print("Nutrisi ditambahkan"); //Menampilkan teks "Nutrisi ditambahkan" di LCD.
    delay(100); //Menunda eksekusi program selama 100 milidetik.
  } else { //Jika kondisi diatas tidak terpenuhi, lanjutkan ke kondisi else.
    digitalWrite(MotorNutrisi, LOW); // Mematikan motor nutrisi dengan pin MotorNutrisi berlogika LOW.
  }
 
  Serial.print("NTU : "); //Menampilkan teks "NTU : " ke Serial Monitor.
  Serial.println(turb); //Menampilkan nilai turbidity ke Serial Monitor.
  Serial.print("PPM : "); //Menampilkan teks "PPM : " ke Serial Monitor.
  Serial.println(PPM); //Menampilkan nilai PPM ke Serial Monitor.

  delay(100); //Menunda eksekusi program selama 100 milidetik.
}
else { // Jika kondisi diatas tidak terpenuhi, lanjutkan ke kondisi else.
  Serial.println("Nilai sensor turbidity kurang dari nol. Melewatkan pembacaan.");
  //enampilkan pesan kesalahan ke Serial Monitor jika nilai sensor turbidity kurang dari nol.

}
   
  // pH Sensor
  for (int i = 0; i < 10; i++) { //Memulai loop `for` yang berjalan 10 kali.
  buffer_arr[i] = analogRead(SensorpH);
  //Membaca nilai analog dari sensor pH dan menyimpannya di dalam array `buffer_arr` pada indeks ke-i.
  delay(30); //Menunda eksekusi program selama 30 milidetik.
  }
 
  for (int i = 0; i < 9; i++) { //Memulai loop `for` baru yang berjalan 9 kali.
    for (int j = i + 1; j < 10; j++) { //Memulai loop bersarang yang berjalan dari indeks i+1 hingga 9.
      if (buffer_arr[i] > buffer_arr[j]) {
        // Memeriksa apakah nilai pada indeks ke-i lebih besar dari nilai pada indeks ke-j.
        temp = buffer_arr[i];
        //Menukar nilai antara `buffer_arr[i]` dan `buffer_arr[j]` menggunakan variabel sementara `temp`.
        buffer_arr[i] = buffer_arr[j];
        //Menukar nilai antara `buffer_arr[i]` dan `buffer_arr[j]`.
        buffer_arr[j] = temp;
        // Menukar nilai antara `buffer_arr[i]` dan `buffer_arr[j]` menggunakan variabel sementara `temp`.

      }
    }
  }
  avgval = 0;
  //Menginisialisasi variabel `avgval` ke nilai 0.
  for (int i = 2; i < 8; i++){ //Memulai loop `for` baru yang berjalan dari indeks 2 hingga 7.
  avgval += buffer_arr[i]; //Menambahkan nilai pada `buffer_arr[i]` ke `avgval`.
  float volt = (float)avgval * 5.0 / 1024 / 6; //Mengonversi nilai rata-rata `avgval` ke dalam volt.
  phval = -5.70 * volt + calibration_value;
  //Menghitung nilai pH menggunakan rumus tertentu berdasarkan nilai volt dan nilai kalibrasi.
  }

  Serial.print("Nilai Sensor pH : "); //Menampilkan teks "Nilai Sensor pH : " ke Serial Monitor.
  Serial.println(phval); //Menampilkan nilai pH ke Serial Monitor.
 

  if (phval <= 7 && phval >= 6) { //Jika nilai pH berada di antara 6 dan 7:
    digitalWrite(MotorHCL, LOW); //Matikan motor HCL dengan pin MotorHCL berlogika LOW.
    digitalWrite(MotorKOH, LOW); //Matikan motor KOH dengan pin MotorKOH berlogika LOW.
  }
  if (phval > 7) { //Jika nilai pH lebih besar dari 7:
    digitalWrite(MotorHCL, LOW); //Matikan motor HCL dengan pin MotorHCL berlogika LOW.
    digitalWrite(MotorKOH, HIGH); //Aktifkan motor KOH dengan pin MotorKOH berlogika HIGH.
    lcd.clear(); //Membersihkan tampilan LCD.
    lcd.setCursor(0,0); //Memindahkan kursor LCD ke posisi baris 1, kolom 1.
    lcd.print("KOH ditambahkan"); //Menampilkan teks "KOH ditambahkan" di LCD.
    delay(100); //Menunda eksekusi program selama 100 milidetik.
  }
  if (phval < 6) { //Jika nilai pH kurang dari 6:
    digitalWrite(MotorHCL, HIGH); //Aktifkan motor HCL dengan pin MotorHCL berlogika HIGH.
    digitalWrite(MotorKOH, LOW); //Matikan motor KOH dengan pin MotorKOH berlogika LOW.
    lcd.clear(); //Membersihkan tampilan LCD.
    lcd.setCursor(0,0); //Memindahkan kursor LCD ke posisi baris 1, kolom 1.
    lcd.print("HCL ditambahkan"); //Menampilkan teks "HCL ditambahkan" di LCD.
    delay(100); //Menunda eksekusi program selama 100 milidetik.
  }


  delay(100); //Menunda eksekusi program selama 100 milidetik untuk memberikan waktu antar loop.
}


d. Video Simulasi[Kembali]

 





e. Download File[Kembali]