// include the library
#include <LiquidCrystal.h>
// initialize the interface pins
LiquidCrystal lcd(2,3,4,5,6,7);
int s,m,h,d,state_SET,state_UP,state_DOWN,dg,cnt;
// the 8 arrays that form each segment of the custom numbers
byte bar1[8] =
{
B11100,
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
B11100
};
byte bar2[8] =
{
B00111,
B01111,
B01111,
B01111,
B01111,
B01111,
B01111,
B00111
};
byte bar3[8] =
{
B11111,
B11111,
B00000,
B00000,
B00000,
B00000,
B11111,
B11111
};
byte bar4[8] =
{
B11110,
B11100,
B00000,
B00000,
B00000,
B00000,
B11000,
B11100
};
byte bar5[8] =
{
B01111,
B00111,
B00000,
B00000,
B00000,
B00000,
B00011,
B00111
};
byte bar6[8] =
{
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111,
B11111
};
byte bar7[8] =
{
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B00111,
B01111
};
byte bar8[8] =
{
B11111,
B11111,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000
};
// =======================================
// setup
// =======================================
void setup()
{
// assignes each segment a write number
lcd.createChar(1,bar1);
lcd.createChar(2,bar2);
lcd.createChar(3,bar3);
lcd.createChar(4,bar4);
lcd.createChar(5,bar5);
lcd.createChar(6,bar6);
lcd.createChar(7,bar7);
lcd.createChar(8,bar8);
state_SET = 1; // für den Set Button
state_UP = 1; // für den Up Button
state_DOWN = 1; // für den Down Button
// sets the LCD's rows and colums:
lcd.begin(16, 2);
// sets the input pins for buttons
// setzen auf Pullup -> gedrückt = LOW, nicht gedrückt = HIGH
pinMode(8,INPUT_PULLUP);
pinMode(9,INPUT_PULLUP);
pinMode(10,INPUT_PULLUP);
s=0; // second
m=0; // minute
h=0; // hour
}
void custom0(int col)
{ // uses segments to build the number 0
lcd.setCursor(col, 0);
lcd.write(2);
lcd.write(8);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(2);
lcd.write(6);
lcd.write(1);
}
void custom1(int col)
{
lcd.setCursor(col,0);
lcd.write(32);
lcd.write(32);
lcd.write(1);
lcd.setCursor(col,1);
lcd.write(32);
lcd.write(32);
lcd.write(1);
}
void custom2(int col)
{
lcd.setCursor(col,0);
lcd.write(5);
lcd.write(3);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(2);
lcd.write(6);
lcd.write(6);
}
void custom3(int col)
{
lcd.setCursor(col,0);
lcd.write(5);
lcd.write(3);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(7);
lcd.write(6);
lcd.write(1);
}
void custom4(int col)
{
lcd.setCursor(col,0);
lcd.write(2);
lcd.write(6);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(32);
lcd.write(32);
lcd.write(1);
}
void custom5(int col)
{
lcd.setCursor(col,0);
lcd.write(2);
lcd.write(3);
lcd.write(4);
lcd.setCursor(col, 1);
lcd.write(7);
lcd.write(6);
lcd.write(1);
}
void custom6(int col)
{
lcd.setCursor(col,0);
lcd.write(2);
lcd.write(3);
lcd.write(4);
lcd.setCursor(col, 1);
lcd.write(2);
lcd.write(6);
lcd.write(1);
}
void custom7(int col)
{
lcd.setCursor(col,0);
lcd.write(2);
lcd.write(8);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(32);
lcd.write(32);
lcd.write(1);
}
void custom8(int col)
{
lcd.setCursor(col, 0);
lcd.write(2);
lcd.write(3);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(2);
lcd.write(6);
lcd.write(1);
}
void custom9(int col)
{
lcd.setCursor(col, 0);
lcd.write(2);
lcd.write(3);
lcd.write(1);
lcd.setCursor(col, 1);
lcd.write(7);
lcd.write(6);
lcd.write(1);
}
void printNumber(int value, int col) {
if (value == 0) { custom0(col); }
if (value == 1) { custom1(col); }
if (value == 2) { custom2(col); }
if (value == 3) { custom3(col); }
if (value == 4) { custom4(col); }
if (value == 5) { custom5(col); }
if (value == 6) { custom6(col); }
if (value == 7) { custom7(col); }
if (value == 8) { custom8(col); }
if (value == 9) { custom9(col); }
}
// ==========================
// loop
// ==========================
// cnt=1: Minuten setzen
// cnt=2: Stunden setzen
// cnt=3: Sekunden ändern
void loop()
{
// ==========================================
// Button Auswertung
// ==========================================
// SET button
if(!digitalRead(8) & state_SET==1){
cnt++;
state_SET=0;
if(cnt>3){ cnt=0; }
switch(cnt){
case 0:
lcd.setCursor(15, 1);
lcd.print( " " );
break;
case 1:
lcd.setCursor(15, 1);
lcd.print( "M" );
break;
case 2:
lcd.setCursor(15, 1);
lcd.print( "H" );
break;
case 3:
lcd.setCursor(15, 1);
lcd.print( "S" );
break;
}
}else if(digitalRead(8)&state_SET==0){
state_SET=1;
}
// UP Button
if(!digitalRead(9)&&state_UP==1){
dg=1;
state_UP=0;
}else if(digitalRead(9)&state_UP==0){
state_UP=1;
}
// DOWN Button
if(!digitalRead(10)&&state_DOWN==1){
dg=-1;
state_DOWN=0;
} else if(digitalRead(10)&state_DOWN==0){
state_DOWN=1;
}
// ===========================================
// Im Set Modus (cnt=[1,2,3]) die Werte ändern
// ===========================================
switch(cnt){
case 1: // Minuten +/+
m = m + dg;
dg = 0;
if(m>59){ m=0; }
if(m<0) { m=59; }
break;
case 2: // Stunden +/-
h = h + dg;
dg = 0;
if(h>23){ h=0; }
if(h<0) { h=23;}
break;
case 3: // Sekunden +/- in 10er Schritten
if( dg !=0 ) {
s = ((s + (dg*10))/10)*10;;
dg = 0;
if(s>59) { s = 0; }
if(s<0 ) { s =59; }
}
break;
}
// Wenn Sekunden übergelaufen sind, dann Minuten +1
// und ggf. Stunden +1
if(s>59){
s=0;
m++;
if(m>59){
m=0;
h++;
if(h>23){
h=0;
}
}
}
// ===========================================
// Anzeige der aktuellen Zeit
// ==========================================
// Stunde 10er
d=h/10;
printNumber(d, 0);
// Stunde 1er
d=h%10;
printNumber(d, 3);
// Minute 10er
d=m/10;
printNumber(d, 7);
// Munute 1er
d=m%10;
printNumber(d, 10);
// Sekunden
if(s<10) {
lcd.setCursor(14, 0);
lcd.print( "0");
lcd.setCursor(15, 0);
lcd.print( String( s ) );
} else {
lcd.setCursor(14, 0);
lcd.print( String( s ) );
}
// wenn im normalmodus(cnt=1), dann Sekunden +1 und Blinken und
// 1 Sekunde warten
if(cnt==0){
s++;
lcd.setCursor(6, 0);
lcd.print(" ");
lcd.setCursor(6, 1);
lcd.print(" ");
delay(500);
lcd.setCursor(6, 0);
lcd.print(".");
lcd.setCursor(6, 1);
lcd.print(".");
delay(500);
}
}