Rabu, 29 Januari 2025

Proyek ESP32 DS3231 Timer RTC Kontrol Relay

Dalam proyek ESP32 ini, saya telah menunjukkan cara membuat relay kontrol pewaktu RTC ESP32 DS3231 dengan jam OLED. Anda dapat mengatur waktu ON/OFF untuk relai menggunakan akses point ESP32. Proyek ini tidak memerlukan koneksi WiFi apa pun.


ESP32 akan mendapatkan waktu dari modul DS3231 dan menampilkan waktu pada OLED beserta waktu ON/OFF untuk relay.

DS3231 adalah modul jam waktu nyata (RTC) yang sangat akurat yang dirancang untuk digunakan dalam aplikasi pencatatan waktu.


Anda dapat terhubung ke Titik Akses ESP32 menggunakan alamat IP tetap untuk mengatur waktu ON/OFF relai. Setelah terhubung ke jaringan Wi-Fi yang dibuat oleh ESP32, Anda dapat mengakses antarmuka web dengan memasukkan alamat IP 192.168.1.1 ke peramban web Anda. Antarmuka ini memungkinkan Anda untuk mengatur waktu tertentu saat relai harus menyala dan mati. Pengaturan ini menyediakan cara mudah untuk mengelola jadwal relai dari jarak jauh tanpa memprogram ulang ESP32.

Komponen yang Diperlukan untuk Proyek ESP32:

  1. ESP32 DevKIT V1 Amazon
  2. Modul RTC DS3231
  3. Modul Relai SPDT 1 saluran 5V Amazon
  4. Layar OLED
  5. Konverter PM05 5V AC ke DC

Rangkaian Relay Timer RTC ESP32 DS3231



Rangkaiannya mudah saja, saya menggunakan GPIO D25 dan D26 untuk mengendalikan modul relai.

Modul DS3231 dan OLED (opsional) dihubungkan dengan GPIO D22 & D21 .

Anda juga dapat menggunakan pengisi daya ponsel 5V 5Amp untuk memasok sirkuit sebagai pengganti konverter AC ke DC.

Untuk kontrol manual, Anda juga dapat menghubungkan sakelar terkunci 5A di terminal COM & NO relai.

Harap ambil tindakan pencegahan keselamatan yang tepat saat menyambungkan peralatan AC.


Anda juga dapat menggunakan PCB berikut untuk proyek ESP32 ini.


Rangkaian Skematik 

Desain PCB

Tampilan PCB 3D

Memprogram ESP32 dengan Arduino IDE

Jika modul DS3231 RTC tidak dikonfigurasi, maka Anda harus memperbarui waktu saat ini ke modul DS3231.

Dalam video Tutorial, saya telah menjelaskan semua langkah untuk memprogram ESP32 menggunakan Arduino IDE.

  1. Perbarui  Preferensi  -> URL Pengelola Papan Tambahan: https://dl.espressif.com/dl/package_esp32_index.json, http://arduino.esp8266.com/stable/package_esp8266com_index.json
  2. Kemudian instal  papan ESP32  dari Board Manager atau Klik Di Sini untuk mengunduh papan ESP32 .
  3. Unduh pustaka yang diperlukan seperti yang disebutkan dalam kode:

Kode untuk modul Relay ESP32

#include <Arduino.h>
#include <Wire.h>
#include <RTClib.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <Preferences.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h> // Include the SSD1306 library

#define RELAY_PIN 25  // Define the pin to which the relay is connected

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET    -1 // Reset pin # (or -1 if sharing Arduino reset pin)


RTC_DS3231 rtc;    // Create an instance of RTC_DS3231
Preferences preferences;

WebServer server(80);

int onHour;
int onMinute;
int offHour;
int offMinute;

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // Initialize the SSD1306 display

// Embedded HTML content
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <title>Set Relay Times</title>
</head>
<body>
  <h2>Set Relay Times</h2>
  <form action="/set" method="POST">
    ON Time (HH:MM):<br>
    <input type="text" name="onTime"><br>
    OFF Time (HH:MM):<br>
    <input type="text" name="offTime"><br><br>
    <input type="submit" value="Set Times">
  </form>
</body>
</html>
)rawliteral";

void handleRoot() {
  server.send(200, "text/html", index_html);
}

void handleSet() {
  String onTime = server.arg("onTime");
  String offTime = server.arg("offTime");

  // Parse ON and OFF times
  onHour = onTime.substring(0, 2).toInt();
  onMinute = onTime.substring(3).toInt();
  offHour = offTime.substring(0, 2).toInt();
  offMinute = offTime.substring(3).toInt();

  // Save the ON and OFF times to EEPROM
  preferences.begin("relay_settings", false);
  preferences.putUInt("onHour", onHour);
  preferences.putUInt("onMinute", onMinute);
  preferences.putUInt("offHour", offHour);
  preferences.putUInt("offMinute", offMinute);
  preferences.end();

  server.send(200, "text/html", "Times set successfully!");
}

void setup() {
  Serial.begin(9600);
  Wire.begin();
  rtc.begin();

  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, HIGH);  // digitalWrite(RELAY_PIN, LOW); (for Active-HIGH Relay)

  // Initialize the OLED display
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  display.clearDisplay();

  // Set ESP32 as an access point with a fixed IP address
  WiFi.softAP("ESP32_AP", "password", 7); // SSID: ESP32_AP, Password: password, Channel: 7
  IPAddress ip(192, 168, 1, 1); // Set the IP address of the access point
  IPAddress gateway(192, 168, 1, 1);
  IPAddress subnet(255, 255, 255, 0);
  WiFi.softAPConfig(ip, gateway, subnet);

  // Print the IP address of the access point
  Serial.print("AP IP address: ");
  Serial.println(WiFi.softAPIP());

  // Read the ON and OFF times from EEPROM
  preferences.begin("relay_settings", true);
  onHour = preferences.getUInt("onHour", 8);
  onMinute = preferences.getUInt("onMinute", 0);
  offHour = preferences.getUInt("offHour", 18);
  offMinute = preferences.getUInt("offMinute", 0);
  preferences.end();

  // Print the stored ON and OFF times
  Serial.print("ON Time: ");
  print2digits(onHour);
  Serial.print(":");
  print2digits(onMinute);
  Serial.println();
  Serial.print("OFF Time: ");
  print2digits(offHour);
  Serial.print(":");
  print2digits(offMinute);
  Serial.println();

  server.on("/", handleRoot);
  server.on("/set", handleSet);

  server.begin();
  Serial.println("HTTP server started");
}

void loop() {
  server.handleClient();

  updateRelayState();

  // Display the current time, ON time, and OFF time on the OLED display
  displayData();

  delay(1000);
}

void displayData(){
  display.clearDisplay();
  display.setTextSize(1);      
  display.setTextColor(SSD1306_WHITE); 
  display.setCursor(0,0);
  DateTime now = rtc.now();
  display.print("Time: ");
  display.print(now.hour());
  display.print(":");
  display.print(now.minute());
  display.print(":");
  display.println(now.second());
  display.print("ON Time: ");
  display.print(onHour);
  display.print(":");
  display.println(onMinute);
  display.print("OFF Time: ");
  display.print(offHour);
  display.print(":");
  display.println(offMinute);
  display.println("http://192.168.1.1/");
  display.display();
}

void updateRelayState() {
  DateTime now = rtc.now();

  if (now.hour() == onHour && now.minute() == onMinute) {
    digitalWrite(RELAY_PIN, LOW); // digitalWrite(RELAY_PIN, HIGH); (for Active-HIGH Relay)
  } else if (now.hour() == offHour && now.minute() == offMinute) {
    digitalWrite(RELAY_PIN, HIGH); // digitalWrite(RELAY_PIN, LOW); (for Active-HIGH Relay)
  }
}

void print2digits(int number) {
  if (number < 10) {
    Serial.print("0");
  }
  Serial.print(number);
}

Berikut penjelasan singkat tentang alur kerja dasar kode yang disediakan:

1. Penyertaan dan Definisi Perpustakaan :

  • Termasuk pustaka yang diperlukan untuk RTC, Wi-Fi, server web, penyimpanan preferensi, dan tampilan OLED.
  • Menentukan konstanta untuk pin relai, dimensi layar, dan pin reset OLED.
  • 2. Inisialisasi Objek dan Variabel Global :
  • Menginisialisasi objek untuk RTC, penyimpanan preferensi, server web, dan tampilan OLED.
  • Menentukan variabel untuk menyimpan waktu nyala dan mati relai.
  • 3. Konten HTML :
  • Mendefinisikan formulir HTML sebagai string untuk mengatur waktu nyala dan mati relai.
  • 4. Penanganan Server Web :
  • handleRoot(): Mengirim formulir HTML ke klien saat mereka mengakses URL root.
  • handleSet(): Memproses pengiriman formulir, mengurai waktu, menyimpannya dalam preferensi, dan mengirimkan pesan sukses kepada klien.
  • 5. Fungsi Pengaturan :
  • Menginisialisasi komunikasi serial, bus I2C, RTC, pin relai, dan tampilan OLED.
  • Mengonfigurasi ESP32 sebagai titik akses Wi-Fi.
  • Membaca waktu nyala dan mati relai yang tersimpan dari preferensi dan mencetaknya ke monitor serial.
  • Menyiapkan rute server web dan memulai server.
  • 6. Jalur Utama :
  • Menangani permintaan HTTP yang masuk secara terus-menerus dengan server.handleClient().
  • Memperbarui status relai berdasarkan waktu saat ini.
  • Memperbarui tampilan OLED dengan waktu saat ini dan pengaturan relai.
  • Penundaan selama 1 detik sebelum diulang.
  • 7. Fungsi Pembantu :
  • displayData(): Memperbarui tampilan OLED dengan waktu saat ini dan pengaturan relai.
  • updateRelayState(): Mengontrol relai berdasarkan waktu saat ini dan waktu ON/OFF yang tersimpan.
  • print2digits(): Memformat angka agar selalu menampilkan dua digit agar lebih mudah dibaca pada keluaran serial.

