7 segment Clk
#include <>
/*F********************************************************************
* 7 Segment Clock EDISON SCIENCE CORNER
**********************************************************************/
#include
#include "RTClib.h"
//************************* DEFINES ************************************
#define BAUD 9600
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
#define SEGMENT_ON LOW
#define SEGMENT_OFF HIGH
//************************* PROTOTYPES ************************************
void set_time();
void displayNumber01( int toDisplay );
void displayNumber02( int toDisplay );
void displayNumber04( int toDisplay );
void lightNumber( int numberToDisplay );
//************************* VARIABLES ************************************
RTC_DS1307 RTC;
int digit1 = 11; // PWM DISPLAY PIN 12 (DIGIT1 IS COMMON ANONDS A1 FROM RIGHT SIDE)
int digit2 = 10; // PWM Display pin 9 (digit2 is common A2)
int digit3 = 9; // PWM DISPLAY PIN 8 (DIGIT3 IS COMMON ANODS A3)
int digit4 = 6; // PWM DISPLAY PIN 6 (DIGIT4 IS COMMON ANODS, FROM LEFT SIDE)
int segA = 2; // DISPLAY PIN 11
int segB = 3; // DISPLAY PIN 7
int segC = 4; // DISPLAY PIN 4
int segD = 5; // DISPLAY PIN 2
int segE = 12; // DISPLAY PIN 1
int segF = 7; // DISPLAY PIN 10
int segG = 8; // DISPLAY PIN 5
int segDP = 13; // DISPLAY PIN 3
int pin = 1;
byte SW0 = A0;
byte SW1 = A1;
byte SW2 = A2;
int zh, uh, ore; // USE FOR HEXA IN ZECIMAL CONVERSION
int zm, um, miniti;
/*F********************************************************************
*
**********************************************************************/
void
setup()
{
// Serial.begin( BAUD );
Wire.begin();
RTC.begin();
// RTC.adjust( DateTime(__DATE__, __TIME__));
// IF NEED SET CLOCK JUST UNCOMMENT ABOVE LINE FOR FLASHING LED
Wire.beginTransmission( 0x68 );
Wire.write( 0x07 ); // MOVE POINTER TO SQW ADDRESS
// Wire.write( 0x00 ); // TURNS SQW PIN OFF
Wire.write( 0x10 ); // TX 0X10 (BIN 00010000) TO CNTRL REG- TURNS ON SQW @ 1Hz
// Wire.write( 0x13 ); // SENDS 0X13 (HEX) 00010011 (BIN) 32kHz
Wire.endTransmission();
if( !RTC.isrunning())
{
Serial.println( "RTC is NOT running!");
// FOLLOWING LINE SETS RTC TO DATE & TIME THIS SKETCH WAS COMPILED
RTC.adjust( DateTime( __DATE__, __TIME__ ) );
}
// dht.begin();
pinMode( segA, OUTPUT);
pinMode( segB, OUTPUT);
pinMode( segC, OUTPUT);
pinMode( segD, OUTPUT);
pinMode( segE, OUTPUT);
pinMode( segF, OUTPUT);
pinMode( segG, OUTPUT);
pinMode( segDP, OUTPUT);
pinMode( pin, OUTPUT);
pinMode( digit1, OUTPUT);
pinMode( digit2, OUTPUT);
pinMode( digit3, OUTPUT);
pinMode( digit4, OUTPUT);
// pinMode( 13, OUTPUT);
// Serial.begin( 9600);
//Serial.println( "test for niq_ro");
pinMode( SW0, INPUT); // for this use a slide switch
pinMode( SW1, INPUT); // N.O. push button switch
pinMode( SW2, INPUT); // N.O. push button switch
digitalWrite( SW0, HIGH); // pull-ups on
digitalWrite( SW1, HIGH);
digitalWrite( SW2, HIGH);
}
/*F********************************************************************
*
**********************************************************************/
void
loop()
{
DateTime now = RTC.now();
int timp = now.hour() * 100 + now.minute();
// int timp = (now.minute(), DEC);
// displayNumber( 12 ); // THIS IS NUMBER TO DIPLAY
// int timp = 1234;
// Serial.print( now.hour(), DEC);
// Serial.print( ":");
// Serial.print( now.minute(), DEC);
// Serial.print( " -> ");
// Serial.print( timp);
// Serial.println( " !");
// display parts
for( int i = 250 ; i >0 ; i--)
{
if( timp >= 1000)
displayNumber01( timp );
else displayNumber02( timp );
}
for( int i = 250 ; i >0 ; i--)
{
if( timp >= 1000)
displayNumber03( timp );
else
displayNumber04( timp );
}
if( !(digitalRead( SW0 )))
set_time(); // HOLD SWITCH TO SET TIME
//blinking
}
/*F********************************************************************
*
**********************************************************************/
void
set_time()
{
byte minutes1 = 0;
byte hours1 = 0;
byte minutes = 0;
byte hours = 0;
while( !digitalRead( SW0 )) // SET TIME SWITCH MUST BE RELEASED TO EXIT
{
minutes1=minutes;
hours1=hours;
while( !digitalRead( SW1 )) // SET MINUTES
{
minutes++;
// converting hexa in zecimal:
zh = hours / 16;
uh = hours - 16 * zh ;
ore = 10 * zh + uh;
zm = minutes / 16;
um = minutes - 16 * zm ;
miniti = 10 * zm + um;
for( int i = 20 ; i >0 ; i--)
displayNumber01( ore * 100 + miniti );
if( (minutes & 0x0f) > 9 )
minutes = minutes + 6;
if( minutes > 0x59 )
minutes = 0;
// Serial.print( "Minutes = ");
if( minutes >= 9)
Serial.print( "0" );
// Serial.println( minutes, HEX);
delay( 150 );
}
while( !digitalRead( SW2 )) // set hours
{
hours++;
zh = hours / 16; // CONVERTING HEXA IN DECIMAL:
uh = hours - 16 * zh ;
ore = 10 * zh + uh;
zm = minutes / 16;
um = minutes - 16 * zm ;
miniti = 10 * zm + um;
for( int i = 20 ; i >0 ; i--)
displayNumber01( ore * 100 + miniti);
if( (hours & 0x0f) > 9)
hours = hours + 6;
if( hours > 0x23 )
hours = 0;
// Serial.print( "Hours = ");
if( hours <= 9 )
Serial.print( "0" );
Serial.println( hours, HEX);
delay( 150 );
}
Wire.beginTransmission( 0x68 ); // ACTIVATE DS1307
Wire.write( 0 ); // WHERE TO BEGIN
Wire.write( 0x00 ); // SECONDS
Wire.write( minutes ); // MINUTES
Wire.write( 0x80 | hours ); // HOURS ( 24HR TIME )
Wire.write( 0x06 ); // DAY 01-07
Wire.write( 0x01 ); // DATE 0-31
Wire.write( 0x05 ); // MONTH 0-12
Wire.write( 0x09 ); // YEAR 00-99
Wire.write( 0x10 ); // CNTRL 0X10 ENABLES 1 HZ SQUARE WAVE ON PIN 7
Wire.endTransmission();
zh = hours / 16; // CONVERTING HEXA IN DECIMAL:
uh = hours - 16 * zh ;
ore = 10 * zh + uh;
zm = minutes / 16;
um = minutes - 16 * zm ;
miniti = 10 * zm + um;
for( int i = 20 ; i >0 ; i-- )
displayNumber01( ore * 100 + miniti );
// delay( 150 );
}
}
/*F********************************************************************
*
**********************************************************************/
void
displayNumber01( int toDisplay )
{
for( int digit = 4 ; digit > 0 ; digit--)
{ // TURN ON A DIGIT FOR A SHORT AMOUNT OF TIME
switch( digit )
{
case 1:
digitalWrite( digit1, DIGIT_ON);
digitalWrite( segDP, HIGH);
break;
case 2:
digitalWrite( digit2, DIGIT_ON);
digitalWrite( segDP, LOW);
break;
case 3:
digitalWrite( digit3, DIGIT_ON);
digitalWrite( segDP, HIGH);
break;
case 4:
digitalWrite( digit4, DIGIT_ON);
digitalWrite( segDP, HIGH);
break;
}
lightNumber( toDisplay % 10);
toDisplay /= 10;
delayMicroseconds( DISPLAY_BRIGHTNESS);
lightNumber( 10 ); // TURN OFF ALL SEGMENTS
digitalWrite( digit1, DIGIT_OFF); // TURN OFF ALL DIGITS
digitalWrite( digit2, DIGIT_OFF);
digitalWrite( digit3, DIGIT_OFF);
digitalWrite( digit4, DIGIT_OFF);
}
}
/*F********************************************************************
*
**********************************************************************/
void
displayNumber02( int toDisplay )
{
for( int digit = 4 ; digit > 0 ; digit--)
{ // TURN ON A DIGIT FOR A SHORT AMOUNT OF TIME
switch( digit )
{
case 1:
lightNumber( 10 );
digitalWrite( segDP, HIGH);
break;
case 2:
digitalWrite( digit2, DIGIT_ON);
digitalWrite( segDP, LOW);
break;
case 3:
digitalWrite( digit3, DIGIT_ON);
digitalWrite( segDP, HIGH);
break;
case 4:
digitalWrite( digit4, DIGIT_ON);
digitalWrite( segDP, HIGH);
break;
}
lightNumber( toDisplay % 10);
toDisplay /= 10;
delayMicroseconds( DISPLAY_BRIGHTNESS );
lightNumber( 10 ); // TURN OFF ALL SEGMENTS
digitalWrite( digit1, DIGIT_OFF ); // TURN OFF ALL DIGITS
digitalWrite( digit2, DIGIT_OFF );
digitalWrite( digit3, DIGIT_OFF );
digitalWrite( digit4, DIGIT_OFF );
}
}
/*F********************************************************************
*
**********************************************************************/
void
displayNumber03( int toDisplay )
{
for( int digit = 4 ; digit > 0 ; digit--)
{ // TURN ON A DIGIT FOR A SHORT AMOUNT OF TIME
switch( digit )
{
case 1:
digitalWrite( digit1, DIGIT_ON);
digitalWrite( segDP, HIGH);
break;
case 2:
digitalWrite( digit2, DIGIT_ON);
digitalWrite( segDP, HIGH);
break;
case 3:
digitalWrite( digit3, DIGIT_ON);
digitalWrite( segDP, HIGH);
break;
case 4:
digitalWrite( digit4, DIGIT_ON);
digitalWrite( segDP, HIGH);
break;
}
lightNumber( toDisplay % 10 );
toDisplay /= 10;
delayMicroseconds( DISPLAY_BRIGHTNESS );
lightNumber( 10 ); // TURN OFF ALL SEGMENTS
digitalWrite( digit1, DIGIT_OFF ); // TURN OFF ALL DIGITS
digitalWrite( digit2, DIGIT_OFF );
digitalWrite( digit3, DIGIT_OFF );
digitalWrite( digit4, DIGIT_OFF );
}
}
/*F********************************************************************
*
**********************************************************************/
void
displayNumber04( int toDisplay )
{
for( int digit = 4 ; digit > 0 ; digit--)
{ // TURN ON A DIGIT FOR A SHORT AMOUNT OF TIME
switch( digit )
{
case 1:
lightNumber( 10 );
digitalWrite( segDP, HIGH );
break;
case 2:
digitalWrite( digit2, DIGIT_ON );
digitalWrite( segDP, HIGH );
break;
case 3:
digitalWrite( digit3, DIGIT_ON );
digitalWrite( segDP, HIGH);
break;
case 4:
digitalWrite( digit4, DIGIT_ON);
digitalWrite( segDP, HIGH);
break;
}
lightNumber( toDisplay % 10 );
toDisplay /= 10;
delayMicroseconds( DISPLAY_BRIGHTNESS );
lightNumber( 10 ); // TURN OFF ALL SEGMENTS
digitalWrite( digit1, DIGIT_OFF ); // TURN OFF ALL DIGITS
digitalWrite( digit2, DIGIT_OFF );
digitalWrite( digit3, DIGIT_OFF );
digitalWrite( digit4, DIGIT_OFF );
}
}
/*F********************************************************************
* Given a number, turns on those segments
If number == 10, then turn off number
**********************************************************************/
void
lightNumber( int numberToDisplay )
{
switch( numberToDisplay )
{
case 0:
digitalWrite( segA, SEGMENT_ON );
digitalWrite( segB, SEGMENT_ON );
digitalWrite( segC, SEGMENT_ON );
digitalWrite( segD, SEGMENT_ON );
digitalWrite( segE, SEGMENT_ON );
digitalWrite( segF, SEGMENT_ON );
digitalWrite( segG, SEGMENT_OFF );
break;
case 1:
digitalWrite( segA, SEGMENT_OFF );
digitalWrite( segB, SEGMENT_ON );
digitalWrite( segC, SEGMENT_ON );
digitalWrite( segD, SEGMENT_OFF );
digitalWrite( segE, SEGMENT_OFF );
digitalWrite( segF, SEGMENT_OFF );
digitalWrite( segG, SEGMENT_OFF );
break;
case 2:
digitalWrite( segA, SEGMENT_ON );
digitalWrite( segB, SEGMENT_ON );
digitalWrite( segC, SEGMENT_OFF );
digitalWrite( segD, SEGMENT_ON );
digitalWrite( segE, SEGMENT_ON );
digitalWrite( segF, SEGMENT_OFF );
digitalWrite( segG, SEGMENT_ON );
break;
case 3:
digitalWrite( segA, SEGMENT_ON );
digitalWrite( segB, SEGMENT_ON );
digitalWrite( segC, SEGMENT_ON );
digitalWrite( segD, SEGMENT_ON );
digitalWrite( segE, SEGMENT_OFF );
digitalWrite( segF, SEGMENT_OFF );
digitalWrite( segG, SEGMENT_ON );
break;
case 4:
digitalWrite( segA, SEGMENT_OFF );
digitalWrite( segB, SEGMENT_ON );
digitalWrite( segC, SEGMENT_ON );
digitalWrite( segD, SEGMENT_OFF );
digitalWrite( segE, SEGMENT_OFF );
digitalWrite( segF, SEGMENT_ON );
digitalWrite( segG, SEGMENT_ON );
break;
case 5:
digitalWrite( segA, SEGMENT_ON );
digitalWrite( segB, SEGMENT_OFF );
digitalWrite( segC, SEGMENT_ON );
digitalWrite( segD, SEGMENT_ON );
digitalWrite( segE, SEGMENT_OFF );
digitalWrite( segF, SEGMENT_ON );
digitalWrite( segG, SEGMENT_ON );
break;
case 6:
digitalWrite( segA, SEGMENT_ON );
digitalWrite( segB, SEGMENT_OFF );
digitalWrite( segC, SEGMENT_ON );
digitalWrite( segD, SEGMENT_ON );
digitalWrite( segE, SEGMENT_ON );
digitalWrite( segF, SEGMENT_ON );
digitalWrite( segG, SEGMENT_ON );
break;
case 7:
digitalWrite( segA, SEGMENT_ON );
digitalWrite( segB, SEGMENT_ON );
digitalWrite( segC, SEGMENT_ON );
digitalWrite( segD, SEGMENT_OFF );
digitalWrite( segE, SEGMENT_OFF );
digitalWrite( segF, SEGMENT_OFF );
digitalWrite( segG, SEGMENT_OFF );
break;
case 8:
digitalWrite( segA, SEGMENT_ON );
digitalWrite( segB, SEGMENT_ON );
digitalWrite( segC, SEGMENT_ON );
digitalWrite( segD, SEGMENT_ON );
digitalWrite( segE, SEGMENT_ON );
digitalWrite( segF, SEGMENT_ON );
digitalWrite( segG, SEGMENT_ON );
break;
case 9:
digitalWrite( segA, SEGMENT_ON );
digitalWrite( segB, SEGMENT_ON );
digitalWrite( segC, SEGMENT_ON );
digitalWrite( segD, SEGMENT_ON );
digitalWrite( segE, SEGMENT_OFF );
digitalWrite( segF, SEGMENT_ON );
digitalWrite( segG, SEGMENT_ON );
break;
// ALL SEGMENT ARE ON
case 10:
digitalWrite( segA, SEGMENT_OFF );
digitalWrite( segB, SEGMENT_OFF );
digitalWrite( segC, SEGMENT_OFF );
digitalWrite( segD, SEGMENT_OFF );
digitalWrite( segE, SEGMENT_OFF );
digitalWrite( segF, SEGMENT_OFF );
digitalWrite( segG, SEGMENT_OFF );
break;
}
}