搜索代码

Lesson 105-3: How to Build an LED Seven-Segment Clock Using a DS1307 RTC with Arduino

Lesson 105-3: How to Build an LED Seven-Segment Clock Using a DS1307 RTC with Arduino

In this lesson, we have seven projects in one. We learn how to use the DS1307 Real-Time Clock (RTC) module to build a clock using Arduino.

This is project 4: LED Seven-Segment Clock. This code is to build an actual digital clock using the DS1307. We used an HT16K33 4-digit seven-segment display to display the time.

401-Lesson 105: Ultimate Arduino Clock projects using DS1307
语言: C++
++
/*
 * Lesson 105-1: Building Clock using DS1307 | Robojax Arduino Step By Step Course
 This code: Project 4: LED Seven Segment Clock using DS1307
In this lesson we learn how to use the DS1307 real-time clock module to build an Arduino clock. In this lesson, we learn about 7 projects.

Project 1: Basic DS1307 Clock with Arduino
Project 2: DS1307 Alarm with Buzzer and Relay
Project 3: DS1307 Alarm with Relay and AC Bulb
Project 4: LED Seven Segment Clock using DS1307
Project 5: Unlimited Alarm with Relay
Project 6: LCD Clock using DS1307
Project 7: LCD Clock with Alarm
 * Watch Video instruction for this code:https://youtu.be/gz9xqvRroDY
 * 
 * This code is part of the Arduino Step by Step Course which starts here:  https://youtu.be/-6qSrDUA5a8
 * 
 * For the library for this code, visit http://robojax.com/
 * 
If you found this tutorial helpful, please support me so I can continue creating 
content like this. Make a donation using PayPal or a credit card: https://bit.ly/donate-robojax 

Written by Ahmad Shamshiri on Feb 07, 2021

 *  * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
	
  DS1307: RTCLib from Adafruit
   https://github.com/adafruit/RTClib/   	
  HT16k33 library
//  AUTHOR: Rob Tillaart
// VERSION: 0.1.0
// PURPOSE: demo
//     URL: http://www.adafruit.com/products/1002
//     URL: https://github.com/RobTillaart/HT16K33

*/


#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

#include "HT16K33.h"
HT16K33  seg(0x70);//initialize the display with 0x70 I2C address

//watch video for settings details and demo https://youtu.be/JUcskPLro4U
bool showSecond = false;//show or hide seconds. set to false to not show
unsigned int secondDisplayEvery=5000;//show seconds every 10 seconds
unsigned int secondBlinkCount=6;//show 3 blinks of second 
unsigned int secondDisplayDuration =5000;//for how long seconds should be shown (in milliseonds)
bool showLeadingZero =false;
bool showSecondNoBlink=true;//just count senconds no blink

unsigned long rememberTime = millis();
void showSeconds1();
void showSeconds2();

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {
  while (!Serial); // for Leonardo/Micro/Zero


  Serial.begin(9600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");

  }

    Serial.println("Robojax Digital Clock");
  Serial.println("using DS1307 and HT16K33");  

    // following line sets the RTC to the date & time this sketch was compiled
    // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
     //rtc.adjust(DateTime(2019, 3, 3, 20, 0, 0));
  //rtc.adjust(DateTime(2019, 3, 3, 8, 1, 0));
   rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

 //settings for seven sigment display
  seg.begin();
  Wire.setClock(100000);

  seg.displayOn();

  seg.setDigits(4);
  seg.displayTest(1); 
   
  seg.displayOff(); 
  delay(50);
  seg.displayOn();  
  seg.brightness(10);//set brightness from 1-15        
}

void loop () {
  (showLeadingZero)? seg.setDigits(4) : seg.setDigits(3);
  
    DateTime now = rtc.now();
     //printTime();//print time on serial monitor   

  seg.displayTime(now.hour(),now.minute());
  seg.displayColon(1);     
  delay(500);
  seg.displayColon(0);  
  delay(500); 

  (showSecondNoBlink)? showSeconds2() : showSeconds1();  
    
}//loop end

/*
 * 
 * @brief shows seconds on HT16K33 display
 * with blinking
 * @param none
 * @return no return value
 * written Feb 06, 2021 by Ahmad Shamshiri
 * www.robojax.com
 */
void showSeconds1()
{
  int count = secondBlinkCount;
  if(showSecond){
      if(millis() - rememberTime   > secondDisplayEvery)
      {
          while(count>=0)
          {
            DateTime now = rtc.now();       
            count -=1;      
            seg.setDigits(2);    
            seg.displayInt(now.second());     
            delay(500);
            seg.displayOff();  
            delay(500);  
            seg.displayOn();
            rememberTime = millis()  ;  
          }// while end    
      }//if
  }//if showSecond is true
}//showSecond() end

/*
 * 
 * @brief shows seconds on HT16K33 display
 * without blinking. 
 * @param none
 * @return no return value
 * written Feb 06, 2021 by Ahmad Shamshiri
 * www.robojax.com
 */
void showSeconds2()
{
  int count = secondDisplayDuration;

  if(showSecond){
      if(millis() - rememberTime   > secondDisplayEvery)
      {
          while(count>=0)
          {        
            DateTime now = rtc.now();        
            count -=50;      
            seg.setDigits(2);    
            seg.displayInt(now.second());     
            delay(50);
            rememberTime = millis()  ;  
          }// while end    
      }//if
  }//if showSecond is true
}//showSeconds2() end

/*
 * 
 * @brief prints time on serial monitor
 * @param none
 * @return no return value
 * written Feb 06, 2021 by Ahmad Shamshiri
 * www.robojax.com
 */
void printTime()
{
  
    DateTime now = rtc.now();
    
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
}//printTime() end

文件📁

没有可用的文件。