Wanduhr mit Arduino NANO

Uhr von hinten

Arduino Nano und DS1307 Uhr Modul verbunden über I2C

Ich habe mit einen Arduino Nano und einen Uhrmodul (DS1307) eine Wanduhr gebastelt.

Die 4 x 7 Segmentanzeige besteht aus Lila/Pinken LED´s.

Das ist mein erstes Projekt wo ich mit SMD Bauteilen (Widerstände und Mosfet) gearbeitet habe.

 

Arduino Code Geschrieben mit Atmel Studio

/*

Code erstellt von Uwe Schütt
Wanduhr
Version 1.0 2014-04-18




Witner/Sommerzeit abfrage:

Begin Sommerzeit letzter sonntag im März um 2 Uhr +1H
Ende Sommerzeit letztrt sonntag Oktober um 3Uhr -1H


*/

#include "Wire.h"
#include <memorysaver.h>

int LED_E = 3; //Einer
int LED_Z = 5;	//Zehner
int LED_H = 6;	//Hunderter
int LED_T = 9;	//Tausender
int LED_DP = 10;	//Doppelpunkt
int LED_a = 2;	//Segment a
int LED_b = 4;	//Segment b
int LED_c = 7;	//Segment c
int LED_d = 8;	//Segment d
int LED_e = 11;	//Segment e
int LED_f = 12;	//Segment f
int LED_g = 13;	//Segment g

int pause = 1;
int helligkeit = 255;
byte second, stunde,minute, dayOfWeek, dayOfMonth, month, year;
int durchlauf=0;
int swZeit;
String test="";

boolean doppelpunkt=false;

#define DS1307_I2C_ADDRESS 0x68 
#define EpromRAM 0x50
	

int segment_a[] = {HIGH,LOW,HIGH,HIGH,LOW,HIGH,HIGH,HIGH,HIGH,HIGH,LOW};
				//	1	 0	 1	  1		0	1	1	 1	  1		1	0	
int segment_b[] = {HIGH,HIGH,HIGH,HIGH,HIGH,LOW,LOW,HIGH,HIGH,HIGH,LOW};
				//	1	  1	   1	1	1	 0	0	1	1	1	0	
int segment_c[] = {HIGH,HIGH,LOW,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,LOW};
				//	1	 1	  0		1	1	1	 1	  1		1	1	0
int segment_d[] = {HIGH,LOW,HIGH,HIGH,LOW,HIGH,HIGH,LOW,HIGH,HIGH,LOW};
				//	1	 0	  1	  1		0	1	1	0	1	1	0
int segment_e[] = {HIGH,LOW,HIGH,LOW,LOW,LOW,HIGH,LOW,HIGH,LOW,LOW};
			//		1	0	 1	 0	  0	  0	 1	  0	  1		0	0
int segment_f[] = {HIGH,LOW,LOW,LOW,HIGH,HIGH,HIGH,LOW,HIGH,HIGH,LOW};
			//		1	0	 0	 0	1		1	1	0	 1	  1		0
int segment_g[] = {LOW,LOW,HIGH,HIGH,HIGH,HIGH,HIGH,LOW,HIGH,HIGH,LOW};
			//		0	0	 1	  1	  1		0	1	 0	 1	   1	0



void setup()
{
	Serial.begin(9600);  //Nur für Testzwecke werforderlich
	Wire.begin();
	delay(20);
	
	
	/*
	 //Zum Uhr Stellen
	Wire.beginTransmission(DS1307_I2C_ADDRESS);         
	Wire.write(0x00);
	Wire.write(decToBcd(00)); //Sec                                   
	Wire.write(decToBcd(31));	//min
	Wire.write(decToBcd(14));	//Stunde
	Wire.write(decToBcd(6));	//Tag der Woche
	Wire.write(decToBcd(18));	//Tag
	Wire.write(decToBcd(10));	//Monat
	Wire.write(decToBcd(14));	//Jahr
	Wire.endTransmission();
	*/
	getDateDs1307();
	
	Serial.print(stunde);
	Serial.print(":");
	Serial.print(minute);
	Serial.print(":");
	Serial.print(second);
	Serial.print(" ");
	Serial.print(dayOfMonth);
	Serial.print(".");
	Serial.print(month);
	Serial.print(".");
	Serial.print(year);
	Serial.print("  ");
	Serial.print(dayOfWeek);
	Serial.println("");
	
	
	
	
  /* add setup code here */
  pinMode(LED_E,OUTPUT);
  pinMode(LED_Z,OUTPUT);
  pinMode(LED_H,OUTPUT);
  pinMode(LED_T,OUTPUT);
  pinMode(LED_a,OUTPUT);
  pinMode(LED_b,OUTPUT);
  pinMode(LED_c,OUTPUT);
  pinMode(LED_d,OUTPUT);
  pinMode(LED_e,OUTPUT);
  pinMode(LED_f,OUTPUT);
  pinMode(LED_g,OUTPUT);
  pinMode(LED_DP,OUTPUT);
  
 testSWZeit();  //Prüfen ob Sommer oder Winterzeit ist
  

}


