#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#ifdef ARDUINO_ARCH_MEGAAVR
#include "EveryTimerB.h"
#define Timer1 TimerB2 // use TimerB2 as a drop in replacement for Timer1
#else // assume architecture supported by TimerOne ....
#include "TimerOne.h"
#endif
#define MICROSEKUNDEN 680000
#define UP_PIN 2
#define DOWN_PIN 3
enum MODE{ RUN, SET_HOUR, SET_MIN, SET_SEC };
enum MODE mode = RUN;
volatile bool blink = false;
volatile long hour = 0;
volatile long minute = 0;
volatile long second = 0;
volatile long count_sec = 72000;
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
void Timer1_Interrupt()
{
++count_sec %= 86400;
}
void setup() {
Timer1.initialize(MICROSEKUNDEN);
Timer1.attachInterrupt(Timer1_Interrupt);
Serial.begin( 9600 );
pinMode( UP_PIN, INPUT_PULLUP );
pinMode( DOWN_PIN, INPUT_PULLUP );
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
//display.setCursor(0,0);
//display.print("Uhrzeit: ");
//display.display();
}
void loop() {
display.clearDisplay();
display.setCursor( 30, 10 );
display.print( count_sec );
display.display();
delay( 10 );
}
/*
#include "TimerOne.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define MICROSEKUNDEN 680000
#define MODE_PIN 2
#define UP_PIN 3
#define DOWN_PIN 4
enum MODE{ RUN, SET_HOUR, SET_MIN, SET_SEC };
enum MODE mode = RUN;
bool blink = false;
long hour = 0;
long minute = 0;
long second = 0;
long count_sec = 72000;
LiquidCrystal_I2C lcd(39,16,2);
void Timer1_Interrupt()
{
//Serial.println("*");
++count_sec %= 86400;
}
//--------------------------------------------
void setup()
//--------------------------------------------
{
Serial.begin( 9600 );
pinMode( MODE_PIN, INPUT_PULLUP );
pinMode( UP_PIN, INPUT_PULLUP );
pinMode( DOWN_PIN, INPUT_PULLUP );
lcd.init();
lcd.backlight();
lcd.setCursor(3,0);
lcd.setCursor(3,1);
lcd.print("Mode: ");
displayMode();
Timer1.initialize(MICROSEKUNDEN);
Timer1.attachInterrupt(Timer1_Interrupt);
}
//--------------------------------------------
void loop()
//--------------------------------------------
{
checkAndChangeMode();
if( mode == RUN )displayTime();
else if(mode == SET_HOUR) hour = setValue( hour, 24, 3, 0);
else if(mode == SET_MIN) minute = setValue( minute, 60, 6, 0);
else if(mode == SET_SEC) second = setValue( second, 60, 9, 0);
}
//--------------------------------------------
void checkAndChangeMode()
//--------------------------------------------
{
if( digitalRead( MODE_PIN ) == LOW ){
switch (mode){
case RUN: mode = SET_HOUR; break;
case SET_HOUR: mode = SET_MIN; setTime(); break;
case SET_MIN: mode = SET_SEC; setTime(); break;
case SET_SEC: mode = RUN; setTime(); break;
default: mode = RUN; break;
}
displayMode();
delay( 150 );
}
}
//--------------------------------------------
void displayMode()
//--------------------------------------------
{
lcd.setCursor(9,1);
lcd.print( mode );
}
//--------------------------------------------
void calcTime(){
//--------------------------------------------
hour = count_sec / 3600;
minute = (count_sec - hour * 3600) / 60;
second = count_sec % 60;
}
//--------------------------------------------
void setTime(){
//--------------------------------------------
count_sec = hour*3600 + minute*60 + second;
}
//--------------------------------------------
void displayTime()
//--------------------------------------------
{
calcTime();
dispTwoDigits( 3, 0, hour, ":");
dispTwoDigits( 6, 0, minute, ":");
dispTwoDigits( 9, 0, second, "");
}
//--------------------------------------------------------------
void dispTwoDigits( int x, int y, int number, String appendix )
//--------------------------------------------------------------
{
lcd.setCursor(x,y);
if( number < 10 )lcd.print("0");
lcd.print(number);
lcd.print( appendix );
}
//--------------------------------------------------------------------
long setValue( long getValue, int devider, int xLcdPos, int yLcdPos )
//--------------------------------------------------------------------
{
long value = getValue;
if( digitalRead(UP_PIN) == LOW ){
value = (value + 1) % devider;
delay( 50 );
}
else if( digitalRead(DOWN_PIN) == LOW ){
value = (value + devider - 1) % devider;
delay( 50 );
}
if( blink ){
dispTwoDigits( xLcdPos, yLcdPos, value, "");
}else{
lcd.setCursor(xLcdPos,yLcdPos);lcd.print(" ");
}
delay(100);
dispTwoDigits( xLcdPos, yLcdPos, value, "");//don't leave value blank
blink = !blink;
return value;
}
*/