#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define DHT_PIN 15 // Pin untuk sensor DHT22
#define DS18B20_PIN 21 // Pin untuk sensor DS18B20
#define DHTTYPE DHT22 // Tipe sensor DHT22
// Pin untuk driver motor A4988
#define STEP_PIN 4 // Pin untuk STEP
#define DIR_PIN 27 // Pin untuk arah
#define ENABLE_PIN 26 // Pin untuk ENABLE
DHT dht(DHT_PIN, DHTTYPE);
OneWire oneWire(DS18B20_PIN);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600); // Memulai komunikasi serial dengan baud rate 9600
dht.begin(); // Memulai sensor DHT22
sensors.begin(); // Memulai sensor DS18B20
// Inisialisasi pin untuk motor stepper
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(ENABLE_PIN, OUTPUT);
digitalWrite(ENABLE_PIN, LOW); // Mengaktifkan driver motor
Serial.println("Inisialisasi selesai. Memulai pembacaan sensor...");
}
void loop() {
// Membaca nilai dari sensor DHT22
float kelembapan = dht.readHumidity();
float suhuDHT22 = dht.readTemperature();
// Membaca nilai dari sensor DS18B20
sensors.requestTemperatures(); // Mengirim permintaan suhu ke sensor DS18B20
float suhuDS18B20 = sensors.getTempCByIndex(0); // Membaca suhu dari sensor DS18B20
// Validasi pembacaan sensor
if (isnan(kelembapan) || isnan(suhuDHT22) || isnan(suhuDS18B20)) {
Serial.println("Gagal membaca dari sensor");
return;
}
// Menampilkan pembacaan sensor ke Serial Monitor
Serial.print("Kelembapan DHT22: ");
Serial.print(kelembapan);
Serial.print(" % Suhu DHT22: ");
Serial.print(suhuDHT22);
Serial.print(" °C Suhu DS18B20: ");
Serial.print(suhuDS18B20);
Serial.println(" °C");
// Logika fuzzy sederhana untuk mengontrol motor stepper
if (kelembapan < 40 && suhuDS18B20 < 25) {
putarMotor(200, 500); // Putaran lambat (200 langkah, kecepatan 500 mikrodetik per langkah)
} else if (kelembapan >= 40 && kelembapan <= 70 && suhuDS18B20 >= 25 && suhuDS18B20 <= 35) {
putarMotor(200, 200); // Putaran sedang (200 langkah, kecepatan 200 mikrodetik per langkah)
} else if (kelembapan > 70 && suhuDS18B20 > 35) {
putarMotor(200, 100); // Putaran cepat (200 langkah, kecepatan 100 mikrodetik per langkah)
}
delay(1000); // Tunggu 1 detik sebelum loop berikutnya
}
// Fungsi untuk mengontrol motor stepper
void putarMotor(int langkah, int kecepatan) {
digitalWrite(DIR_PIN, HIGH); // Set arah putaran (HIGH atau LOW sesuai kebutuhan)
for (int i = 0; i < langkah; i++) {
digitalWrite(STEP_PIN, HIGH); // Nyalakan sinyal STEP
delayMicroseconds(kecepatan); // Tunggu sesuai kecepatan
digitalWrite(STEP_PIN, LOW); // Matikan sinyal STEP
delayMicroseconds(kecepatan); // Tunggu sesuai kecepatan
}
Serial.print("Motor berputar sebanyak ");
Serial.print(langkah);
Serial.print(" langkah dengan kecepatan ");
Serial.print(kecepatan);
Serial.println(" mikrodetik per langkah.");
delay(500);
}