Arduino UNO-Based Smart Fan Control System with RTC, Ultrasonic Sensor, and SD Card Logging
View and Edit Project In Cirkit Designer
Circuit Documentation
Summary
This circuit is designed to control a DC motor using an Arduino UNO, an RTC DS3231 for real-time clock functionality, a Micro SD Card Module for data logging, an HC-SR04 Ultrasonic Sensor for distance measurement, and a 1 Channel Relay to switch the DC motor on and off. The system activates the motor based on the distance measured by the ultrasonic sensor and the time of day, as determined by the RTC.
Component List
RTC DS3231
- Description: Real-Time Clock module for keeping track of time.
- Pins: 32K, SQW, SCL, SDA, VCC, GND
Arduino UNO
- Description: Microcontroller board based on the ATmega328P.
- Pins: UNUSED, IOREF, Reset, 3.3V, 5V, GND, Vin, A0, A1, A2, A3, A4, A5, SCL, SDA, AREF, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0
Micro SD Card Module
- Description: Module for interfacing with a micro SD card for data storage.
- Pins: cs, sck, mosi, miso, vcc, gnd
HC-SR04 Ultrasonic Sensor
- Description: Sensor for measuring distance using ultrasonic waves.
- Pins: VCC, TRIG, ECHO, GND
DC Motor
- Description: Direct Current motor for mechanical movement.
- Pins: pin 1, pin 2
1 Channel Relay 5V
- Description: Relay module for switching high-power devices.
- Pins: VCC, GND, IN, NC, COM, NO
Wiring Details
RTC DS3231
- SCL: Connected to Arduino UNO A5
- SDA: Connected to Arduino UNO A4
- VCC: Connected to Arduino UNO 5V
- GND: Connected to Arduino UNO GND
Arduino UNO
- A5: Connected to RTC DS3231 SCL
- A4: Connected to RTC DS3231 SDA
- 5V: Connected to RTC DS3231 VCC, Micro SD Card Module vcc, HC-SR04 Ultrasonic Sensor VCC, 1 Channel Relay 5V VCC
- GND: Connected to RTC DS3231 GND, Micro SD Card Module gnd, HC-SR04 Ultrasonic Sensor GND, 1 Channel Relay 5V GND
- D12: Connected to Micro SD Card Module sck
- D11: Connected to Micro SD Card Module mosi
- D10: Connected to HC-SR04 Ultrasonic Sensor ECHO
- D9: Connected to HC-SR04 Ultrasonic Sensor TRIG
- D8: Connected to 1 Channel Relay 5V IN
- D7: Connected to Micro SD Card Module miso
- D4: Connected to Micro SD Card Module cs
Micro SD Card Module
- sck: Connected to Arduino UNO D12
- mosi: Connected to Arduino UNO D11
- miso: Connected to Arduino UNO D7
- cs: Connected to Arduino UNO D4
- vcc: Connected to Arduino UNO 5V
- gnd: Connected to Arduino UNO GND
HC-SR04 Ultrasonic Sensor
- VCC: Connected to Arduino UNO 5V
- TRIG: Connected to Arduino UNO D9
- ECHO: Connected to Arduino UNO D10
- GND: Connected to Arduino UNO GND
DC Motor
- pin 1: Connected to 1 Channel Relay 5V COM
- pin 2: Connected to 1 Channel Relay 5V NO
1 Channel Relay 5V
- VCC: Connected to Arduino UNO 5V
- GND: Connected to Arduino UNO GND
- IN: Connected to Arduino UNO D8
- COM: Connected to DC Motor pin 1
- NO: Connected to DC Motor pin 2
Documented Code
#include <Wire.h>
#include <RTClib.h>
//#include <SD.h>
// Pin untuk sensor ultrasonik
#define TRIG_PIN 9
#define ECHO_PIN 10
// Pin untuk kipas angin (relay)
#define FAN_PIN 8
// Pin untuk SD card module
//#define SD_CS_PIN 4 // Chip Select pin untuk SD card adapter
// Objek RTC
RTC_DS3231 rtc;
// Variabel untuk parameter jarak dan waktu
const int JARAK_MINIMAL = 5; // Jarak minimal untuk mengaktifkan kipas (dalam cm)
const int JAM_MULAI = 9; // Jam mulai kipas aktif
const int JAM_SELESAI = 18; // Jam selesai kipas aktif
//File logFile;
void setup() {
// Inisialisasi pin
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(FAN_PIN, OUTPUT);
// Inisialisasi Serial Monitor
Serial.begin(9600);
// Inisialisasi RTC
if (!rtc.begin()) {
Serial.println("RTC tidak terdeteksi!");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC kehilangan daya, setel ulang waktu.");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Inisialisasi SD card
// if (!SD.begin(SD_CS_PIN)) {
// Serial.println("Gagal menginisialisasi SD card!");
// while (1);
// }
//Serial.println("SD card berhasil diinisialisasi.");
}
long bacaJarak() {
// Fungsi untuk membaca jarak dari sensor ultrasonik
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
Serial.print("Durasi pulse: ");
Serial.println(duration);
long distance = duration * 0.034 / 2; // Menghitung jarak dalam cm
return distance;
}
bool cekWaktuAktif(int currentHour) {
// Fungsi untuk memeriksa apakah waktu sekarang dalam rentang aktif
return (currentHour >= JAM_MULAI && currentHour < JAM_SELESAI);
}
// void tulisLog(String data) {
// logFile = SD.open("log.txt", FILE_WRITE);
// if (logFile) {
// logFile.println(data);
// logFile.close();
// Serial.println("Data disimpan di SD card.");
// } else {
// Serial.println("Gagal membuka file log.");
// }
//}
void loop() {
// Baca jarak dari sensor ultrasonik
long distance = bacaJarak();
// Baca waktu dari RTC
DateTime now = rtc.now();
int currentHour = now.hour();
int currentMinute = now.minute();
// Logika kontrol kipas
String logData = "";
if (distance < JARAK_MINIMAL && cekWaktuAktif(currentHour)) {
digitalWrite(FAN_PIN, HIGH); // Nyalakan kipas
Serial.println("Kipas ON");
logData = "Kipas ON, Jarak: " + String(distance) + " cm, Waktu: " + String(currentHour) + ":" + String(currentMinute);
} else {
digitalWrite(FAN_PIN, LOW); // Matikan kipas
Serial.println("Kipas OFF");
logData = "Kipas OFF, Jarak: " + String(distance) + " cm, Waktu: " + String(currentHour) + ":" + String(currentMinute);
}
// Tulis log ke SD card
//tulisLog(logData);
// Debugging jarak dan waktu
Serial.print("Jarak: ");
Serial.print(distance);
Serial.print(" cm, Waktu: ");
Serial.print(currentHour);
Serial.print(":");
Serial.println(currentMinute);
delay(2000); // Tunggu 1 detik sebelum pengulangan berikutnya
}
This code initializes the RTC, ultrasonic sensor, and relay. It reads the distance from the ultrasonic sensor and the current time from the RTC. If the distance is less than a specified minimum and the current time is within a specified range, it turns on the relay to activate the motor. Otherwise, it turns off the relay. The code also includes commented-out sections for SD card initialization and logging, which can be enabled if needed.