Welcome to Hackster!
Hackster is a community dedicated to learning hardware, from beginner to pro. Join us, it's free!
stevie135s
Created July 30, 2022 © LGPL

Chiming Clock using DS3231 and DFPlayer Mini

A chiming clock with Oled display using an Arduino Pro Mini

BeginnerProtip122
Chiming Clock using DS3231 and DFPlayer Mini

Things used in this project

Hardware components

FTDI Serial Adapter
×1
Arduino Pro Mini
×1
DS3231 RTC
×1
SSD1306 Oled 128 x 64
×1

Software apps and online services

Arduino IDE
Arduino IDE

Story

Read more

Custom parts and enclosures

Chimes Zip

Schematics

Circuit

Apart from power just use I2C and serial from the Pro Mini

Code

DS3231 on Pro Mini

Arduino
#include <Arduino.h>
#include <DS3231.h>
#include <Adafruit_SSD1306.h>
#include <DFRobotDFPlayerMini.h>

DS3231 rtc(SDA, SCL);

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C

DFRobotDFPlayerMini myDFPlayer;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

String Dow,Dat,Tim,Last_Tim;
int Spc,Sec,Min,Hour2,Temp;

void setup() {
    Serial.begin(9600);
    myDFPlayer.begin(Serial);
    display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
    rtc.begin();
    display.clearDisplay();
    display.setTextSize(2);
  }

void loop() {
Tim = rtc.getTimeStr();
if (Last_Tim != Tim) {
  Last_Tim = Tim;
  Dow = rtc.getDOWStr();
  Dat = rtc.getDateStr();
  Temp = rtc.getTemp();
  Spc = 64 - ((Dow.length()*12)/2);
  Sec = Tim.substring(6,8).toInt();
  Min = Tim.substring(3,5).toInt();
//  Serial.println(Min);
   if ((Min == 59) && (Sec == 40)) {
    Hour2 = Tim.substring(0,2).toInt();
    Hour2++;
    chime();
   }

        
        display.setTextColor(SSD1306_WHITE);
        display.setCursor(18,0);
        display.print(Tim);
        display.setCursor(Spc,16);
        display.print(Dow);      
        display.setCursor(0,35);
        display.print(Dat);
        display.setCursor(32,51);
        display.print(Temp);
        display.print(" C");
        
        display.display();

        display.setTextColor(SSD1306_BLACK);
        display.setCursor(18,0);
        display.print(Tim);
        display.setCursor(Spc,16);
        display.print(Dow);
        display.setCursor(0,35);
        display.print(Dat);
        display.setCursor(32,51);
        display.print(Temp);
        display.print(" C");

  }
}
 void chime() {
  myDFPlayer.volume(15);
  switch (Hour2) {
    case 6:
    myDFPlayer.play(6);
    break;
    case 7:
    myDFPlayer.play(7);
    break;
    case 8:
    myDFPlayer.play(8);
    break;
    case 9:
    myDFPlayer.play(9);
    break;
    case 10:
    myDFPlayer.play(10);
    break;
    case 11:
    myDFPlayer.play(11);
    break;
    case 12:
    myDFPlayer.play(12);
    break;
    case 13:
    myDFPlayer.play(1);
    break;
    case 14:
    myDFPlayer.play(2);
    break;
    case 15:
    myDFPlayer.play(3);
    break;
    case 16:
    myDFPlayer.play(4);
    break;
    case 17:
    myDFPlayer.play(5);
    break;
    case 18:
    myDFPlayer.play(6);
    break;
    case 19:
    myDFPlayer.play(7);
    break;
    case 20:
    myDFPlayer.play(8);
    break;
    case 21:
    myDFPlayer.play(9);
    break;
    case 22:
    myDFPlayer.play(22);
    break;
    case 23:
    myDFPlayer.play(23);
    break;
    case 24:
    myDFPlayer.play(24);
    break;
    case 1:
    myDFPlayer.play(13);
    break;
    case 2:
    myDFPlayer.play(14);
    break;
    case 3:
    myDFPlayer.play(15);
    break;     
    case 4:
    myDFPlayer.play(16);
    break;     
    case 5:
    myDFPlayer.play(17);
    break;    
  }    
  }

DS3231_Set_Time

Arduino
Use this script to set the time : Remember the DS3231 library to set the time is different from the clock DS3231 library
/*
DS3231 uses the standard Arduino library

*/

#include <DS3231.h> //https://github.com/NorthernWidget/DS3231
#include <Wire.h>

DS3231 clok;

byte year;
byte month;
byte date;
byte dOW;
byte hour;
byte minute;
byte second;

void getDateStuff(byte& year, byte& month, byte& date, byte& dOW,
                  byte& hour, byte& minute, byte& second) {
    // Call this if you notice something coming in on
    // the serial port. The stuff coming in should be in
    // the order YYMMDDwHHMMSS, with an 'x' at the end.
    boolean gotString = false;
    char inChar;
    byte temp1, temp2;
    char inString[20];
    
    byte j=0;
    while (!gotString) {
        if (Serial.available()) {
            inChar = Serial.read();
            inString[j] = inChar;
            j += 1;
            if (inChar == 'x') {
                gotString = true;
            }
        }
    }
    Serial.println(inString);
    // Read year first
    temp1 = (byte)inString[0] -48;
    temp2 = (byte)inString[1] -48;
    year = temp1*10 + temp2;
    // now month
    temp1 = (byte)inString[2] -48;
    temp2 = (byte)inString[3] -48;
    month = temp1*10 + temp2;
    // now date
    temp1 = (byte)inString[4] -48;
    temp2 = (byte)inString[5] -48;
    date = temp1*10 + temp2;
    // now Day of Week
    dOW = (byte)inString[6] - 48;
    // now hour
    temp1 = (byte)inString[7] -48;
    temp2 = (byte)inString[8] -48;
    hour = temp1*10 + temp2;
    // now minute
    temp1 = (byte)inString[9] -48;
    temp2 = (byte)inString[10] -48;
    minute = temp1*10 + temp2;
    // now second
    temp1 = (byte)inString[11] -48;
    temp2 = (byte)inString[12] -48;
    second = temp1*10 + temp2;
}

void setup() {
    // Start the serial port
    Serial.begin(57600); //  Make sure the serial monitor is set to 57600 too
    // Start the I2C interface
    Wire.begin();
}

void loop() {
    
    // If something is coming in on the serial line, it's
    // a time correction so set the clok accordingly.
    if (Serial.available()) {
        getDateStuff(year, month, date, dOW, hour, minute, second);
        
        clok.setClockMode(false);  // set to 24h
        //setclokMode(true); // set to 12h
        
        clok.setYear(year);
        clok.setMonth(month);
        clok.setDate(date);
        clok.setDoW(dOW);
        clok.setHour(hour);
        clok.setMinute(minute);
        clok.setSecond(second);
        
        // Test of alarm functions
        // set A1 to one minute past the time we just set the clok
        // on current day of week.
        clok.setA1Time(dOW, hour, minute+1, second, 0x0, true,
                        false, false);
        // set A2 to two minutes past, on current day of month.
        clok.setA2Time(date, hour, minute+2, 0x0, false, false,
                        false);
        // Turn on both alarms, with external interrupt
        clok.turnOnAlarm(1);
        clok.turnOnAlarm(2);
        
    }
    delay(1000);
}

Credits

stevie135s
28 projects • 12 followers
I've been interested in microprocessors for a long time.
Contact

Comments

Please log in or sign up to comment.