Home » Klok

Klok

//1-11-2021 Klok werkt en is instelbaar
//18-11-2021 Alarm gereedmaken
//DS1302 VCC — +5
// GND — GND
// RST — 2
// i/o — 3
// CLK — 4
// uno
//MAX7219 VCC — +5
// GND — GND
// CS — 10
// DIN — 11
// CLK — 13
// Mega
//MAX7219 VCC — +5
// GND — GND
// CS — 53
// DIN — 51
// CLK — 52

#include
// http://quadpoint.org/projects/arduino-ds1302
#include
#include
#include
#include

#include
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); }
#define PRINTS(x) Serial.print(F(x))
#define PRINTD(x) Serial.println(x, DEC)
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTD(x)
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CLK_PIN 13 // or SCK uno
#define DATA_PIN 11 // or MOSI uno
#define CS_PIN 10 // or SS uno
#define CLK_PIN 52// or SCK mega
#define DATA_PIN 51 // or MOSI mega
#define CS_PIN 53 // or SS mega
#define DELAYTIME 100 // in milliseconds
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

int melody[] = {

NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};

String Tsec, Tmin, Tuur, Tdag, Tmaand, Tjaar, Tdatum, WeekDag;
char VoorloopSec;
String DisplayText = “123456789012345”;
String DisplayTextOld = “123456789012345”;
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {

4, 8, 8, 4, 4, 4, 4, 4
};

// Set the appropriate digital I/O pin connections. These are the pin
// assignments for the Arduino as well for as the DS1302 chip. See the DS1302
// datasheet:
//
// http://datasheets.maximintegrated.com/en/ds/DS1302.pdf
const int kCePin = 2; // Chip Enable
const int kIoPin = 3; // Input/Output
const int kSclkPin = 4; // Serial Clock

int uur[14];
int Minuut[14];
int minuut;
int menu = 0;
int menuAlarm = 0;
int hourupg = 12;
int minupg = 45;
int hourAlarmupg = 12;
int hourAlarm[14] ;
int minAlarmupg = 45;
int minAlarm[14] ;
int yearupg = 2021;
int monthupg = 11;
int dayupg = 1;
int dayWupg = 1;
int Day = 0;
int AlarmOnOffupg;
int AlarmOnOff[14];
int DagTeller = 0;
int AlarmAan = 0;
bool AlarmAan2 = 0;
int Zo = 0;
int Ma = 0;
int WeekEven = 0;
String dag[14] = {“ZO ev”, “MA ev”, “DI ev”, “WO ev”, “DO ev”, “VR ev”, “ZA ev”, “ZO on”, “MA on”, “DI on”, “WO on”, “DO on”, “VR on”, “ZA on”};
String dagvandeweek[14] = {“Zondag”, “Maandag”, “Dinsdag”, “Woensdag”, “Donderdag”, “Vrijdag”, “Zaterdag”, “Zondag”, “Maandag”, “Dinsdag”, “Woensdag”, “Donderdag”, “Vrijdag”, “Zaterdag”};

// Create a DS1302 object.
DS1302 rtc(kCePin, kIoPin, kSclkPin);

String dayAsString(const Time::Day day) {
switch (day) {
case Time::kSunday: return “Zondag”;
case Time::kMonday: return “Maandag”;
case Time::kTuesday: return “Dinsdag”;
case Time::kWednesday: return “Woensdag”;
case Time::kThursday: return “Donderdag”;
case Time::kFriday: return “Vrijdag”;
case Time::kSaturday: return “Zaterdag”;
}
return “(onbekendedag)”;
}

