Projekt Digitaluhr mit Arduino Uno und DS1307

 

Den Bau des LCD-Shield mit nur 3 Pin sowie die Realtimeclock DS1307 habe ich bereits schon beschrieben.In diesem Projekt wurden die fertigen Shields dann nur noch zusammengesteckt. Das Programm habe ich erweitert so das sich die Uhr auch stellen lässt.

Uhrfertig Die Schaltung des Keypads habe ich bereits erläutert. Der Befehl anlogRead liefert je nach gedrückten Knopf einen anderen Wert. Im anhängenden Listing frage ich im Loop ab, ob überhaupt ein Knopf gedrückt wurde.  Wenn ja springt das Programm in die Setroutine und erhöht den Inhalt der zugehörigen Varible um 1 gemäß dem dem Wert von analogRead. Da der Wert ungenau ist und sich verändert habe ich nochmal durck 10 geteilt. Dann funktioniert es sicher.

Bei Nachbau oder Verwendung eines gekauften Shields müssen die Werte eventuell im Programm etwas angepasst werden. Leider ist für das Jahr ein Knopf zu wenig. Ich habe mir weitergeholfen in dem ich um das Jahr zu stellen eine Drahtbrücke von GND nach Digital 0 setzte. Der Taste für Minute setzt dann das Jahr um 1 vor.

 

 

Hier das Listing.Uhrvonoben

 

//Arduino 1.0+ Only
//Arduino 1.0+ Only
//aktuelle Version vom 31.03.2013 Johannes Krumm
#include "Wire.h"
#define DS1307_ADDRESS 0x68
#include <LiquidCrystal595.h>
LiquidCrystal595 lcd(7,8,9);     // datapin, latchpin, clockpin
byte zero = 0x00; //workaround for issue #527
byte wert = 0;

void setup(){
  Wire.begin();
  Serial.begin(9600);
  lcd.begin(16,2);
  lcd.clear();
 
// setDateTime(); //MUST CONFIGURE IN FUNCTION
}

   
void loop(){
  printDate();
  delay(1000);
// Hier werden die Tasten abgefragt und deren Wert angezeigt. Sprung nach Settime
 if (analogRead(0)<1010){settime();lcd.setCursor(9,0);lcd.print(analogRead(0));}else {lcd.setCursor(9,0);lcd.print("    ");}
}
// Wenn dieser Teil auskommentier ist wird die Zeit gesezt. Nach dem ersten setzten muss diese Teil
// wieder einkommentiert werden, sonst wird die Zeit nach jedem Reset oder Start wieder so zurückgesetzt.
// Der auskommentierte Teil kann auch ganz geloescht werden. Die Zeit lässt sich ja per Taste setzen.
/*void setDateTime(){

  byte second =      45; //0-59
  byte minute =      10; //0-59
  byte hour =       22; //0-23
  byte weekDay =     6; //1-7
  byte monthDay =    23; //1-31
  byte month =       3; //1-12
  byte year  =       13; //0-99

  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //stop Oscillator

  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekDay));
  Wire.write(decToBcd(monthDay));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));

  Wire.write(zero); //start

  Wire.endTransmission();

}*/

byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)  {
// Convert binary coded decimal to normal decimal numbers
  return ( (val/16*10) + (val%16) );
}

void printDate(){

  // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  int second = bcdToDec(Wire.read());
  int minute = bcdToDec(Wire.read());
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());

  //print the date EG   3/1/11 23:59:59
  lcd.setCursor(0,1);
  if (monthDay<10)
  {lcd.print("0");}
  lcd.print(monthDay);
  lcd.print(".");
  lcd.print(month);
  lcd.print(".");
  lcd.print(year);
  lcd.setCursor(0,0);
   if (hour < 10)                  // correct hour if necessary
  {
    lcd.print("0");
    lcd.print(hour);
  }
  else
  lcd.print(hour);
  lcd.print(":");
   if (minute < 10)                  // correct minute if necessary
  {
    lcd.print("0");
    lcd.print(minute);
  }
  else
  lcd.print(minute);
  lcd.print(":");
    if (second < 10)                  // correct second if necessary
  {
    lcd.print("0");
    lcd.print(second);
  }
  else
  lcd.print(second);
 
   switch (weekDay)                      // Ausgabe des Wochentages
 {
 
    case 1:
      lcd.setCursor(8,1);
      lcd.print("Montag ");
      break;
    case 2:
       lcd.setCursor(8,1);
      lcd.print("Dienstag");
      break;
    case 3:
    lcd.setCursor(8,1);
      lcd.print("Mittwoch");
      break;
    case 4:
    lcd.setCursor(8,1);
      lcd.print("Donnerst");
      break;
    case 5:
    lcd.setCursor(8,1);
      lcd.print("Freitag ");
      break;
    case 6:
    lcd.setCursor(8,1);
      lcd.print("Samstag ");
      break;
    case 7:
    lcd.setCursor(8,1);
      lcd.print("Sonntag ");
      break;
  }
}
void settime(){
 Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_ADDRESS, 7);

  int second = bcdToDec(Wire.read());
  int minute = bcdToDec(Wire.read());
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());
 
 Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //stop Oscillator
 
if (analogRead(0)/10==0){minute=minute+1; if (minute>=60){minute=0;}}
if (analogRead(0)/10==14){hour=hour+1; if (hour>=24){hour=0;}}
if (analogRead(0)/10==33){month=month+1; if (month>=12){month=0;}}
if (analogRead(0)/10==50){monthDay=monthDay+1; if (monthDay>=31){monthDay=0;}}
if (analogRead(0)/10==74 and digitalRead(0)!=LOW){weekDay=weekDay+1; if (weekDay>=8){weekDay=0;}}
if (analogRead(0)/10==74 and digitalRead(0)== LOW){year=year+1;if (year>30){year=0;} }
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekDay));
  Wire.write(decToBcd(monthDay));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));

  Wire.write(zero); //start

  Wire.endTransmission();

}