Project #15: Environment – RTC (Real-Time Clock) – Mk52

——

#DonLucElectronics #DonLuc #RTC #TextoSpeech #Environment #SD #FireBeetle2ESP32E #ESP32 #Display #IoT #Project #Fritzing #Programming #Electronics #Microcontrollers #Consultant

——

RTC (Real-Time Clock)

——

RTC (Real-Time Clock)

——

RTC (Real-Time Clock)

——

RTC (Real-Time Clock)

A Real-time clock (RTC) is a dedicated electronic device or integrated circuit that tracks human-readable time (seconds, minutes, hours, days, months, and years). Crystal Oscillator: It relies on a quartz crystal (typically vibrating at 32.768 kHz) to generate a steady, accurate time pulse. Backup Power: It uses a small coin-cell lithium battery or supercapacitor so it keeps running even when the main system power is turned off or lost. Communication: It connects to microcontrollers or processors via serial interfaces like I2C or SPI. Many modern RTC chips include built-in alarms, watchdog timers, calendars, and temperature compensation to prevent time drift. If you are working on a project, tell me what microcontroller or board you are using (like Arduino or ESP32) so I can recommend an RTC module and wiring setup.

DL2610Mk04

1 x DFRobot FireBeetle 2 ESP32-E
1 x Adafruit SSD1306
1 x Gravity: IO Shield for FireBeetle 2
1 x Gravity: I2C HUB
1 x Gravity: I2C SD2405 RTC Module
1 x Fermion: MicroSD Card Module
1 x MicroSD 8 GB
1 x Gravity: LED Switch Green
1 x Gravity: Text to Speech Voice Synthesizer Module
1 x Gravity: Digital Push Button (White)
1 x Gravity: Digital Blue LED Light Module
1 x Lithium Ion Battery – 1000mAh
1 x USB 3.0 to Type-C Cable

DL2610Mk04p

DL2610Mk04p.ino

/****** Don Luc Electronics © ******
Software Version Information
Project #15: Environment – RTC (Real-Time Clock) – Mk52
15-52
DL2610Mk04p.ino
DL2610Mk04
1 x DFRobot FireBeetle 2 ESP32-E
1 x Adafruit SSD1306
1 x Gravity: IO Shield for FireBeetle 2
1 x Gravity: I2C HUB
1 x Gravity: I2C SD2405 RTC Module
1 x Fermion: MicroSD Card Module 
1 x MicroSD 8 GB
1 x Gravity: LED Switch Green
1 x Gravity: Text to Speech Voice Synthesizer Module
1 x Gravity: Digital Push Button (White)
1 x Gravity: Digital Blue LED Light Module
1 x Lithium Ion Battery - 1000mAh
1 x USB 3.0 to Type-C Cable
*/

// Include the Library Code
// Wire
#include <Wire.h>
// SD Card
// File System
#include "FS.h"
// SD Card
#include "SD.h"
// SPI (Serial Peripheral Interface)
#include "SPI.h"
// Speech Synthesis
#include <DFRobot_SpeechSynthesis_V2.h>
// Adafruit SSD1306
#include <Adafruit_SSD1306.h>
// RTC (Real-Time Clock)
#include "GravityRtc.h"

// Adafruit SSD1306
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// RTC Initialization
GravityRtc rtc;
// Date and Time
String dateRTC = "";
String timeRTC = "";

// Speech Synthesis
DFRobot_SpeechSynthesis_I2C ss;

// Button
// The number of the pushbutton pin
const int iButton = D10;
// Variables will change:
int iButtonState = 0;

// Switch
// The number of the pushbutton pin
const int iSwitch = D12;
// variables will change:
int switchState = 0;
int iState = 0;

// SD shield
const int chipSelect = D6;
// FullString
String FullString = "";
long lineToRead = 0;
// Random
long randNumber;
String lineContent = "";
String zzzzzz = "";

// D11 LED Blue
const int iLedBlue = D11;

// Software Version Information
String sver = "15-52";

void loop() {
  
  // RTC (Real-Time Clock)
   isRTC(); 
  
  // isButton
  isButton();

  // isDisplay Button
  isDisplayButton();

}

getButton.ino

// Button
// isButton
void isButton(){

  iButtonState= digitalRead(iButton);  // read input value

  if (iButtonState == HIGH) { 
      
    //  Switch
    isSwitch();

   } else {

      // Turn LED Off
      digitalWrite(iLedBlue, LOW);

   }

}

getDisplay.ino

// Adafruit SSD1306
// isDisplayUID
void isDisplayUID(){

    // Intentar ambas direcciones
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    //Serial.println("Error con 0x3C, probando 0x3D...");
    if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) {
      //Serial.println("Error OLED en ambas direcciones");
      return;
    }
  }
  
  // Clear Display
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  // Don Luc Electronics
  display.setCursor(0,0);
  display.println("Don Luc Electronics");
  // Motor Drive
  display.setCursor(0,20);
  display.print("DL2610Mk04");
 // Version
  display.setCursor(0,20);
  display.print("Version");
  display.setCursor(0,40);
  display.print( sver );
  // Display
  display.display();

}
// isDisplay Button
void isDisplayButton(){

  // Clear Display
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  // Don Luc Electronics
  display.setCursor(0,0);
  display.println("Don Luc Electronics");
  // 
  display.setCursor(0,20);
  if (iState == 1) {

    // English
    display.print("Book English");

  }
  else {

    // Spanish
    display.print("Book Spanish");

 }  
  
  // Line Content
  display.setCursor(0,40);
  display.print( lineContent );
  // Display
  display.display();

}

getRTC.ino

// Real-Time Tlock
// Date and Time RTC
void isRTC () {

  // Date and Time
  dateRTC = "";
  timeRTC = "";
  rtc.read();
  
  // Date
  dateRTC = rtc.year; 
  dateRTC = dateRTC + "/";
  dateRTC = dateRTC + rtc.month;
  dateRTC = dateRTC + "/";
  dateRTC = dateRTC + rtc.day;

  // Time
  timeRTC = rtc.hour;
  timeRTC = timeRTC + ":";
  timeRTC = timeRTC + rtc.minute;
  timeRTC = timeRTC + ":";
  timeRTC = timeRTC + rtc.second;
  
}

getSD.ino

// MicroSD Card
// MicroSD Setup
void isSetupSD() {

    // MicroSD Card
    pinMode( chipSelect , OUTPUT );
    
    // MicroSD Card
    if(!SD.begin()){
        Serial.print("MicroSD Card No");;  
        return;
    }
    
    uint8_t cardType = SD.cardType();

    // CARD NONE
    if(cardType == CARD_NONE){
        ; 
        return;
    }

    // SD Card Type
    if(cardType == CARD_MMC){
        ; 
    } else if(cardType == CARD_SD){
        ; 
    } else if(cardType == CARD_SDHC){
        ; 
    } else {
        ; 
    } 

    // Size
    uint64_t cardSize = SD.cardSize() / (1024 * 1024);
 
}
// MicroSD Card English
void isSDEnglish() {

  zzzzzz = "";

  //DLE|Version|Date|Time|
  zzzzzz = "DLE|" + sver + "|" + String( dateRTC ) + "|" + String( timeRTC ) 
  //English|lineContent|\r
  + "|English|" + lineContent + "|*\r";

  // msg + 1
  char msg[zzzzzz.length() + 1];

  zzzzzz.toCharArray(msg, zzzzzz.length() + 1);

  // Append File
  appendFile(SD, "/DLEDATA.txt", msg );

}
// MicroSD Card Spanish
void isSDSpanish() {

  zzzzzz = "";

  //DLE|Version|Date|Time|
  zzzzzz = "DLE|" + sver + "|" + String( dateRTC ) + "|" + String( timeRTC ) 
  //Spanish|lineContent|\r
  + "|Spanish|" + lineContent + "|*\r";
  
  // msg + 1
  char msg[zzzzzz.length() + 1];

  zzzzzz.toCharArray(msg, zzzzzz.length() + 1);

  // Append File
  appendFile(SD, "/DLEDATA.txt", msg );

}
// Read a specific line (1-indexed)
String readSpecificLine(fs::FS &fs, const char * path, int targetLine) {
  File file = fs.open(path);
  if(!file || file.isDirectory()){
    return "Error: Failed to open file";
  }

  int currentLine = 1;
  String lineContent = "";

  while(file.available()){
    char ch = file.read();
    
    if (currentLine == targetLine) {
      if (ch == '\n' || ch == '\r') {
        file.close();
        return lineContent; // Found line, return it
      }
      lineContent += ch;
    }

    if (ch == '\n') {
      currentLine++;
    }

    if (currentLine > targetLine) {
      break; 
    }
  }

  file.close();
  
  if (currentLine == targetLine && lineContent.length() > 0) {
    return lineContent; // Return last line if it lacks a trailing newline
  }
  
  return "Error: Line not found";
}
// List Dir
void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
    
    // List Dir
    dirname;
    
    File root = fs.open(dirname);
    
    if(!root){
        return;
    }
    
    if(!root.isDirectory()){
        return;
    }

    File file = root.openNextFile();
    
    while(file){
        if(file.isDirectory()){
            file.name();
            if(levels){
                listDir(fs, file.name(), levels -1);
            }
        } else {
            file.name();
            file.size();
        }
        file = root.openNextFile();
    }
    
}
// Write File
void writeFile(fs::FS &fs, const char * path, const char * message){
    
    // Write File
    path;
    
    File file = fs.open(path, FILE_WRITE);
    
    if(!file){
        return;
    }
    
    if(file.print(message)){
        ;  
    } else {
        ;  
    }
    
    file.close();
    
}
// Append File
void appendFile(fs::FS &fs, const char * path, const char * message){

    // Append File
    path;
    
    File file = fs.open(path, FILE_APPEND);
    
    if(!file){
        return;
    }
    
    if(file.print(message)){
        ;  
    } else {
        ;  
    }
    
    file.close();

}

getSpeechSynthesizer.ino

// Speech Synthesis
// isSetupSS
void isSetupSS(){

  // Begin
  ss.begin();
  // Set voice volume to 9
  ss.setVolume(9);
  // Set playback speed to 9
  ss.setSpeed(7);
  // Set tone to 5
  ss.setTone(5);
  // For English, speak word 
  ss.setEnglishPron(ss.eWord);

}

getSwitch.ino

// Switch
// isSwitch
void isSwitch(){

  // Turn LED off:
  digitalWrite(iLedBlue, LOW);

  randNumber = random(1, 6);

  if ( randNumber == 4 ) {

     // Switch
     switchState = digitalRead(iSwitch);

     if (switchState == HIGH) {
    
       // Turn LED On:
       digitalWrite(iLedBlue, HIGH);

       iState = 1;
       
       // English
       // Example: Read line from "english/engliso.txt"
       lineToRead = random(1, 2048);

       lineContent = readSpecificLine(SD, "/english/engliso.txt", lineToRead);
            
       if (lineContent != "") {

         Serial.print("Line ");
         Serial.print(lineToRead);
         Serial.print(": ");
         Serial.println(lineContent);
         // Speak
         ss.speak( lineContent );
         // MicroSD Card English
         isSDEnglish();

      } else {

         Serial.println("Line not found or file error.");

      }


    } else {

     // Turn LED On:
     digitalWrite(iLedBlue, HIGH);

     iState = 0;
      
      // Spanish
      // Example: Read line from "spanish/spanisho.txt"
      lineToRead = random(1, 1938);

      lineContent = readSpecificLine(SD, "/spanish/spanisho.txt", lineToRead);

      if (lineContent != "") {

         Serial.print("Line ");
         Serial.print(lineToRead);
         Serial.print(": ");
         Serial.println(lineContent);
         // Speak
         ss.speak( lineContent );
         // MicroSD Card Spanish
         isSDSpanish();

      } else {

         Serial.println("Line not found or file error.");

      }

    }

  }
     
}  

setup.ino

// Setup
void setup()
{

  // Delay
  delay(100);
  
  // Serial
  Serial.begin(9600);
  
  // Delay
  delay( 100 );

  // LED Blue
  pinMode(iLedBlue, OUTPUT);

  // Delay
  delay(100);

  // iButton
  pinMode(iButton, INPUT);

  // Delay
  delay(100);

  delay(100);
  
  // iSwitch
  pinMode(iSwitch, INPUT);

  // Wire
  Wire.begin();

  // Delay
  delay(100);

  // Setup RTC
  rtc.setup();

  //Set the RTC time automatically: Calibrate RTC time by your computer time
  rtc.adjustRtc(F(__DATE__), F(__TIME__));

  // Delay
  delay(100);

  //MicroSD Card
  isSetupSD();

  // Delay
  delay(100);

  // isSetupSS
  isSetupSS();

  // Delay
  delay(100);

  // Random Seed
  randomSeed(analogRead(A3));

  // Delay
  delay( 100 );

  // Adafruit SSD1306 - UID
  // Don Luc Electronics
  // Versioc
  isDisplayUID();
  
  // Delay
  delay( 5000 );

}

——

People can contact us: https://www.donluc.com/?page_id=1927

Consultant, R&D, Electronics, IoT, Teacher and Instructor

  • Programming Language
  • Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi, Arm, Silicon Labs, Espressif, Etc…)
  • IoT
  • Wireless (Radio Frequency, Bluetooth, WiFi, Etc…)
  • Robotics
  • Automation
  • Camera and Video Capture Receiver Stationary, Wheel/Tank , Underwater and UAV Vehicle
  • Unmanned Vehicles Terrestrial, Marine and UAV
  • Machine Learning
  • Artificial Intelligence (AI)
  • RTOS
  • Sensors, eHealth Sensors, Biosensor, and Biometric
  • Research & Development (R & D)
  • Consulting

Follow Us

Luc Paquin – Curriculum Vitae – 2026
https://www.donluc.com/luc/LucPaquinCVEng2026Mk01.pdf
https://www.donluc.com/luc/

Web: https://www.donluc.com/
Web: https://www.jlpconsultants.com/
Facebook: https://www.facebook.com/neosteam.labs.9/
YouTube: https://www.youtube.com/@thesass2063
DFRobot: https://learn.dfrobot.com/user-10186.html
TikTok: https://www.tiktok.com/@luc.paquin8
Hackster: https://www.hackster.io/luc-paquin
LinkedIn: https://www.linkedin.com/in/jlucpaquin/

Don Luc

Leave a Comment