Alur kerja :

1. Inisialisasi :

  • Fungsi ini setup()menginisialisasi semua komponen, menyiapkan titik akses Wi-Fi, dan membaca waktu relai yang tersimpan dari preferensi.
  • 2. Loop Eksekusi Utama :
  • Fungsi loop()terus menerus:
    • Menangani permintaan server web.
    • Memperbarui status relai berdasarkan waktu RTC.
    • Memperbarui tampilan OLED dengan waktu saat ini dan pengaturan relai.
    • 3. Interaksi Pengguna :
  • Pengguna terhubung ke titik akses ESP32 dan mengakses formulir web.
  • Pengguna memasukkan waktu nyala dan mati relai, lalu mengirimkan formulir.
  • Waktu yang dikirimkan diproses, divalidasi, dan disimpan dalam preferensi.
  • Status relai dan tampilan OLED diperbarui sebagaimana mestinya.

Pengaturan ini memungkinkan pengguna untuk mengonfigurasi waktu operasi relai melalui antarmuka web, dengan umpan balik waktu nyata yang ditampilkan pada layar OLED.

Anda harus selalu memasukkan waktu ON/OFF untuk relai dalam format 24 jam (seperti yang ditunjukkan).

Sekarang unggah kode ke ESP32.


Tampilan ini diperbarui setiap detik untuk mencerminkan waktu saat ini dan akan menampilkan waktu ON dan OFF yang dikonfigurasi untuk relai.
URL “http://192.168.1.1/” ditampilkan, yang menunjukkan alamat web yang dapat dikunjungi pengguna untuk mengatur waktu relai.

Langkah-langkah untuk mengatur waktu ON & OFF untuk relai

Untuk mengatur waktu ON dan OFF untuk relai, ikuti langkah-langkah berikut:

  1. Nyalakan ESP32 dan Hubungkan ke Titik Akses :
  2. Hubungkan ke Titik Akses
    • Nyalakan perangkat ESP32 Anda.
    • Ini akan membuat titik akses Wi-Fi dengan SSID “ ESP32_AP ” dan kata sandi “ password “.
    • Hubungkan komputer atau telepon pintar Anda ke jaringan Wi-Fi ini.
    1. Buka Peramban Web dan Akses Antarmuka Web :
    • Buka peramban web pada perangkat Anda yang terhubung.
    • Masukkan alamat IP http://192.168.1.1/di bilah alamat dan tekan Enter.
    1. Lihat Formulir Web :
    Langkah-langkah untuk mengatur waktu ON & OFF untuk relai
    1. Masukkan Waktu ON dan OFF :
    • Pada kolom “Waktu AKTIF (JJ:MM)”, masukkan waktu yang Anda inginkan agar relai menyala (misalnya, 22:06).
    • Pada kolom “Waktu MATI (JJ:MM)”, masukkan waktu yang Anda inginkan agar relai mati (misalnya, 22:07).
    1. Kirim Formulir :
    • Klik tombol “Tetapkan Waktu” untuk mengirimkan formulir.
    1. Konfirmasi :
    • Setelah mengirimkan formulir, Anda akan melihat pesan konfirmasi: “Waktu berhasil ditetapkan!”.
    • Waktu ON dan OFF yang baru sekarang disimpan dalam preferensi perangkat dan akan digunakan untuk mengendalikan relai.
    1. Periksa Layar OLED :
    • Layar OLED akan diperbarui untuk menampilkan waktu NYALA dan MATI yang baru beserta waktu saat ini.
    Pengatur Waktu RTC ESP32 DS3231 hal.8

    Langkah-langkah ini memungkinkan Anda mengonfigurasi waktu relai menggunakan antarmuka web yang mudah digunakan yang disediakan oleh ESP32.

    Sekarang relai akan otomatis menyala sesuai waktu ON dan OFF yang telah ditentukan sebelumnya.

    Pengatur Waktu RTC ESP32 DS3231 hal.9

    Saya harap Anda menyukai ide proyek Rumah Pintar ini dengan Espressif ESP32.

    Klik Di Sini untuk lebih banyak proyek ESP32 .

    Mohon berikan masukan Anda mengenai proyek IoT ini . Terima kasih atas waktu Anda.






Sumber : https://iotcircuithub.com/esp32-ds3231-rtc-timer-control-relay/