Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

Arduino UNO-Based Smart Fan Control System with RTC, Ultrasonic Sensor, and SD Card Logging

View and Edit Project In Cirkit DesignerImage of Arduino UNO-Based Smart Fan Control System with RTC, Ultrasonic Sensor, and SD Card Logging

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

  1. RTC DS3231

    • Description: Real-Time Clock module for keeping track of time.
    • Pins: 32K, SQW, SCL, SDA, VCC, GND
  2. 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
  3. Micro SD Card Module

    • Description: Module for interfacing with a micro SD card for data storage.
    • Pins: cs, sck, mosi, miso, vcc, gnd
  4. HC-SR04 Ultrasonic Sensor

    • Description: Sensor for measuring distance using ultrasonic waves.
    • Pins: VCC, TRIG, ECHO, GND
  5. DC Motor

    • Description: Direct Current motor for mechanical movement.
    • Pins: pin 1, pin 2
  6. 1 Channel Relay 5V

    • Description: Relay module for switching high-power devices.
    • Pins: VCC, GND, IN, NC, COM, NO

Wiring Details

RTC DS3231

Arduino UNO

Micro SD Card Module

HC-SR04 Ultrasonic Sensor

DC Motor

1 Channel Relay 5V

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.