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;
    }
}