Mikro 2024 Modul 4
MODUL IV
KONTROL TANAMAN PADA GREENHOUSE
(LIDAH BUAYA DAN HIDROPONIK)
1. Pendahuluan [KEMBALI]
Persiapan Rangkaian:
- Hubungkan semua komponen sesuai dengan skema rangkaian yang telah dibuat.
- Unggah kode program Arduino yang telah ditulis ke papan mikrokontroler.
- Pastikan semua sensor dan aktuator terhubung dengan benar dan berfungsi dengan baik.
Pengujian Pemberian Makan Otomatis:
- Atur waktu pemberian makan (sarapan, makan siang, dan makan malam) pada RTC.
- Jalankan program Arduino dan amati kinerja sistem.
- Pastikan motor servo dispenser makanan aktif pada waktu yang telah diatur.
- Pantau berat makanan yang dikeluarkan dengan sensor load cell.
- Pastikan motor servo dispenser makanan mati ketika berat makanan mencapai 100 gram.
Pengujian Pengisian Makanan Manual:
- Sentuh sensor touch pada dispenser makanan.
- Amati apakah motor servo dispenser makanan terbuka untuk memungkinkan pengisian manual.
- Lakukan pengisian makanan secara manual ke dalam dispenser.
Pengujian Indikator Makanan Habis:
- Kurangi jumlah makanan di dalam dispenser hingga batas minimum.
- Amati apakah LED merah super terang menyala sebagai indikator makanan hampir habis.
Pengujian Pengisian Air Otomatis:
- Kosongkan tangki air hingga ketinggian air di bawah 2 cm.
- Amati apakah motor servo dispenser air aktif untuk melakukan pengisian air.
- Pantau ketinggian air di tangki dengan sensor level air.
- Pastikan motor servo dispenser air mati ketika ketinggian air mencapai 5 cm.
Pengujian Pembersihan Tangki Air Otomatis:
- Tambahkan sedikit kotoran ke dalam tangki air.
- Amati apakah solenoid valve terbuka untuk mengeluarkan air kotor dari tangki.
- Pastikan air kotor di dalam tangki terbuang dengan baik.
- RTC
diprogram untuk waktu-waktu pemberian makan yang diinginkan, yaitu
sarapan, makan siang dan makan malam.
- Ketika
waktu pemberian makan tiba berdasarkan RTC:
- Motor servo untuk mengeluarkan makanan diaktifkan.
- Load cell sensor akan terus memonitor berat makanan
yang dikeluarkan.
- Jika berat makanan mencapai 100 gram (berat yang
diinginkan):
- Motor servo untuk mengeluarkan makanan
dinonaktifkan.
- Ketika
sensor touch disentuh:
- Motor servo untuk membuka tutup atas dispenser
makanan diaktifkan.
- Ini memungkinkan pengisian makanan secara manual.
- Sensor
ultrasonik mengukur jarak antara makanan dan sensor di dalam dispenser.
- Jika jarak
antara makanan dan sensor ultrasonik 10 cm atau lebih (artinya makanan
hampir habis):
- LED red super bright diaktifkan sebagai indikator
bahwa dispenser hampir kehabisan makanan.
- Sensor
level air akan terus mengukur tinggi air di tangki air.
- Jika
sensor level air mendeteksi air kurang dari 2 cm di atas permukaan tangki
air:
- Motor servo untuk mengisi air dari dispenser air
diaktifkan (asumsi terhubung ke dispenser air terpisah).
- Pengisian air akan terus berlanjut hingga sensor
level air mendeteksi ketinggian air mencapai 5 cm (kapasitas yang
diinginkan).
- Sensor
kekeruhan akan mendeteksi adanya kotoran di dalam tangki air.
- Jika
sensor kekeruhan mendeteksi adanya kotoran:
- Solenoid valve diaktifkan untuk membuka dan
mengeluarkan air dari tangki air.
- Ini memungkinkan pembersihan tangki air secara
otomatis.
- Listing Program
Memiliki hewan peliharaan seperti kucing dapat
membawa kebahagiaan dan persahabatan bagi pemiliknya. Namun,
kesibukan sehari-hari terkadang membuat pemilik kesulitan untuk memberikan
perhatian penuh kepada hewan peliharaan mereka, terutama dalam hal pemberian
makan dan minum. Hal ini dapat menyebabkan masalah kesehatan bagi hewan
peliharaan, seperti malnutrisi, dehidrasi, dan obesitas, jika tidak ditangani
dengan baik.
Untuk mengatasi masalah ini, project "Smart Pet Feeder" hadir sebagai solusi inovatif untuk membantu pemilik kucing dalam merawat hewan peliharaan mereka dengan lebih baik. Project ini memanfaatkan teknologi Arduino, dan berbagai macam sensor, untuk mengontrol food dispenser dan water dispenser secara otomatis, memastikan kucing mendapatkan makanan dan air yang cukup sesuai dengan kebutuhannya.
·
Memastikan
Jadwal Makan dan Minum yang Tepat: Smart Pet Feeder dapat diprogram untuk mengeluarkan makanan dan
air pada waktu yang telah ditentukan, sesuai dengan kebutuhan kucing dan pola
makannya. Hal ini membantu menjaga kesehatan dan berat badan ideal kucing,
serta mencegah overfeeding dan dehidrasi.
·
Pemantauan
Status Makanan dan Air:
Projek ini dapat dilengkapi dengan sensor untuk memantau status makanan dan air
pada dispenser. Sensor ini akan memberikan informasi kepada pemilik tentang
ketersediaan makanan dan air, sehingga mereka dapat dengan mudah mengetahui
kapan refill diperlukan.
·
Kemudahan
Pengoperasian: Smart Pet Feeder
dirancang dengan mudah digunakan dan diprogram. Pemilik dapat mengatur jadwal
makan dan minum, serta memantau status makanan dan air.
3. Alat dan Bahan [KEMBALI]
3.1. Alat:
a) Jumper
b) Breadboard
c) Adapter
5V 2A
3.2. Komponen:
a) Sensor
Touch
b) Sensor
Loadcell
c) Sensor
Ultrasonic
d) Sensor
Water Level
e) Sensor
Turbidity
f) LCD
I2C
g) Motor
Servo
h) L239D
i) Motor
DC
j) RTC
DS3231
k) LED
Super Bright
l) Arduino
UNO
a) Sensor
Touch
Sensor touch merupakan komponen elektronik yang
mendeteksi sentuhan atau kontak fisik. Sensor ini bekerja dengan berbagai
prinsip, seperti:
·
Resistif:
Sensor ini memiliki dua lapisan konduktif yang dipisahkan oleh udara. Saat disentuh,
resistensi antara kedua lapisan akan berubah, sehingga dapat dideteksi oleh
mikrokontroler.
·
Kapasitif:
Sensor ini menggunakan kapasitansi antara permukaan sensor dan jari manusia.
Saat disentuh, kapasitansi akan berubah, sehingga dapat dideteksi oleh
mikrokontroler.
·
Inframerah:
Sensor ini menggunakan sinar inframerah untuk mendeteksi keberadaan objek. Saat
objek menyentuh sensor, sinar inframerah akan terhalang, sehingga dapat
dideteksi oleh mikrokontroler.
Gambar grafik respon touch sensor
b)
Sensor Loadcell
Sensor loadcell merupakan komponen elektronik yang
mengukur berat atau gaya. Sensor ini bekerja dengan cara mengubah tekanan
mekanis menjadi sinyal listrik. Sinyal listrik ini kemudian diproses oleh
mikrokontroler untuk menentukan berat atau gaya yang diukur.
Gambar grafik respon sensor loadcell
c) Sensor
Ultrasonic
Sensor ultrasonic merupakan komponen elektronik yang
mendeteksi jarak atau keberadaan objek menggunakan gelombang ultrasonik. Sensor
ini memancarkan gelombang ultrasonik dan mengukur waktu yang dibutuhkan
gelombang untuk kembali setelah dipantulkan oleh objek. Jarak
objek dapat dihitung berdasarkan waktu tersebut.
Gambar
grafik respon sensor ultrasonic
d) Sensor
Water Level
Sensor water level merupakan komponen elektronik yang
mendeteksi ketinggian air. Sensor ini bekerja dengan berbagai prinsip, seperti:
·
Pelampung:
Sensor ini menggunakan pelampung yang akan naik atau turun sesuai dengan
ketinggian air. Posisi pelampung kemudian dideteksi oleh mikrokontroler.
·
Tekanan:
Sensor ini menggunakan sensor tekanan untuk mengukur tekanan air. Tekanan air
kemudian dikonversi menjadi ketinggian air oleh mikrokontroler.
· Konduktivitas: Sensor ini menggunakan elektroda untuk
mendeteksi konduktivitas air. Ketinggian air kemudian dihitung
berdasarkan konduktivitas air.
Gambar
grafik respon sensor waterlevel
e) Sensor
Turbidity
Sensor turbidity merupakan komponen elektronik yang
mengukur kekeruhan air. Sensor ini bekerja dengan cara memancarkan cahaya dan
mengukur intensitas cahaya yang diteruskan atau dipantulkan oleh air. Kekeruhan
air kemudian dihitung berdasarkan intensitas cahaya tersebut.
Gambar
grafik respon turbidity sensor
f) LCD
I2C
LCD I2C merupakan layar LCD yang dapat dihubungkan ke
mikrokontroler menggunakan protokol I2C. Protokol I2C memungkinkan komunikasi
antara mikrokontroler dan LCD dengan hanya menggunakan dua kabel data.
g) Motor
Servo
Motor servo merupakan motor DC yang dapat dikontrol
posisinya dengan presisi tinggi. Motor servo memiliki tiga kabel, yaitu kabel
power, kabel ground, dan kabel sinyal. Posisi motor servo dapat dikontrol
dengan mengirimkan sinyal PWM (Pulse Width Modulation) ke kabel sinyal.
h) L239D
L239D
merupakan driver motor H-bridge yang dapat digunakan untuk mengontrol dua motor
DC secara independen. L239D memiliki empat input, yaitu dua input untuk
masing-masing motor DC, dan empat input untuk mengaktifkan motor DC.
i) Motor
DC
Motor DC merupakan motor listrik yang bekerja dengan menggunakan medan magnet dan arus listrik. Motor DC memiliki dua terminal, yaitu terminal positif dan terminal negatif. Arah putaran motor DC dapat dikontrol dengan mengubah polaritas tegangan yang diterapkan pada terminal.
Gambar grafik respon motor dc
j) RTC
DS3231
RTC
DS3231 merupakan real-time clock (RTC) yang dapat digunakan untuk menyimpan
waktu dan tanggal. RTC DS3231
memiliki baterai internal yang memungkinkannya untuk terus berjalan bahkan
ketika daya utama dimatikan.
k) LED
Super Bright
LED
Super Bright merupakan LED yang memiliki intensitas cahaya yang lebih tinggi
dari LED biasa. LED Super Bright sering digunakan untuk aplikasi yang
membutuhkan pencahayaan yang terang, seperti lampu jalan dan lampu indikator.
l) Arduino
UNO
Arduino UNO merupakan papan mikrokontroler yang berbasis mikrokontroler
Atmega328P. Arduino UNO mudah digunakan dan memiliki banyak komunitas online
yang dapat membantu pengguna dalam belajar dan mengembangkan proyek mereka.
1) Pemberian Makan Otomatis berdasarkan
RTC:
2)
Pengisian Makanan Manual:
3) Indikator
Makanan Habis:
4) Pengisian
Air Otomatis:
5) Pembersihan
Tangki Air Otomatis:
A. Master
#include <Servo.h> #include <RTClib.h> #include <HX711.h> #include <DTH_Turbidity.h> #include <SoftwareSerial.h> #include <LiquidCrystal.h> // Define RTC pins (adjust based on your
connections) #define SDA A4 #define SCL A5 // Define sensor pins (adjust based on
your connections) #define PIN_LOADCELL_DATA 6 #define PIN_LOADCELL_SCK 7 #define PIN_SENSOR_TOUCH 3 #define PIN_TRIGGER_ULTRASONIK 4 #define PIN_ECHO_ULTRASONIK 5 #define PIN_SENSOR_WATERLEVEL 2 #define PIN_SENSOR_TURBIDITY A0 #define PIN_SOLENOID_VALVE 5 #define PIN_LED_RED 13 // Define ambang batas (AB) const int AB_Loadcell = 100; // gram const int AB_AirRendah = 2; // cm const int AB_AirTinggi = 5; // cm const int AB_Ultrasonik_Refill = 10; //
cm (jarak sensor ultrasonik) const int AB_Turbidity = 500; // nilai
untuk deteksi kekeruhan // Define communication and variables #define BAUD_RATE 9600 RTC_DS3231 rtc; Servo myservo; int readLoadcell; int readWaterLevel; int readTurbidity; int readUltrasonic; long duration; int distance; // Define feeding times (adjust hours
and minutes) int breakfastHour = 8; int breakfastMinute = 0; int lunchHour = 12; int lunchMinute = 0; int dinnerHour = 18; int dinnerMinute = 0; SoftwareSerial mySerial(0, 1); // RX, TX void setup() { Serial.begin(9600); mySerial.begin(9600); //
Inisialisasi komunikasi serial untuk komunikasi dengan Arduino Penerima if (!rtc.begin()) {
Serial.println("Couldn't find RTC!"); while (1) {} } rtc.adjust(DateTime(2024, 6, 15,
0, 0, 0)); // Set initial date and time (replace with current date and time) pinMode(PIN_LOADCELL_DATA,
INPUT); pinMode(PIN_LOADCELL_SCK, INPUT); pinMode(PIN_SENSOR_TOUCH, INPUT); pinMode(PIN_TRIGGER_ULTRASONIK,
INPUT); pinMode(PIN_ECHO_ULTRASONIK,
INPUT); pinMode(PIN_SENSOR_WATERLEVEL,
INPUT); pinMode(PIN_SENSOR_TURBIDITY,
INPUT); } void loop() { // Check sensor readings readLoadcell =
analogRead(PIN_LOADCELL_DATA); readWaterLevel =
analogRead(PIN_SENSOR_WATERLEVEL); readTurbidity =
analogRead(PIN_SENSOR_TURBIDITY); readUltrasonic =
analogRead(PIN_TRIGGER_ULTRASONIK); // Check feeding times and
dispense food (communicate with slave) DateTime now = rtc.now(); // Check for breakfast time if (now.hour() == breakfastHour
&& now.minute() == breakfastMinute) { dispenseFood(); // Call
function to dispense food } // Check for lunch time if (now.hour() == lunchHour
&& now.minute() == lunchMinute) { dispenseFood(); } // Check for dinner time if (now.hour() == dinnerHour
&& now.minute() == dinnerMinute) { dispenseFood(); } // Check for refill based on
touch sensor and water level if (digitalRead(PIN_SENSOR_TOUCH)
== LOW) { refillFood(); } // Check for dirty water and
drain the tank if (readTurbidity >
AB_Turbidity) { kurasAir(); } // Check for dirty water and
drain the tank if (readUltrasonic >=
AB_Ultrasonik_Refill) { refillFood(); } delay(1000); } void dispenseFood() { if (readLoadcell <
AB_Loadcell) { Serial.write('F'); // Send
dispense food command to output arduino } else { Serial.println("Food
container full, stopping dispense."); } } void refillFood() {
digitalWrite(PIN_TRIGGER_ULTRASONIK, LOW); delayMicroseconds(2);
digitalWrite(PIN_TRIGGER_ULTRASONIK, HIGH); delayMicroseconds(10);
digitalWrite(PIN_TRIGGER_ULTRASONIK, LOW); long duration =
pulseIn(PIN_ECHO_ULTRASONIK, HIGH); int distance = duration * 0.034 /
2; // cm (adjust conversion factor if needed) // Send distance value to slave
Arduino Serial.println(distance); if (Serial.available()
> 0) { distance = Serial.read();
// Read distance value as an integer if (distance >=
AB_Ultrasonik_Refill) { Serial.write('R');
// Send refill food command to output arduino } } } void refillWater() { if (readWaterLevel ==
AB_AirRendah) { Serial.write('W'); // Send
refill water command to output arduino } else { Serial.println("Water
container full, stopping refill."); } } void kurasAir() { Serial.write('K'); // Kirim
command kuras air ke arduino output } |
B. Slave
#include <Wire.h> // Include Wire
library for I2C communication #include <LiquidCrystal_I2C.h> #include <Servo.h> #define BAUD_RATE 9600 // I2C LCD settings (adjust based on
your LCD module) #define LCD_I2C_ADDRESS 0x27 //
Replace with your LCD's I2C address #define LCD_COLUMNS 16 #define LCD_ROWS 2 #define PIN_SOLENOID_VALVE 5 #define PIN_LED_RED 7 // Define servo pin numbers #define SERVO1_PIN 4 #define SERVO2_PIN 5 #define SERVO3_PIN 6 Servo servo1, servo2, servo3; // Replace the following lines with the
initialization code from your I2C LCD library void lcd_init() { // I2C initialization and LCD
configuration } void lcd_print(const char* message) { // Print message to LCD } void lcd_clear() { // Clear LCD display } void setup() { pinMode(PIN_SOLENOID_VALVE,
OUTPUT); pinMode(PIN_LED_RED, OUTPUT); Serial.begin(BAUD_RATE); servo1.attach(SERVO1_PIN); servo2.attach(SERVO2_PIN); servo3.attach(SERVO3_PIN); // Call your I2C LCD
initialization function lcd_init(); } void loop() { char command = Serial.read(); switch (command) { case 'F': dispenseFood(); break; case 'R': refillFood(); break; case 'W': refillWater(); break; case 'K': kurasAir(); break; default: break; } } void dispenseFood() { Serial.println("Feeding
Time!"); servo2.write(90); // Move
dispense food servo (adjust angle as needed) delay(5000);
// Wait for food to dispense (adjust time as needed) servo2.write(0); //
Move dispense food servo back to closed position lcd_print("Dispensing
food..."); // Update LCD (adjust message) delay(2000);
// Wait for LCD update (adjust time as needed) lcd_clear();
// Clear LCD (optional) } void refillFood() { lcd_print("Food needs
refilling!"); // Update LCD (adjust message) delay(2000);
// Wait for LCD update
(adjust time as needed) lcd_clear();
// Clear LCD
(optional) servo3.write(90);
// Move refill food servo (adjust
angle as needed) delay(5000);
// Wait for food to
refill (adjust time as needed) servo3.write(0);
// Move refill food
servo back to closed position } void refillWater() { servo1.write(90); // Move refill
water servo (adjust angle as needed) delay(5000);
// Wait for water to refill (adjust time as needed) servo1.write(0); //
Move refill water servo back to closed position lcd_print("Refilling
water..."); // Update LCD (adjust message) delay(2000);
// Wait for LCD update (adjust time as needed) lcd_clear();
// Clear LCD (optional) } void kurasAir() { Serial.write('K'); // Send
command to output Arduino (already defined in your code) // Open solenoid valve for
draining digitalWrite(PIN_SOLENOID_VALVE,
HIGH); // Adjust based on your solenoid logic (HIGH might open) } |