Da das dieses Jahr nichts mit Feiern wird, mal was gebastelt
Beim Elektriker auf Arbeit mal eine 6 stellige 7-Seg-LED-Platine abgestaubt.
Huch noch mehr entdeckt: Platinen mit MAX7221 und DS3231, nö nicht in Schrott.
Noch nen Mega dazu, war gerade greifbar undin meiner Bastelecke kam dann das heraus: mal wieder eine Uhr.
Vielleicht geht es noch einfacher, ja es kann auch UNO oder so sein.
Code:
// MAX7221 an Arduino Mega 12_2020
#define MAX7221_DIN 12
#define MAX7221_CS 10
#define MAX7221_CLK 13
#define led 13
#define tplus 2
#define tminus 3
#define tsave 4
#define tset 5
#define tinfo 6
#define tres 7
#include <Wire.h> //Bibliothek für die kommunikation mit der RTC
#define RTC 0x68 // I2C Adresse des RTC DS3231
//========================================
int read_rtc = 0;
//Start-zeit
byte h ;
byte mi ;
byte sec ;
byte d ;
byte mo ;
int y ;
byte wt ;
//Convertiert binäre Zeichen in Dezimal Zeichen.
byte bcdToDec(byte val) {
return ( (val / 16 * 10) + (val % 16) );
}
//Convertiert Dezimalzeichen in binäre Zeichen.
byte decToBcd(byte val) {
return ( (val / 10 * 16) + (val % 10) );
}
//=============================
void initmaxim()
{
digitalWrite(MAX7221_CS, HIGH);
pinMode(MAX7221_DIN, OUTPUT);
pinMode(MAX7221_CS, OUTPUT);
pinMode(MAX7221_CLK, OUTPUT);
}
//=============================
void output(byte address, byte data) //Daten senden
{
digitalWrite(MAX7221_CS, LOW);
shiftOut(MAX7221_DIN, MAX7221_CLK, MSBFIRST, address);
shiftOut(MAX7221_DIN, MAX7221_CLK, MSBFIRST, data);
digitalWrite(MAX7221_CS, HIGH);
}
void zeit_holen() {
Wire.beginTransmission(RTC); //Aufbau der Verbindung zur Adresse
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(RTC, 7);
sec = bcdToDec(Wire.read() & 0x7f);
mi = bcdToDec(Wire.read());
h = bcdToDec(Wire.read() & 0x3f);
wt = bcdToDec(Wire.read());
d = bcdToDec(Wire.read());
mo = bcdToDec(Wire.read());
y = bcdToDec(Wire.read()) + 2000;
}
//Funktion zum setzen der Uhrzeit.
void zeit_setzen() {
Wire.beginTransmission(RTC);
Wire.write(0); // Der Wert 0 aktiviert das RTC Modul.
Wire.write(decToBcd(sec));
Wire.write(decToBcd(mi));
Wire.write(decToBcd(h));
Wire.write(decToBcd(wt));
Wire.write(decToBcd(d));
Wire.write(decToBcd(mo));
Wire.write(decToBcd(y - 2000));
Wire.endTransmission();
}
//############################################################################
void setup()
{
//Kommunikation über die Wire.h Bibliothek beginnen.
Wire.begin();
Serial.begin(9600);
initmaxim();
output(0x0f, 0x00); //display test register - test mode off
output(0x0c, 0x00); //shutdown register - on
output(0x0b, 0x05); //scan limit register - display digits 0 thru 7 (05=6 Stellen)
output(0x0a, 0x01); //intensity register - max brightness (0xff)
output(0x09, 0xff); //decode mode register - CodeB decode all digits
output(0x0c, 0x01); //shutdown register - off - normal operation
//setzen der Anzeige mit "-"
for (byte i = 6; i > 0; i--)
{
output(i, 0x0a);
delay(100);
}
// Tastebelegung
pinMode (led , OUTPUT);
pinMode (tplus , INPUT);
pinMode (tminus , INPUT);
pinMode (tsave , INPUT);
pinMode (tset , INPUT);
pinMode (tinfo , INPUT);
pinMode (tres , INPUT);
}
//####################################################
void anzeige_datum() {
output(0x03, (( mo / 1) % 10) + 0x90); //+0x90 = mit Dp
output(0x04, (( mo / 10) % 10));
output(0x05, (( d / 1) % 10) + 0x90);
output(0x06, (( d / 10) % 10));
output(0x01, (( y / 1) % 10));
output(0x02, (( y / 10) % 10));
delay(1000);
}
void zeit_stellen() {
for (byte i = 6; i > 0; i--)
{
output(i, 0x0f);
delay(10);
}
while (digitalRead(tsave) == HIGH)
{
if (digitalRead (tplus) == LOW)
{
h = h + 1;
if (h == 24) h = 0;
delay(250);
}
output(0x05, (( h / 1) % 10) + 0x90);
output(0x06, (( h / 10) % 10));
}
while (digitalRead(tsave) == LOW);// nächste Stellen
delay(10);
while (digitalRead(tsave) == HIGH)
{
if (digitalRead (tplus) == LOW)
{
mi = mi + 1;
if (mi == 60) mi = 0;
delay(250);
}
output(0x03, (( mi / 1) % 10) + 0x90);
output(0x04, (( mi / 10) % 10));
}
while (digitalRead(tsave) == LOW);// nächster Stellen
delay(10);
while (digitalRead(tsave) == HIGH)
{
if (digitalRead (tplus) == LOW)
{
sec = sec + 1;
if (sec == 60) sec = 0;
delay(250);
}
output(0x01, (( sec / 1) % 10));
output(0x02, (( sec / 10) % 10));
}
zeit_setzen();// RTC wird aktualisiert
}
//========== Hauptprog =========================================
void loop()
{
if (read_rtc = 750) {
read_rtc = 0;
zeit_holen();
}
if (digitalRead(tinfo) == LOW)
{
anzeige_datum();
}
else if (digitalRead(tset) == LOW)
{
zeit_stellen();
}
else
{
output (0x01, (( sec / 1) % 10));
output (0x02, (( sec / 10) % 10));
output (0x03, (( mi / 1) % 10) + 0x90);
output (0x04, (( mi / 10) % 10));
output (0x05, (( h / 1) % 10) + 0x90);
output (0x06, (( h / 10) % 10));
}
}
Viel Spass damit und ein gesundes Neues.