void testSWZeit()
{
	
	
	 getDateDs1307();
	 getEpromRam();
	 Serial.print(stunde);
	 Serial.print(":");
	 Serial.print(minute);
	 Serial.print(":");
	 Serial.print(second);
	 Serial.print(" ");
	 Serial.print(dayOfMonth);
	 Serial.print(".");
	 Serial.print(month);
	 Serial.print(".");
	 Serial.print(year);
	 Serial.print("  ");
	 Serial.print(dayOfWeek);
	 Serial.println("");

	 
	 if (swZeit > 1)
	 {
		 Serial.println("Sommerwinterzeit nicht gesetzt.");
		 toEpromRam1();
	 }
	 if (swZeit == 1)
	 {
		 Serial.println("Sommerzeit");
		 if (month >= 3 && month <= 10)		//Wenn Zeit zwischen März und Oktober ist
		 {
			 if (month == 3)				//Wenn März ist
			 {
				 //Nix
			 }
			 
			 if (month == 10)				//Wenn Oktober ist
			 {
				 if (dayOfMonth < 24 && dayOfWeek == 7 and stunde == 3)	//Wenn es nach dem 24 ist (letzten 7 tage im Monat) und es ist Sonntag und 3 Uhr
				 {
					 stunde--;
					 Wire.beginTransmission(DS1307_I2C_ADDRESS);         //Stunde in die Uhr schreiben
					 Wire.write(byte(0x02));
					 Wire.write(decToBcd(stunde));
					 Wire.endTransmission();
					 toEpromRam0(); //Merker auf Winterzeit
				 }
				 
			 }
			 
		 }else
		 {
			Serial.println("Auf Winterzeit umstellen...");
			stunde--;
			Wire.beginTransmission(DS1307_I2C_ADDRESS);         //Stunde in die Uhr schreiben
			Wire.write(byte(0x02));
			Wire.write(decToBcd(stunde));
			Wire.endTransmission();
			toEpromRam0(); //Merker auf Winterzeit 
		 }
		 
		 
	 }
	 if(swZeit == 0)
	 {
		 Serial.println("Winterzeit");
		 if (month <= 3 || month >= 10)		//Wenn Zeit zwischen Oktober und März ist 
		 {
			 if (month==3)
			 {
				 if (dayOfMonth > 24 && dayOfWeek == 7 and stunde == 2)	//Wenn es nach dem 24 ist (letzten 7 tage im Monat) und es ist Sonntag und 2 Uhr
				 {
					 stunde++;
					 //Stunde schreiben
					 Wire.beginTransmission(DS1307_I2C_ADDRESS);         //Stunde in die Uhr schreiben
					 Wire.write(byte(0x02));
					 Wire.write(decToBcd(stunde));
					 Wire.endTransmission();
					 toEpromRam1(); //Merker auf Sommerzeit
				 }
			 }
			 if (month==10)
			 {
				 //Nix
			 }
			 
		 }else
		 {
			 Serial.println("Auf sommerzeit umstellen....");
			 stunde++;
			 //Stunde schreiben
			 Wire.beginTransmission(DS1307_I2C_ADDRESS);         //Stunde in die Uhr schreiben
			 Wire.write(byte(0x02));
			 Wire.write(decToBcd(stunde));
			 Wire.endTransmission();
			 toEpromRam1();  //Merker auf Sommerzeit
		 }
	 }
}
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 led(int stunde, int minute)
{
	int h;
	int t;
	int z;
	int e;
	e=minute%10;
	z=minute/10;
	h=stunde%10;
	t=stunde/10;
	
	if (t==0)
	{
		t=10;
	}
	analogWrite(LED_T,helligkeit);
	//digitalWrite(LED_T,HIGH);
	digitalWrite(LED_a,segment_a[t]);
	digitalWrite(LED_b,segment_b[t]);
	digitalWrite(LED_c,segment_c[t]);
	digitalWrite(LED_d,segment_d[t]);
	digitalWrite(LED_e,segment_e[t]);
	digitalWrite(LED_f,segment_f[t]);
	digitalWrite(LED_g,segment_g[t]);
	delay(pause);
	analogWrite(LED_T,0);
	//digitalWrite(LED_T,LOW);
	allesaus();
	analogWrite(LED_H,helligkeit);
	//digitalWrite(LED_H,HIGH);
	digitalWrite(LED_a,segment_a[h]);
	digitalWrite(LED_b,segment_b[h]);
	digitalWrite(LED_c,segment_c[h]);
	digitalWrite(LED_d,segment_d[h]);
	digitalWrite(LED_e,segment_e[h]);
	digitalWrite(LED_f,segment_f[h]);
	digitalWrite(LED_g,segment_g[h]);
	delay(pause);
	analogWrite(LED_H,0);
	//digitalWrite(LED_H,LOW);
	allesaus();
	analogWrite(LED_Z,helligkeit);
	//digitalWrite(LED_Z,HIGH);
	digitalWrite(LED_a,segment_a[z]);
	digitalWrite(LED_b,segment_b[z]);
	digitalWrite(LED_c,segment_c[z]);
	digitalWrite(LED_d,segment_d[z]);
	digitalWrite(LED_e,segment_e[z]);
	digitalWrite(LED_f,segment_f[z]);
	digitalWrite(LED_g,segment_g[z]);
	delay(pause);
	analogWrite(LED_Z,0);
	//digitalWrite(LED_Z,LOW);
	allesaus();
	analogWrite(LED_E,helligkeit);
	//digitalWrite(LED_E,HIGH);
	digitalWrite(LED_a,segment_a[e]);
	digitalWrite(LED_b,segment_b[e]);
	digitalWrite(LED_c,segment_c[e]);
	digitalWrite(LED_d,segment_d[e]);
	digitalWrite(LED_e,segment_e[e]);
	digitalWrite(LED_f,segment_f[e]);
	digitalWrite(LED_g,segment_g[e]);
	delay(pause);
	analogWrite(LED_E,0);
	//digitalWrite(LED_E,LOW);
	allesaus();
		if (doppelpunkt==true)
		{
			analogWrite(LED_DP,helligkeit);
			//digitalWrite(LED_DP,HIGH);
			delay(pause);
			analogWrite(LED_DP,0);
			//digitalWrite(LED_DP,LOW);
		}
		else
		{
			delay(pause);
		}
	
	//delay(5);
	
	
	
}
void allesaus()
{
		
		//digitalWrite(LED_E,LOW);
		digitalWrite(LED_a,LOW);
		digitalWrite(LED_b,LOW);
		digitalWrite(LED_c,LOW);
		digitalWrite(LED_d,LOW);
		digitalWrite(LED_e,LOW);
		digitalWrite(LED_f,LOW);
		digitalWrite(LED_g,LOW);
		delay(1);
}
void getDateDs1307()
{

	  Wire.beginTransmission(DS1307_I2C_ADDRESS);         // I2C-Kommunikation im Schreibmodus starten
	  Wire.write(byte(0x00));                                    // Registerzeiger auf 0 setzen
	  Wire.endTransmission();                             // I2C-Kommunikation beenden
	  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);            // I2C-Kommunikation im Lesemodus starten
	  
	  second     = bcdToDec(Wire.read() & 0x7f);
	  minute     = bcdToDec(Wire.read());
	  stunde       = bcdToDec(Wire.read());  // Need to change this if 12 hour am/pm& 0x3f
	  dayOfWeek  = bcdToDec(Wire.read());
	  dayOfMonth = bcdToDec(Wire.read());
	  month      = bcdToDec(Wire.read());
	  year       = bcdToDec(Wire.read());
	
}
void getEpromRam()
{

	Wire.beginTransmission(DS1307_I2C_ADDRESS);         // I2C-Kommunikation im Schreibmodus starten
	Wire.write(byte(0x10));                                    // Registerzeiger auf 0 setzen
	Wire.endTransmission();                             // I2C-Kommunikation beenden
	Wire.requestFrom(DS1307_I2C_ADDRESS, 1);            // I2C-Kommunikation im Lesemodus starten
	
	
	swZeit     = bcdToDec(Wire.read());
	delay(20);
	
}
void toEpromRam0()
{

	Wire.beginTransmission(DS1307_I2C_ADDRESS);         // I2C-Kommunikation im Schreibmodus starten
	Wire.write(byte(0x10));
	Wire.write(0x00);                                    // Registerzeiger auf 0 setzen
	Wire.endTransmission();                             // I2C-Kommunikation beenden

	delay(20);
	
}
void toEpromRam1()
{

	Wire.beginTransmission(DS1307_I2C_ADDRESS);         // I2C-Kommunikation im Schreibmodus starten
	Wire.write(byte(0x10));
	Wire.write(0x01);                                    // Registerzeiger auf 0 setzen
	Wire.endTransmission();                             // I2C-Kommunikation beenden

	delay(20);
	
}
void loop()
{
	if (doppelpunkt==false)
	{
		doppelpunkt=true;
	} 
	else
	{
		doppelpunkt=false;
	}
	
	getDateDs1307();
	//Serial.print(stunde);
// 	Serial.print(" : ");
// 	Serial.println(minute);
	//delay(800);
	

		for (int i=0; i<100;i++)
		{
			led(stunde,minute);
		}
	
  


  
  /* add main program code here */

}