Hallo
Kann sich jemand mal den Code anschauen und ggf. optimieren
der Code ist nicht von mir.
Die Uhr funktioniert aber das Multiplexen flackert .
Gruß
#include <Wire.h> //Libraries to communicate with RTC
#include "RTClib.h"
RTC_DS1307 rtc; //create rtc object
boolean state = false;
boolean state1 = false;
int setH; //variable to store hours when setting
int setM; //variable to store minutes when setting
int setD = 1; //variable for day
int setMo = 1; //variable for month
unsigned long t1; //used for millis()
unsigned long t2; //used for millis();
int segs[] = {2, 3, 4, 5, 6, 7, 8, 9};//abcdefg. segments
int digits[] = {10, 11, 12, 13}; //number of digits
String num[] = {"11111100", //0
"01100000", //1
"11011010", //2
"11110010", //3
"01100110", //4
"10110110", //5
"10111110", //6
"11100000", //7
"11111110", //8
"11110110" //9
};
void setup()
{
rtc.begin();//begin rtc communication
for (int i = 0; i < 8; i++)
{
pinMode(segs[i], OUTPUT);//set segment pins output
}
for (int i = 0; i < 4; i++)
{
pinMode(digits[i], OUTPUT);//set digts as outputs
}
pinMode(14, INPUT_PULLUP);//set A0 as input for button1
pinMode(15, INPUT_PULLUP);//set A1 as input for button2
}
void loop()
{
DateTime now = rtc.now();//acquire date and time
t1 = millis();//acquire millis time
if(t1-t2 >= 5000)//if 5 seconds have passed change display
{
t2 = t1;
state1 = !state1;
}
if(state1 == false)
{
printTime(now.hour(), now.minute());//show time
}
if(state1 == true)
{
printTime(now.day(), now.month());//show date
}
setTime();//function to set time
}
void printNum(int number)//function to print number
{
for (int i = 0; i < 8; i++)
{
if(state == true && state1 == true)//if date is displayed show decimal after day
{
num[number].setCharAt(7,'1');
}
if(state != true || state1 != true)//if not then no decimal
{
num[number].setCharAt(7,'0');
}
if (num[number].charAt(i) == '1')//set segment high
{
digitalWrite(segs[i], HIGH);
}
else
{
digitalWrite(segs[i], LOW);//set low
}
}
}
void printTime(int hour, int min)
{
int d[] = {floor(hour / 10), hour - 10 * floor(hour / 10), floor(min / 10), min - 10 * floor(min / 10)};
for (int i = 0; i < 4; i++)
{
if (i != 0)
{
digitalWrite(digits[i - 1], LOW);
}
if (i == 0)
{
digitalWrite(digits[3], LOW);
}
if(i == 1)
{
state = true;
}
else
{
state = false;
}
digitalWrite(digits[i], HIGH);
printNum(d[i]);
delay(5);
}
}
void setTime()
{
if (digitalRead(14) == LOW)
{
delay(500);
while (digitalRead(14) == HIGH)
{
printTime(setH, setM);
if (digitalRead(15) == LOW)
{
delay(200);
setH++;
if (setH == 24)
{
setH = 0;
}
}
}
delay(500);
while (digitalRead(14) == HIGH)
{
printTime(setH, setM);
if (digitalRead(15) == LOW)
{
delay(200);
setM++;
if (setM == 60)
{
setM = 0;
}
}
}
delay(500);
while (digitalRead(14) == HIGH)
{
printTime(setD, setMo);
if (digitalRead(15) == LOW)
{
delay(200);
setD++;
if (setD > 31)
{
setD = 1;
}
}
}
delay(500);
while (digitalRead(14) == HIGH)
{
printTime(setD, setMo);
if (digitalRead(15) == LOW)
{
delay(200);
setMo++;
if (setMo > 12)
{
setMo = 1;
}
}
}
delay(500);
int i;
while (digitalRead(14) == HIGH)
{
printTime(20,i);
if (digitalRead(15) == LOW)
{
delay(200);
i++;
}
}
delay(500);
rtc.adjust(DateTime(2000+i, setMo, setD, setH, setM, 0));
}
}
Wallclock.ino (3.9 KB)