#include <Stepper.h>
#include "DHT.h"
#include <SD.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
unsigned long lastTimeSerialPrint = millis();
unsigned long delayBetweenSerialPrint = 2000;
const int stepsPerRevolution = 200;
#define DHTPIN 2
#define DHTTYPE DHT22
#define BUTTON_PIN_1 8
#define BUTTON_PIN_2 9
#define FAN_PIN 3 // Pin untuk mengontrol kipas
int i = 1;
int CS_pin = 10;
LiquidCrystal_I2C lcd(0x27,16,2);
Stepper myStepper(stepsPerRevolution, 4, 5, 6, 7);
DHT dht(DHTPIN, DHTTYPE);
File sd_file;
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
// Variabel untuk jam dan menit penghidupan dan pemadaman kipas
int fanOnHour = 17; // Jam di mana kipas dihidupkan kembali
int fanOnMinute = 0; // Menit di mana kipas dihidupkan kembali
int fanOffHour = 18; // Jam di mana kipas dimatikan
int fanOffMinute = 0; // Menit di mana kipas dimatikan
void setup() {
Serial.begin(115200);
pinMode(CS_pin, OUTPUT);
pinMode(BUTTON_PIN_1, INPUT_PULLUP);
pinMode(BUTTON_PIN_2, INPUT_PULLUP);
pinMode(FAN_PIN, OUTPUT); // Set pin kipas sebagai output
lcd.init();
lcd.clear();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Otomasi Kipas");
lcd.setCursor(0,1);
lcd.print("AKBAR");
lcd.setCursor(6,1);
lcd.print("2210651163");
Serial.println(F("Cek Suhu dan Kelembaban"));
dht.begin();
myStepper.setSpeed(120);
if (SD.begin()) {
Serial.println("SD card is initialized. Ready to go");
}
else {
Serial.println("Failed");
return;
}
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
}
void loop() {
int value1 = digitalRead(BUTTON_PIN_1);
int value2 = digitalRead(BUTTON_PIN_2);
DateTime now = rtc.now();
// Cek apakah saat ini adalah waktu untuk menghidupkan kipas
if (now.hour() == fanOnHour && now.minute() == fanOnMinute) {
digitalWrite(FAN_PIN, HIGH); // Hidupkan kipas
}
// Cek apakah saat ini adalah waktu untuk mematikan kipas
if (now.hour() == fanOffHour && now.minute() == fanOffMinute) {
digitalWrite(FAN_PIN, LOW); // Matikan kipas
}
if (value1 == HIGH) {
File sd_file = SD.open("data.txt", FILE_WRITE);
if (sd_file) {
unsigned long timeNow = millis();
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
// Cek apakah kipas sedang hidup sebelum melakukan pemutaran stepper
if (digitalRead(FAN_PIN) == HIGH) {
myStepper.step(stepsPerRevolution);
}
if (timeNow - lastTimeSerialPrint > delayBetweenSerialPrint) {
Serial.println("");
Serial.println("");
Serial.println("");
Serial.println("");
Serial.println("");
Serial.println("");
Serial.print("Data ke: ");
Serial.println(i);
Serial.print("Current time: ");
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.println(F("Temperature & Humidity Realtime: "));
Serial.print(F("Humidity: "));
Serial.print(humidity);
Serial.print(F("% Temperature: "));
Serial.print(temperature);
Serial.println(F("°C "));
Serial.println("");
sd_file.print("Data ke: ");
sd_file.println(i);
sd_file.print("Current time: ");
sd_file.print(now.year(), DEC);
sd_file.print('/');
sd_file.print(now.month(), DEC);
sd_file.print('/');
sd_file.print(now.day(), DEC);
sd_file.print(" (");
sd_file.print(daysOfTheWeek[now.dayOfTheWeek()]);
sd_file.print(") ");
sd_file.print(now.hour(), DEC);
sd_file.print(':');
sd_file.print(now.minute(), DEC);
sd_file.print(':');
sd_file.print(now.second(), DEC);
sd_file.println();
sd_file.print(F("Humidity: "));
sd_file.print(humidity);
sd_file.print(F("% Temperature: "));
sd_file.print(temperature);
sd_file.println(F("°C "));
sd_file.println("");
i++;
lastTimeSerialPrint = timeNow;
}
sd_file.close();
}
}
else if (value2 == HIGH) {
File xsd_file = SD.open("data.txt");
if (xsd_file) {
unsigned long timeNow = millis();
if (timeNow - lastTimeSerialPrint > delayBetweenSerialPrint) {
Serial.println("");
Serial.println("");
Serial.println("");
Serial.println("");
Serial.println("");
Serial.println("");
Serial.println("Isi dari data.txt: ");
while (xsd_file.available()) {
Serial.write(xsd_file.read());
}
lastTimeSerialPrint = timeNow;
}
xsd_file.close();
}
}
}
Ini DHT22.
DHT22 digunakan untuk
menghitung suhu dan
kelembaban di dalam
ruang operasi.
Ini Kipas.
Kipas akan berputar ketika suhu diatas 24°
dan kelembaban diatas 60%.
Ini MicroSD Card.
MicroSD Card digunakan untuk
menyimpan file data.txt
yang berisi Log penghitungan
suhu dan kelembaban
Ini DS1307 RTC.
RTC digunakan untuk menghitung waktu
secara Realtime, dan pada rangkaian ini
digunakan sebagai data log secara realtime
Ini LCD 16x2 (I2C).
LCD digunakan untuk menampilkan nama
program, nama pembuat,
dan nomor induk
Ini Slide Switch.
Slide Switch digunakan untuk
mengubah mode dari membaca suhu
ke membaca MicroSD card, dan begitu
pula sebaliknya
Kiri
Mode
Membaca Suhu
Kanan
Mode Membaca
MicroSD Card