INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
MAX7221 + 7-Seg-LED +DS3231
31.12.2020, 21:33
Beitrag #1
MAX7221 + 7-Seg-LED +DS3231
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.01.2021, 13:48
Beitrag #2
RE: MAX7221 + 7-Seg-LED +DS3231
Hallo,
und das funktioniert, trotz Doppelbelegung von Pin D13 ?

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.01.2021, 14:26
Beitrag #3
RE: MAX7221 + 7-Seg-LED +DS3231
ups .. das kommt davon wenn man alte Projekte nur überschreibt.
Ich mach mal ein paar Bilder rein.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.01.2021, 15:00
Beitrag #4
RE: MAX7221 + 7-Seg-LED +DS3231
Habe gerade Gesehen Das man das Datum nicht einstellen kann, aber ist ja fast wie Zeit stellen.
   
   
   
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Beispiel: Mega Uhr RTC DS3231 Anzeige auf LCD1602 HaWe 3 13.578 04.08.2015 21:26
Letzter Beitrag: HaWe

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste