/*
Nama : Haris Setiyo Utomo
NIM : 21/478336/SV/19266
Kasus : Arduino PID Speed Fan Control dg Feedback Temperature Sensor (simulasi Sistem Pengering Otomatis)
*/
#include "DHT.h"
#include <Stepper.h>
#include <PID_v1.h>
#define DHTPIN 2
#define DHTTYPE DHT22
#define STEPS_PER_REVOLUTION 100
DHT dht(DHTPIN, DHTTYPE);
int temperature;
int humidity;
int slowSpeed = 100; // Kecepatan gerakan lambat
int driveSpeed = 1000; // Kecepatan gerakan normal
int stepSpeed = 10; // Kecepatan langkah motor
const int stepInterval = 1; // Interval waktu
int leftMotorStep = 0; // motor kiri
int rightMotorStep = 0; // motor kanan
Stepper rightMotor(STEPS_PER_REVOLUTION, 8, 9, 10, 11);
Stepper leftMotor(STEPS_PER_REVOLUTION, 4, 5, 6, 7);
// Parameter PID
double Setpoint = 30;
double Input, Output;
double Kp = 25, Ki = 40 , Kd = 1; // Nilai-nilai Kp, Ki, Kd untuk kontrol PID
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
void setup() {
Serial.begin(9600);
dht.begin();
rightMotor.setSpeed(1);
leftMotor.setSpeed(1);
myPID.SetMode(AUTOMATIC);
}
void loop() {
temperature = dht.readTemperature();
humidity = dht.readHumidity();
Serial.print("Setpoint: ");
Serial.print(Setpoint);
Serial.print("°C - Temperature: ");
Serial.print(temperature);
Serial.print("°C - Humidity: ");
Serial.print(humidity);
Serial.println("%");
Input = temperature;
myPID.Compute();
if (temperature >= 30 && temperature <= 50) {
slowApproach();
} else if (temperature < 30 ) {
drive();
} else if (temperature >50 ) {
halt();
}
rightMotor.step(rightMotorStep);
leftMotor.step(leftMotorStep);
if (humidity >= 50) {
drive();
} else {
halt();
}
rightMotor.step(rightMotorStep);
leftMotor.step(leftMotorStep);
}
void slowApproach() {
rightMotor.setSpeed(slowSpeed);
leftMotor.setSpeed(slowSpeed);
forwardM();
}
void drive() {
rightMotor.setSpeed(driveSpeed);
leftMotor.setSpeed(driveSpeed);
forwardM();
}
void forwardM() {
rightMotorStep = stepSpeed;
leftMotorStep = stepSpeed;
}
void halt() {
rightMotorStep = 0;
leftMotorStep = 0;
}