void printTime() {
// Get the current time and date from the chip.
Time t = rtc.time();
// Name the day of the week.
const String day = dayAsString(t.day);
// Format the time and date and insert into the temporary buffer.
char buf[50];
snprintf(buf, sizeof(buf), “%s %04d-%02d-%02d %02d:%02d:%02d”,
day.c_str(),
t.yr, t.mon, t.date,
t.hr, t.min, t.sec);
// Print the formatted string to serial so we can see the time.
Serial.println(buf);
Tsec = String(t.sec);
Tmin = String(t.min);
minupg = Tmin.toInt();
Tuur = String(t.hr);
hourupg = Tuur.toInt();
Tdatum = String(t.date);
dayupg = Tdatum.toInt();
Tmaand = String(t.mon);
monthupg = Tmaand.toInt();
Tjaar = String(t.yr);
yearupg = Tjaar.toInt();
WeekDag = day.c_str();
if (EEPROM.read(60) == 1) {
snprintf(buf, sizeof(buf), “%02d:%02d”,
t.hr, t.min);
}
else
{
snprintf(buf, sizeof(buf), “%02d.%02d”,
t.hr, t.min);
}
DisplayText = buf;
//Serial.println(t.sec);
}

void Intens() {
P.setIntensity(0); //stuur het naar matrix print
}
void Weeknummer() {
if (String(“Zondag”) == String(WeekDag)) {
if (EEPROM.read(61) == 0) { // kijken naar Maandag
Zo = 1;
if (EEPROM.read(60) == 0) {
EEPROM.write(60, 1);
Serial.println(“Save Zo1”);
}
}
else
{
Zo = 0;
if (EEPROM.read(60) == 1) {
EEPROM.write(60, 0);
Serial.println(“Save Zo0”);
}
}
}

if (String(“Maandag”) == String(WeekDag)) {
if (EEPROM.read(60) == 1) { // kijken naar Zondag
Ma = 1;
if (EEPROM.read(61) == 0) {
EEPROM.write(61, 1);
Serial.println(“Save Ma1”);
}
}
else
{
Ma = 0;
if (EEPROM.read(61) == 1) {
EEPROM.write(61, 0);
Serial.println(“Save Ma0”);
}

}
}
}

