/*
4 digit 7 segment display: http://www.sparkfun.com/products/9483
Datasheet: http://www.sparkfun.com/datasheets/Components/LED/7-Segment/YSD-439AR6B-35.pdf
7 segments + 4 digits + 1 colon = 12 pins required for full control
*/
// modified connexion by niq_ro from http://nicuflorica.blogspot.com
// for my Luckylight KW4-563ASA
// dataseet: http://www.tme.eu/ro/Document/dfc2efde2e22005fd28615e298ea2655/KW4-563XSA.pdf
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)
//Pin mapping from Arduino to the ATmega DIP28 if you need it
//http://www.arduino.cc/en/Hacking/PinMapping
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
#include < Wire .h>
#include "RTClib.h"
RTC_DS1307 RTC;
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
// original sketck from http://learn.adafruit.com/ds1307-real-time-clock-breakout-board-kit/
// add part with SQW=1Hz from http://tronixstuff.wordpress.com/2010/10/20/tutorial-arduino-and-the-i2c-bus/
// add part with manual adjust http://www.bristolwatch.com/arduino/arduino_ds1307.htm
byte SW0 = A0;
byte SW1 = A1;
byte SW2 = A2;
// use for hexa in zecimal conversion
int zh, uh, ore;
int zm, um, miniti;
void setup () {
// Serial.begin(57600);
Wire . begin ();
RTC. begin ();
// RTC. adjust ( DateTime (__DATE__, __TIME__));
// if you need set clock... just remove // from line above this
// part code for flashing LED
Wire . beginTransmission (0x68);
Wire . write (0x07); // move pointer to SQW address
// Wire.write(0x00); // turns the SQW pin off
Wire . write (0x10); // sends 0x10 (hex) 00010000 (binary) to control register - turns on square wave at 1Hz
// Wire.write(0x13); // sends 0x13 (hex) 00010011 (binary) 32kHz
Wire . endTransmission ();
if (! RTC. isrunning ()) {
Serial . println ( "RTC is NOT running!" );
// following line sets the RTC to the 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 (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 );
}
void loop () {
digitalWrite (segDP, HIGH );
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 the switch to set time
}
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++;
// 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 ((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); // Control 0x10 produces a 1 HZ square wave on pin 7.
Wire . endTransmission ();
// 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);
}
// delay(150);
}
}
void displayNumber01( int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
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);
//Turn off all segments
lightNumber(10);
//Turn off all digits
digitalWrite (digit1, DIGIT_OFF);
digitalWrite (digit2, DIGIT_OFF);
digitalWrite (digit3, DIGIT_OFF);
digitalWrite (digit4, DIGIT_OFF);
}
}
void displayNumber02( int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
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);
//Turn off all segments
lightNumber(10);
//Turn off all digits
digitalWrite (digit1, DIGIT_OFF);
digitalWrite (digit2, DIGIT_OFF);
digitalWrite (digit3, DIGIT_OFF);
digitalWrite (digit4, DIGIT_OFF);
}
}
void displayNumber03( int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
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);
//Turn off all segments
lightNumber(10);
//Turn off all digits
digitalWrite (digit1, DIGIT_OFF);
digitalWrite (digit2, DIGIT_OFF);
digitalWrite (digit3, DIGIT_OFF);
digitalWrite (digit4, DIGIT_OFF);
}
}
void displayNumber04( int toDisplay) {
#define DISPLAY_BRIGHTNESS 500
#define DIGIT_ON HIGH
#define DIGIT_OFF LOW
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);
//Turn off all segments
lightNumber(10);
//Turn off all digits
digitalWrite (digit1, DIGIT_OFF);
digitalWrite (digit2, DIGIT_OFF);
digitalWrite (digit3, DIGIT_OFF);
digitalWrite (digit4, DIGIT_OFF);
}
}
//Given a number, turns on those segments
//If number == 10, then turn off number
void lightNumber( int numberToDisplay) {
#define SEGMENT_ON LOW
#define SEGMENT_OFF HIGH
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 ;
}
}
VIDEO
11.10.2016
I correct sketch for display 10:00 case..
07.02.2017