#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Servo.h>
#include <MPU6050.h>
// Inisialisasi LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Inisialisasi sensor suhu
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Inisialisasi MPU6050
MPU6050 mpu;
// Inisialisasi motor servo
Servo servoMotor;
#define SERVO_PIN 9
// Inisialisasi push button
#define BUTTON_PIN 3
bool manualFeed = false;
void setup() {
Serial.begin(9600);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Sistem Pakan Ikan");
delay(2000);
lcd.clear();
// Inisialisasi sensor suhu
sensors.begin();
// Inisialisasi MPU6050
Wire.begin();
mpu.initialize();
// Inisialisasi Servo
servoMotor.attach(SERVO_PIN);
servoMotor.write(0); // Tutup dispenser
// Inisialisasi Push Button
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
// Membaca suhu air
sensors.requestTemperatures();
float suhu = sensors.getTempCByIndex(0);
// Membaca aktivitas ikan dari MPU6050
int16_t ax, ay, az, gx, gy, gz;
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
float aktivitas = sqrt(ax * ax + ay * ay + az * az);
// Menampilkan data di LCD
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(suhu);
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Aktivitas: ");
lcd.print(aktivitas);
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.print(" C, Aktivitas: ");
Serial.println(aktivitas);
// Logika fuzzy sederhana untuk pemberian pakan
if (suhu > 25 && aktivitas > 10000) {
giveFeed();
}
// Pemberian pakan manual
if (digitalRead(BUTTON_PIN) == LOW) {
manualFeed = true;
giveFeed();
}
delay(1000);
}
void giveFeed() {
lcd.setCursor(0, 1);
lcd.print("Pakan diberikan!");
Serial.println("Pakan diberikan!");
servoMotor.write(90); // Buka dispenser
delay(2000);
servoMotor.write(0); // Tutup dispenser
manualFeed = false;
}
Loading
ds18b20
ds18b20