Hallo allerseits,
sicherlich kann man sich eine Sand / Eieruhr kaufen, aber sich eine selber zu bauen macht doch viel mehr Spaß.
So sieht das fertige Produkt meines Spieltriebes aus:
So sieht das Innenleben aus:
Die Schaltung die sich im Inneren verbirgt ist eigentlich simpel.
Zur Stromversorgung ein 9 V Block, was anderes hat nicht in das Gehäuse gepasst. Ein kleiner Step-down Regler macht daraus 5 V für den Arduino Nano. Das ist von der Leistungsbilanz besser als das im Nano zu verbraten.
Als Anzeige habe ich eine MAX7219 8x32 4 in 1 Dot Matrix LED verwendet. Die 4 Blöcke, aus der die Matrix besteht, habe ich vorsichtig getrennt. Es gibt diese Anzeigen zwar einzeln, aber da ist die Baugröße deutlich größer und das hatte wieder nicht in das Gehäuse gepasst.
Schalter 1 ist der Einschalter, mit Schalter 2 kann zwischen 3 Zeiten gewählt werden, 5, 5,5 und 6 Minuten. Beim Einschalten ertönen, je nach gewählter Zeit, unterschiedliche Signale. Bei 5,5 Minuten ertönt zusätzlich ein Signal bei abgelaufenen 5 Minuten. Bei gewählten 6 Minute ein Signal bei 5 und 5,5 Minuten.
Zum Programm ist nicht viel zu sagen, war mehr Fleiß als Denkarbeit.
#include <MD_MAX72xx.h >
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 2 // Anzahl Segmente
#define CLK_PIN 13 // or SCK
#define DATA_PIN 11 // or MOSI
#define CS_PIN 10 // or SS
MD_MAX72XX su = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
byte zeile1 = 0; byte reihe1 = 0;
byte zeile2 = 0; byte reihe2 = 0;
int pause1 = 300; // Zeit für Korn
int pause_5 = 4000; int pause_5_5 = 4400; int pause_6 = 4830; // Zeiten Ablauf
int pause2 = pause_5_5;
byte beep_1 = 56; byte beep_2 =51; byte beep_3 =56; // Zwischenzeiten
byte ton_ausgang = 9; byte schalter1 = 8; byte schalter2 = 7;
int zw1 = 0; byte zw2 = 0;
byte unten [] = {99, 7, 99, 6, 99, 5, 99, 4, 99, 3, 99, 2, 99, 1, 00, // Zeile 01
99, 7, 99, 6, 99, 5, 99, 4, 99, 3, 99, 2, 01, 99, 7, 99, 6, 99,
5, 99, 4, 99, 3, 99, 2, 10, // Zeile 02
99, 7, 99, 6, 99, 5, 99, 4, 99, 3, 11, 99, 7, 99, 6, 99, 5, 99,
4, 99, 3, 20, 99, 7, 99, 6, 99, 5, 99, 4, 99, 3, 02, // Zeile 03
99, 7, 99, 6, 99, 5, 99, 4, 12, 99, 7, 99, 6, 99, 5, 99, 4, 21,
99, 7, 99, 6, 99, 5, 99, 4, 30, 99, 7, 99, 6, 99, 5, 99, 4, 03, // Zeile 04
99, 7, 99, 6, 99, 5, 99, 4, 22, 99, 7, 99, 6, 99, 5, 99, 4, 13,
99, 7, 99, 6, 99, 5, 99, 4, 31, 99, 7, 99, 6, 99, 5, 99, 4, 40,
99, 7, 99, 6, 99, 5, 99, 4, 04, // Zeile 05
99, 7, 99, 6, 99, 5, 23, 99, 7, 99, 6, 99, 5, 32, 99, 7, 99, 6,
99, 5, 14, 99, 7, 99, 6, 99, 5, 41, 99, 7, 99, 6, 99, 5, 05, 99,
7, 99, 6, 99, 5, 50, // Zeile 06
99, 7, 99, 6, 99, 5, 33, 99, 7, 99, 6, 99, 5, 24, 99, 7, 99, 6,
99, 5, 42, 99, 7, 99, 6, 99, 5, 15, 99, 7, 99, 6, 99, 5, 51, 99,
7, 99, 6, 99, 5, 06, 99, 7, 99, 6, 99, 5, 60, // Zeile 07
99, 7, 99, 6, 34, 99, 7, 99, 6, 43, 99, 7, 99, 6, 25, 99, 7, 99,
6, 52, 99, 7, 99, 6, 16, 99, 7, 99, 6, 61, 99, 7, 99, 6, 07, 99,
7, 99, 6, 70, // Zeile 09
99, 7, 99, 6, 44, 99, 7, 99, 6, 35, 99, 7, 99, 6, 53, 99, 7, 99,
6, 26, 99, 7, 99, 6, 62, 99, 7, 99, 6, 17, 99, 7, 99, 6, 71, // Zeile 10
99, 7, 99, 6, 45, 99, 7, 99, 6, 54, 99, 7, 99, 6, 36, 99, 7, 99,
6, 63, 99, 7, 99, 6, 27, 99, 7, 99, 6, 72, // Zeile 11
99, 7, 99, 6, 55, 99, 7, 99, 6, 46, 99, 7, 99, 6, 64, 99, 7, 99,
6, 37, 99, 7, 99, 6, 73, // Zeile 12
99, 7, 56, 99, 7, 65, 99, 7, 74, 99, 7, 47, // Zeile 13
99, 7, 66, 99, 7, 75, 99, 7, 57, // Zeile 14
67, 76, // Zeile 15
77 // Zeile 16
};
byte oben [] = {77,
67, 76,
66, 75, 57,
56, 65, 74, 47,
55, 46, 64, 37, 73,
45, 54, 36, 63, 27, 72,
44, 35, 53, 26, 62, 17, 71,
34, 43, 25, 52, 16, 61, 07, 70,
33, 24, 42, 15, 51, 06, 60,
23, 32, 14, 41, 05, 50,
22, 13, 31, 40, 04,
12, 21, 30, 03,
11, 20, 02,
01, 10,
00
};
void setup() {
su.begin(); su.control(MD_MAX72XX::INTENSITY, 0);
pinMode (ton_ausgang, OUTPUT);
pinMode (schalter1, INPUT); digitalWrite (schalter1, HIGH);
pinMode (schalter2, INPUT); digitalWrite (schalter2, HIGH);
}
void loop() {
su.clear(); delay (100); su.clear();
if (digitalRead (schalter1 ) == 0) {
pause2 = pause_5;
};
if (digitalRead (schalter2) == 0) {
pause2 = pause_6;
}
if (pause2 == pause_5 ) {
tone(ton_ausgang, 500); delay (1000); noTone(ton_ausgang);
};
if (pause2 == pause_5_5) {
tone(ton_ausgang, 500); delay (1000); noTone(ton_ausgang); delay (1000);
tone(ton_ausgang, 500); delay (1000); noTone(ton_ausgang);
};
if (pause2 == pause_6) {
tone(ton_ausgang, 500); delay (1000); noTone(ton_ausgang); delay (1000);
tone(ton_ausgang, 500); delay (1000); noTone(ton_ausgang); delay (1000);
tone(ton_ausgang, 500); delay (1000); noTone(ton_ausgang);
};
zw2 = 0;
do {
zeile2 = oben [zw2] / 10; reihe2 = (oben [zw2] % 10) + 8;
su.setPoint(zeile2, reihe2, 1);
zw2++;
}
while (zw2 != 64);
zw1 = 0; zw2 = 0;
do {
if (unten [zw1] == 99) {
zw1++; su.setPoint(unten[zw1], unten[zw1], 1);
delay (pause1);
su.setPoint(unten[zw1], unten[zw1], 0); zw1++;
} else
{
zeile1 = unten [zw1] / 10; reihe1 = unten [zw1] % 10;
su.setPoint(zeile1, reihe1, 1);
zw1++;
zeile2 = oben [zw2] / 10; reihe2 = (oben [zw2] % 10) + 8;
su.setPoint(zeile2, reihe2, 0);
zw2++;
if (zw2 != 64) {
delay (pause2);
};
};
if (zw2 == beep_1 && pause2 == pause_5_5) {
tone(ton_ausgang, 500);
delay (1000);
noTone(ton_ausgang);
}
if (zw2 == beep_2 && pause2 == pause_6) {
tone(ton_ausgang, 500);
delay (1000);
noTone(ton_ausgang);
}
if (zw2 == beep_3 && pause2 == pause_6) {
tone(ton_ausgang, 500);
delay (1000);
noTone(ton_ausgang);
}
}
while (zw2 != 64);
tone(ton_ausgang, 500); delay (1000);
noTone(ton_ausgang); delay (500);
tone(ton_ausgang, 800); delay (1000);
noTone(ton_ausgang); delay (500);
tone(ton_ausgang, 500); delay (1000);
noTone(ton_ausgang); delay (500);
su.clear();
do {
zeile1 = random(8); reihe1 = random (16);
su.setPoint(zeile1, reihe1, 1); delay (100);
su.setPoint(zeile1, reihe1, 0);
}
while (zw2 != 0);
}
// HUK Sanduhr V2 27.02.2021
M.f.G.
Hans-Ulrich