void Zoemer() {
if (digitalRead(6 ) == LOW) {
noTone(8);
AlarmAan2 = false;
AlarmAan = 0;
}
else
{ if ((AlarmAan == 1) && (AlarmAan2 == true)) {
for (int thisNote = 0; thisNote < 8; thisNote++) { // to calculate the note duration, take one second divided by the note type. //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc. int noteDuration = 1000 / noteDurations[thisNote]; tone(8, melody[thisNote], noteDuration); // to distinguish the notes, set a minimum time between them. // the note's duration + 30% seems to work well: int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // stop the tone playing: noTone(8); } } } } void setup() { P.begin(); Serial.begin(9600); pinMode(5, INPUT_PULLUP); // Rode drukknop pinMode(6, INPUT_PULLUP); // Zwarte drukknop pinMode(7, INPUT_PULLUP); // Schakelaar if (EEPROM.read(60) > 1) { // eerste keer als eeprom nog op 255 staat
//EEPROM.write(60, 0);
}
if (EEPROM.read(61) > 1) { // eerste keer als eeprom nog op 255 staat
// EEPROM.write(61, 0);
}
// Initialize a new chip by turning off write protection and clearing the
// clock halt flag. These methods needn’t always be called. See the DS1302
// datasheet for details.
rtc.writeProtect(false);
rtc.halt(false);

// Make a new time object to set the date and time.
// Sunday, September 22, 2013 at 01:38:50.
// Time t(2021, 10, 28, 13, 37, 50, Time::kSunday);

// Set the time and date on the chip.
// rtc.time(t);
}

void loop() {
int DrukknopRood = digitalRead(5); // enter/next
int DrukknopZwart = digitalRead(6); // time/alarm up
int Schakelaar = digitalRead(7); //time/alarm
Intens();
printTime();
Alarm();
Weeknummer();
delay(250);
if (digitalRead(7 ) == LOW)
{
DisplayTextOld = ” “;
DisplayText = “Alarm”;
delay(250);
if (digitalRead(5 ) == LOW)
{
delay(250);
menuAlarm = menuAlarm + 1;
P.setTextAlignment(PA_LEFT);
}

// in which subroutine should we go?
if (menuAlarm == 0)
{
DisplayTime(); // void DisplayTime
}
if (menuAlarm == 1)
{
DisplaySetDayAlarm();
} if (menuAlarm == 2)
{
DisplaySetHourAlarm();
}
if (menuAlarm == 3)
{
DisplaySetMinuteAlarm();
}
if (menuAlarm == 4)
{
DisplaySetAlarmOnOff();
}
if (menuAlarm > 4)
{

DisplayTextOld = ” “;
DisplayText = “Save”;
EEPROM.write(DagTeller, hourAlarmupg);
EEPROM.write(20 + DagTeller, minAlarmupg);
EEPROM.write(40 + DagTeller, AlarmOnOffupg);
delay(2050);
menuAlarm = 0;

String Save1 = “Dag:” + String(DagTeller);
P.print(DisplayText);
delay(250);
}
}

else
{
// check if you press the SET button and increase the menu index
if (digitalRead(5 ) == LOW)
{
delay(250);
menu = menu + 1;
P.setTextAlignment(PA_LEFT);
}
// in which subroutine should we go?
if (menu == 0)
{
DisplayTime(); // void DisplayTime
}
if (menu == 1)
{
DisplaySetHour();
}
if (menu == 2)
{
DisplaySetMinute();
}
if (menu == 3)
{
DisplaySetYear();
}
if (menu == 4)
{
DisplaySetMonth();
}
if (menu == 5)
{
DisplaySetDay();
}
if (menu == 6)
{
DisplaySetDayofWeek();
}
if (menu == 7)
{
DisplayWeekEvenOnEven();
}
if (menu > 7)
{
DisplayTextOld = ” “;
DisplayText = “Time”;
menu = 0;
DisplayTime();
delay(500);
}
}
}
void DisplayTime()
{
if (digitalRead(6 ) == LOW)
{
AlarmAan2 = !AlarmAan2;
DisplayText = ” “;
delay(250);
}
if (DisplayText != DisplayTextOld) {
P.setTextAlignment(PA_CENTER);
if ((AlarmAan == 1) && (AlarmAan2 == true)) {
P.print(DisplayText + “‘”);
}
else
{
P.print(DisplayText + ” “);
}
}
DisplayTextOld = DisplayText;
delay(250);
Serial.print(“AlarmAan “);
Serial.println(AlarmAan);
Serial.print(“AlarmAan2 “);
Serial.println(AlarmAan2);
Serial.println(EEPROM.read(60));
Serial.println(EEPROM.read(61));
AlarmAan = 0;
}

void Alarm()
{
for (int i = 0; i <= 14; i++) { if (dagvandeweek[i] == WeekDag) { if (EEPROM.read(40 + i) == 1) { AlarmAan = 1; } } // Serial.println(WeekDag); // Serial.println(dagvandeweek[i]); // Serial.println(EEPROM.read(i + 40)); // Serial.println(hourupg); if (EEPROM.read(i) == hourupg) { if (EEPROM.read(i + 20) == minupg) { if (dagvandeweek[i] == WeekDag) { if (EEPROM.read(40 + i) == 1) { Zoemer(); } } } } } } void DisplaySetDayAlarm() { if (DagTeller > 13) {
DagTeller = 0;
}
P.setTextAlignment(PA_CENTER);
P.print(dag[DagTeller] );
delay(500);
if (EEPROM.read(40 + DagTeller) == 1) {
String Uur1 = String(EEPROM.read(DagTeller )) + “:” + String(EEPROM.read(20 + DagTeller )) + ” a” ;
P.print(Uur1);
}
else
{
String Uur1 = “Alarm U” ;
P.print(Uur1);
}
delay(250);
if (digitalRead(6 ) == LOW) {
DagTeller = DagTeller + 1;
delay(500);
}
}
void DisplaySetHourAlarm()
{
if (digitalRead(6 ) == LOW) {
hourAlarmupg = hourAlarmupg + 1;

if (hourAlarmupg > 23) {
hourAlarmupg = 0;
}
hourAlarm[DagTeller] = hourAlarmupg;
delay(150);
}
String Uur1 = “uur ” + String(hourAlarmupg);
P.print(Uur1);
}

void DisplaySetMinuteAlarm()
{
if (digitalRead(6 ) == LOW) {
minAlarmupg = minAlarmupg + 1;
if (minAlarmupg > 59) {
minAlarmupg = 0;
minAlarm[DagTeller] = minAlarmupg;
}
delay(150);
}
String MinAlarm1 = “min ” + String(minAlarmupg);
P.print(MinAlarm1);
}

void DisplaySetAlarmOnOff()
{
if (digitalRead(6 ) == LOW) {
AlarmOnOffupg = AlarmOnOffupg + 1;

if (AlarmOnOffupg > 1) {
AlarmOnOffupg = 0;
}
AlarmOnOff[Day] = AlarmOnOffupg;
delay(150);
}
if (AlarmOnOffupg) {
String Uur1 = “Alm Aan”;
P.print(Uur1);
}
else
{
String Uur1 = “Alm Uit”;
P.print(Uur1);
}
}

void DisplaySetHour()
{
if (digitalRead(6 ) == LOW) {
hourupg = hourupg + 1;
if (hourupg > 23) {
hourupg = 0;
}
delay(150);
}
String Uur1 = “uur:” + String(hourupg);
P.print(Uur1);
StoreAgg();
}

void DisplaySetMinute()
{
if (digitalRead(6 ) == LOW) {
minupg = minupg + 1;
if (minupg > 59) {
minupg = 0;
}
delay(150);
}
String Min1 = “min:” + String(minupg);
P.print(Min1);
StoreAgg();
}

void DisplaySetYear()
{
if (digitalRead(6 ) == LOW) {
yearupg = yearupg + 1;
if (yearupg > 2040) {
yearupg = 2020;
}
delay(150);
}
String Jaar1 = “j.” + String(yearupg);
P.print(Jaar1);
StoreAgg();
}

void DisplaySetMonth()
{
if (digitalRead(6 ) == LOW) {
monthupg = monthupg + 1;
if (monthupg > 12) {
monthupg = 1;
}
delay(150);
}
String Mnd1 = “mnd:” + String(monthupg);
P.print(Mnd1);
StoreAgg();
}

void DisplaySetDay()
{
if (digitalRead(6 ) == LOW) {
dayupg = dayupg + 1;
if (dayupg > 31) {
dayupg = 1;
}
delay(150);
}
String Dg1 = “Dag:” + String(dayupg);
P.print(Dg1);
StoreAgg();
}
void DisplaySetDayofWeek()
{
if (digitalRead(6 ) == LOW) {
dayWupg = dayWupg + 1;
if (dayWupg > 7) {
dayWupg = 0;
}
delay(150);
}
String DgW1 = String(dagvandeweek[dayWupg – 1]);
P.print(DgW1);
StoreAgg();
}
void DisplayWeekEvenOnEven()
{
if (digitalRead(6 ) == LOW) {
WeekEven = WeekEven + 1;
if (WeekEven > 1) {
WeekEven = 0;
}
delay(150);

}
if (WeekEven == 1) {
String EvenWeek = String(“Even”);
P.print(EvenWeek);
}
else
{
String EvenWeek = String(“Oneven”);
P.print(EvenWeek);
}
StoreAgg();
}
void StoreAgg()
{
//Serial.println(EEPROM.read(60));
//Serial.println(EEPROM.read(61));
//Serial.println(WeekEven);
delay(250);
Time t(yearupg, monthupg, dayupg, hourupg, minupg, 0, dayWupg);
if ((EEPROM.read(60) == 1) && (WeekEven == 0)) { //1=evenweek
EEPROM.write(60, 0);
EEPROM.write(61, 1);
Serial.println(“Even”);
}
if ((EEPROM.read(60) == 0) && (WeekEven == 1)) {
EEPROM.write(60, 1);
EEPROM.write(61, 0);
Serial.println(“Oneven”);
}
rtc.time(t);
delay(250);
}