前提・実現したいこと
ArduinoMEGAで7セグメントLEDを用いた時計を作っています
表示はダイナミック点灯、1日の誤差1秒以内を条件に製作しています
発生している問題・エラーメッセージ
開発環境上ライブラリへのMsTimer2、DS1307RTC、Timeの追加ができない状況です。
現在delayを用いて1秒間ごとに出力していますが誤差が19時間で2分程度あり、とても時計としての機能に難がある状況です。
そこでmillis関数を用いて1秒間を計測して出力しようとしていますが、やり方がわかりません。
知恵をお貸しください。
現在のdelayを用いたコードです。
7セグは分、時にカソードコモン、秒にアノードコモンを用いています。
ピン22、23は1秒ごとに点滅、ピン8は時刻設定時に点灯します。
byte cnt,sec,min,hour;
int val=0;
int val3=0;
int val2=0;
int old_val=0;
int state=0;
byte sec_pin[8]= {24,25,26,27,28,29,30,31}; //カソード
byte min_pin[8]= {40,41,42,43,44,45,46,47}; //アノード
byte hour_pin[8]= {32,33,34,35,36,37,38,39};
byte sec_a_com[]= {12,13};
byte min_c_com[]= {10,11};
byte hour_b_com[]={8,9};
boolean Num_Array2[10][7]= {
{1,1,1,1,1,1,0}, //0
{0,1,1,0,0,0,0}, //1
{1,1,0,1,1,0,1}, //2
{1,1,1,1,0,0,1}, //3
{0,1,1,0,0,1,1}, //4
{1,0,1,1,0,1,1}, //5
{1,0,1,1,1,1,1}, //6
{1,1,1,0,0,1,0}, //7
{1,1,1,1,1,1,1}, //8
{1,1,1,1,0,1,1}, //9
};
void NumPrint(byte min_num,byte sec_num,byte hour_num) {
for(byte i=0; i<7; i++) {
digitalWrite(sec_pin[i],!Num_Array2[sec_num][i]);
digitalWrite(min_pin[i],Num_Array2[min_num][i]);
digitalWrite(hour_pin[i],Num_Array2[hour_num][i]);
}
}
void setup() {
for(byte i=0; i<2; i++) {
digitalWrite(sec_a_com[i],LOW);
pinMode(sec_a_com[i],OUTPUT);
digitalWrite(min_c_com,HIGH);
pinMode(min_c_com[i],OUTPUT);
digitalWrite(hour_b_com,HIGH);
pinMode(hour_b_com[i],OUTPUT);
}
for(byte i=0; i<8; i++) {
pinMode(sec_pin[i],OUTPUT);
pinMode(min_pin[i],OUTPUT);
pinMode(hour_pin[i],OUTPUT);
}
pinMode(2,INPUT);
pinMode(3,OUTPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
}
void loop() {
if(cnt&1) {
digitalWrite(sec_a_com[0],LOW);//秒1桁目を消す
digitalWrite(min_c_com[0],HIGH);//分1桁目を消す
digitalWrite(hour_b_com[0],HIGH);//時1桁目を消す
NumPrint(min/10,sec/10,hour/10);//数字形にする。
digitalWrite(sec_a_com[1],HIGH);//秒2桁目を点ける
digitalWrite(min_c_com[1],LOW);//分2桁目を点ける
digitalWrite(hour_b_com[1],LOW);//時1桁目をつける
} else {
digitalWrite(sec_a_com[1],LOW);
digitalWrite(min_c_com[1],HIGH);
digitalWrite(hour_b_com[1],HIGH);
NumPrint(min%10,sec%10,hour%10);
digitalWrite(sec_a_com[0],HIGH);
digitalWrite(min_c_com[0],LOW);
digitalWrite(hour_b_com[0],LOW);
}
if(cnt==20){
digitalWrite(22,LOW);
digitalWrite(23,LOW);
}
if(++cnt==191){
cnt=0;
digitalWrite(22,HIGH);
digitalWrite(23,HIGH);
if(++sec==60) {
sec=0;
if(++min==60){
min=0;
if(++hour==24){
hour=0;
}
}
}
}
delay(5);
val = digitalRead(2);
val2 = digitalRead(4);
val3 = digitalRead(5);
if((val==1)&&(old_val==0)){
state= 1 - state;
delay(100);
}
old_val = val;
if(state==1){
digitalWrite(3,HIGH);
}
else{
digitalWrite(3,LOW);
}
if((val2==1)&&(state==1)){
delay(100);
min++;
if(min>=60){
min=0;
}
}
if((val3==1)&&(state==1)){
delay(100);
hour++;
if(hour>=24){
hour=0;
}
}
}
