Sometimes also referred to as "Clockduino" or "Countdown Timer".
The only genuine Swiss Arduino Clock in the World. With Alarm and Countdown functionality ...
✈ Hardware Description
The CTSP shield uses a CMOS clock and calendar circuit, optimised for low power
consumption. Addresses and data are transferred serially via the two-line bidirectional
I2C-bus. It is buffered with a 1 F capacitor to allow continuous operation. A PCF8593T from NXP is used here, but there are a lot of
pin-compatible types out there. Four push buttons allow to set the time and the alarm. Special functions mayst evaluate the pressing
of more than one button. The display uses 4 seven segment displays to show 4 digits (CC). The Arduino (UNO) multiplexes them. A small
beeper mayst be used as an alarm (or countdown timer beep :-)
The device is supplied with an external battery in the range of 7 ... 12 V. Use curly wires under any circumstances. Multiple
colours and some redundancy wires enhance the impression. We use 5 times an 1,5 V Baby C/ LR14/ AM2/ 4014/Alkaline Batterie
resulting in a supply voltage of 7.5 V. The "battery case" is made of platic tubes, wrapped in paper.
✈ Calibrating that thing
The PCF8593 has an 1 Hz (1 pps) output. This is K6 (in the schematics) or "CAL" on the pcb. Connect a high resolution counter and
adjust the Capacitor C2 to get 1.00000000 Hz. If the required accuracy is within 1 second per day you need at least an 8 digit frequency
counter with an accuracy of 1 ppm. Here 1 ppm equals 32.768 mHz.
✈ Arduino Sketch - The Code (for a simple clock)
The buttons are used to set the clock.
/*
* ARDUINO CLOCK WITH PCF8593 I2C RTC
* https://www.changpuak.ch/electronics/Arduino-ClockToSchool.php
* Software Version 2.2
* 14.01.2016, Alexander C. Frank
*/
#include "Wire.h"
#define PCF8593ADR 0x51
#include "TimerOne.h" // Timer Interrupt Handling
// 50 Hz Scanrate >> 20 ms per 4 digits >> Interrupt every 5 ms
int alle_x_millisekunden = 5 ;
// 7-Segment
int ActualDigit ;
int ActualDigitValue ;
int A = 2;
int B = 3;
int C = 4;
int D = 5;
int E = 6;
int F = 7;
int G = 8;
int DP = 9;
int BEEP = A3;
int Digit1 = 13;
int Digit2 = 12;
int Digit3 = 11;
int Digit4 = 10;
int DETONATOR = A2;
int Key = A0;
int KeyValue = 0;
byte second, minute, hour ;
byte bcdToDec(byte value)
{
return ((value / 16) * 10 + value % 16);
}
byte decToBcd(byte value){
return (value / 10 * 16 + value % 10);
}
void SetPCF8593()
{
Wire.beginTransmission(PCF8593ADR);
Wire.write(0x00);
Wire.write(decToBcd(0)); // CONTROL
Wire.write(decToBcd(0)); // HUNDRETHS
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.endTransmission();
}
void ReadPCF8593()
{
Wire.beginTransmission(PCF8593ADR);
Wire.write(0x03);
Wire.endTransmission();
Wire.requestFrom(PCF8593ADR, 2);
minute = bcdToDec(Wire.read() & B01111111);
hour = bcdToDec(Wire.read() & B00111111);
}
void setup()
{
Wire.begin();
Serial.begin(9600);
second = 0;
minute = 0;
hour = 0;
// SetPCF8593();
Timer1.initialize(alle_x_millisekunden*1000) ;
Timer1.attachInterrupt(NextDigit) ;
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(DP, OUTPUT);
pinMode(BEEP, OUTPUT);
pinMode(Digit1, OUTPUT);
pinMode(Digit2, OUTPUT);
pinMode(Digit3, OUTPUT);
pinMode(Digit4, OUTPUT);
pinMode(DETONATOR, OUTPUT);
}
void DisplayDigit(int value)
{
while (value >= 10) value = value - 10;
switch (value)
{
case 0 :
digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW);
digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, LOW);
digitalWrite(G, HIGH);
break;
case 1 :
digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, LOW);
digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
break;
case 2 :
digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, HIGH);
digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, HIGH);
digitalWrite(G, LOW);
break;
case 3 :
digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW);
digitalWrite(D, LOW); digitalWrite(E, HIGH); digitalWrite(F, HIGH);
digitalWrite(G, LOW);
break;
case 4 :
digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, LOW);
digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 5 :
digitalWrite(A, LOW); digitalWrite(B, HIGH); digitalWrite(C, LOW);
digitalWrite(D, LOW); digitalWrite(E, HIGH); digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 6 :
digitalWrite(A, LOW); digitalWrite(B, HIGH); digitalWrite(C, LOW);
digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 7 :
digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW);
digitalWrite(D, HIGH); digitalWrite(E, HIGH); digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
break;
case 8 :
digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW);
digitalWrite(D, LOW); digitalWrite(E, LOW); digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
case 9 :
digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW);
digitalWrite(D, LOW); digitalWrite(E, HIGH); digitalWrite(F, LOW);
digitalWrite(G, LOW);
break;
}
}
void NextDigit()
{
ActualDigit = ActualDigit + 1;
if (ActualDigit > 4) ActualDigit = 1;
int HH = hour / 10;
int H = hour - ( HH * 10 ) ;
int MM = minute / 10 ;
int M = minute - ( MM * 10 ) ;
switch (ActualDigit)
{
case 1 : ActualDigitValue = HH ; break ;
case 2 : ActualDigitValue = H ; break ;
case 3 : ActualDigitValue = MM ; break ;
case 4 : ActualDigitValue = M ; break ;
}
DisplayDigit(ActualDigitValue);
switch (ActualDigit)
{
case 1 : digitalWrite(Digit1, LOW) ; digitalWrite(Digit2, HIGH) ;
digitalWrite(Digit3, HIGH) ; digitalWrite(Digit4, HIGH) ; break ;
case 2 : digitalWrite(Digit1, HIGH) ; digitalWrite(Digit2, LOW) ;
digitalWrite(Digit3, HIGH) ; digitalWrite(Digit4, HIGH) ; break ;
case 3 : digitalWrite(Digit1, HIGH) ; digitalWrite(Digit2, HIGH) ;
digitalWrite(Digit3, LOW) ; digitalWrite(Digit4, HIGH) ; break ;
case 4 : digitalWrite(Digit1, HIGH) ; digitalWrite(Digit2, HIGH) ;
digitalWrite(Digit3, HIGH) ; digitalWrite(Digit4, LOW) ; break ;
}
}
void loop()
{
ReadPCF8593();
KeyValue = analogRead(Key);
// NO KEY = 930, KEY1 = 754, KEY2 = 579, KEY3 = 396, KEY4 = 193
if ((KeyValue < 842) && (KeyValue > 666))
{
// KEY1 WAS PRESSED
hour = hour + 10;
if (hour > 23) hour = hour - 30;
SetPCF8593();
}
if ((KeyValue < 665) && (KeyValue > 489))
{
// KEY2 WAS PRESSED
hour = hour + 1;
if (hour > 23) hour = 0;
SetPCF8593();
}
if ((KeyValue < 488) && (KeyValue > 296))
{
// KEY3 WAS PRESSED
minute = minute + 10;
if (minute > 59) minute = minute - 60;
SetPCF8593();
}
if ( KeyValue < 295 )
{
// KEY4 WAS PRESSED
minute = minute + 1;
if (minute > 59) minute = 0;
SetPCF8593();
}
delay(1000);
}
✈ Showing that thing to my teachers (et al :-)
@ my school : passed@ airport : pending ...
✈ Advanced Tips
• Do not forget your new clock in a train, tram or taxi. • We shall not be held responsible, if the "show your teacher" part fails.
✈ Share your thoughts
The webmaster does not read these comments regularely. Urgent questions should be send via email.
Ads or links to completely uncorrelated things will be removed.