デジタル時計 スケッチ(2/3)

void loop() {

switch (mainmode) {

case 0: //mainmode 0 時計

modebtFg = false;

setbtFg = false;

//dispD = mainmode;

switch (submode[0]) {

case 0: //mode 0 0 時計表示

if (RTC.read(tm)) {

yr = tm.Year + 1970 - 2000 ; //1970年が基準でRTCの内部で処理されている

mh = tm.Month;

dy = tm.Day;

h = tm.Hour;

m = tm.Minute;

sd = tm.Second;

adjChk();

// TmChkOther(); ////////////////

if ((adjF) && (sd == 30) ) { //調整要、30秒の時

if (tmOnFg == true) { //タイマー動いているとき

clcS1 = tgS;

clcS2 = adjVlue;

clcM1 = tgM;

clcM2 = 0;

clcH1 = tgH;

clcH2 = 0;

clcTime();

tgS = clcS;

tgM = clcM;

tgH = clcH;

}

if (submode[3] == 1) { //ストップウォッチ動いているとき

clcS1 = swSS;

clcS2 = adjVlue;

clcM1 = swSM;

clcM2 = 0;

clcH1 = swSH;

clcH2 = 0;

clcTime();

swSS = clcS;

swSM = clcM;

swSH = clcH;

}

adjDo();

}

switch (dspF) {

case 0: //一時的 年 表示

//stt = LOW;

dispD = 3; // DpDisp[dispD] この場合2点とも非表示   もともとstt = LOW;

tmpfg = HIGH;

dispH = 20; //2000年をもとに残りの年を表示

dispM = yr; //1970年が基準でRTCの内部で処理されている

dispCnt++;

if (dispCnt > 4) {

dispCnt = 0;

dspF = 1;

}

break;

case 1: //一時的 月日 表示

//dispD = 0; // DpDisp[dispD] この場合2点とも表示   もともとstt = HIGH;

dispD = 2;

tmpfg = HIGH;

dispH = mh;

dispM = dy;

dispCnt++;

if (dispCnt > 4) {

dispCnt = 0;

dspF = 8;

}

//dispD = mainmode;

break;

case 2: //普通のとき

dispH = h;

if (dispH / 10 == 0) {

tmpfg = LOW;

}

else {

tmpfg = HIGH;

}

dispM = m;

if (DEBUG) {

dispM = sd;

dispH = m;

}

break;

case 3: //一時的 分秒 表示

dispD = 0;

tmpfg = HIGH;

dispH = m;

dispM = sd;

dispCnt++;

if (dispCnt > 8) {

dispCnt = 0;

dspF = 8;

}

break;

case 4: //一時的アラーム表示,アラームon、off

alFg = !alFg;

AlL=AlLed[alFg];

// DpDAO = DpD OPRT AlL OPRT OpL; は dispDp の中でやる

if (alFg) {

submode[1] = 0;

}

dispDp(); //一応表示 短時間

// わざわざ書く処理をしなくても時計の表示のついでに表示されるはず dispDpで

// digitalWrite(ALLED, alFg);

//snzFg = alFg;

//dispD = 0;

dispD = 1;

dispH = alH;

dispM = alM;

if (dispH / 10 == 0) {

tmpfg = LOW;

}

else {

tmpfg = HIGH;

}

dispCnt++;

if (dispCnt > 4) {

dispCnt = 0;

dspF = 2;

dispD = 0;

}

break;

case 8: //一時的温度表示   20190709

dispD = 0;

TempChk();

// 以下をやらないと一瞬温度の後にもとの表示がされてしまう。

dispH = h;

if (dispH / 10 == 0) {

tmpfg = LOW;

}

else {

tmpfg = HIGH;

}

dispM = m;

if (DEBUG) {

dispM = sd;

dispH = m;

}

dspF = 2;

break;

}

//break;   これがあると何も表示されなくなってしまう。

// 普通の時計表示中 ////////////////

for (int i = 0; i < 20; i++) {

dispHour();

dispMin();

dispDp();

BtnChk();

TmChkOther(); ///////////////////////

if (btchk[UPBT - OFST]) { //一時的 年月日 表示

btchk[UPBT - OFST] = false;

dspF = 0;

}

if (btchk[DOWNBT - OFST]) { //一時的 分秒 表示

btchk[DOWNBT - OFST] = false;

dspF = 3;

}

if ((alFg == LOW) && (dspF == 2) && (btLong[ONOFFBT - OFST] == true) ) { // 育てる時計部分 時計の微調整

int adjTpI = 0;

int tmpK = 0;

dspF = 11;

OpL =OpLed[1]; //DpA = DpAdd[1]; //plsDp = 1; なぜこうした?

dispDp(); // いらないかもしれないけど

tone(SUND, 1000, 500);

btchk[ONOFFBT - OFST] = false;

btLong[ONOFFBT - OFST] = false;

modebtFg = false;

setbtFg = false;

while (dspF > 10) {

if (modebtFg == true) { // 途中でmodeボタンが押されたら何もしないで終わる

dspF = 2;

modebtFg = false;

setbtFg = false;

} else {

switch (dspF) {

case 11: //adjustValue

dp3 = dispChNone;

dp4 = dispChNone;

disp3();

disp4();

if (adjVlue > 0) {

dp1 = dispChPlus1;

dp2 = dispChPlus2;

} else {

dp1 = dispChMinus;

dp2 = dispChNone;

}

disp1();

disp2();

if (adjVlue > 0) {

dispM = adjVlue ;

} else {

dispM = ((-1) * adjVlue);

}

dispMin();

BtnChk();

btchk[ONOFFBT - OFST] = false;

if (btchk[UPBT - OFST]) {

adjVlue++;

if (adjVlue > 30) {

adjVlue = 29;

}

btchk[UPBT - OFST] = false;

}

if (btchk[DOWNBT - OFST]) {

adjVlue--;

if (adjVlue < -30) {

adjVlue = -29 ;

}

btchk[DOWNBT - OFST] = false;

}

btchk[ONOFFBT - OFST] = false;

break;

case 12: //adiust second

dp1 = dispChScnd;

dp2 = dispChEql;

dispM = adjTS;

disp1();

disp2();

dispMin();

BtnChk();

btchk[ONOFFBT - OFST] = false;

if (btchk[UPBT - OFST]) {

adjTS = ( adjTS + 1) % 60 ;

btchk[UPBT - OFST] = false;

}

if (btchk[DOWNBT - OFST]) {

adjTS = (adjTS + 59) % 60;

btchk[DOWNBT - OFST] = false;

}

btchk[ONOFFBT - OFST] = false;

break;

case 13: //adjust minite

dp1 = dispChMin;

dp2 = dispChEql;

dispM = adjTM;

disp1();

disp2();

dispMin();

BtnChk();

btchk[ONOFFBT - OFST] = false;

if (btchk[UPBT - OFST]) {

adjTM = ( adjTM + 1) % 60 ;

btchk[UPBT - OFST] = false;

}

if (btchk[DOWNBT - OFST]) {

adjTM = (adjTM + 59) % 60;

btchk[DOWNBT - OFST] = false;

}

btchk[ONOFFBT - OFST] = false;

break;

case 14: //adjust hour

dp1 = dispChHour;

dp2 = dispChEql;

dispM = adjTH;

disp1();

disp2();

dispMin();

BtnChk();

btchk[ONOFFBT - OFST] = false;

if (btchk[UPBT - OFST]) {

adjTH = ( adjTH + 1) % 24 ;

btchk[UPBT - OFST] = false;

}

if (btchk[DOWNBT - OFST]) {

adjTH = (adjTH + 23) % 24;

btchk[DOWNBT - OFST] = false;

}

btchk[ONOFFBT - OFST] = false;

break;

case 15: //adjust day

dp1 = dispChDay;

dp2 = dispChEql;

dispM = adjTD;

disp1();

disp2();

dispMin();

BtnChk();

btchk[ONOFFBT - OFST] = false;

if (btchk[UPBT - OFST]) {

adjTD = ( adjTD + 1) % 100 ;

btchk[UPBT - OFST] = false;

}

if (btchk[DOWNBT - OFST]) {

adjTD = (adjTD + 99) % 100;

btchk[DOWNBT - OFST] = false;

}

btchk[ONOFFBT - OFST] = false;

break;

case 16: //adjust value write

adjVV = abs(adjVlue);

if (adjVlue > 0) {

adjVF = 0;

} else {

adjVF = 1;

}

if ((adjVV != 0) && (adjTM == 0) && (adjTH == 0) && (adjTD == 0) && (adjTS <= adjVV)) {

dspF = 11;

} else {

EEPROM.write(0, adjTS);

EEPROM.write(1, adjTM);

EEPROM.write(2, adjTH);

EEPROM.write(3, adjTD);

EEPROM.write(4, adjVV);

EEPROM.write(5, adjVF);

adjSetF = false;

setAdjT();

tone(SUND, 1200, 800);

modebtFg = false;

setbtFg = false;

dspF = 2;

}

break;

}

}

}

alFg = true;

OpL = OpLed[0]; //DpA = DpAdd[0];

dispDp(); //いらないかもしれないけど一応

alFg = false;

} else {

OpL = OpLed[0]; //DpA = DpAdd[0];

dispDp(); //いらないかもしれないけど一応

btLong[ONOFFBT - OFST] = false;

//OpL = OpLed[0]; //DpA = DpAdd[0];

// btchk[ONOFFBT - OFST] = false;

}

////// 調整処理 終わり

if (btchk[ONOFFBT - OFST]) { //一時的アラーム表示

btchk[ONOFFBT - OFST] = false;

dspF = 4;

}

if (alFg == HIGH) //アラームチェック

{

if (alH == h && alM == m)

{

snzFg = true;

kReset();

alStopTm = -10; //ダミー とりあえずマイナスのちょっと大きめの数字 

while (snzFg) {

snz(); // アラーム鳴らす

}

}

}

}

//stt = ! stt; ///////////////////////////////////////////////////////////////////

if (dispD == 0){

dispD=3;

} else if (dispD == 3){

dispD=0;

}

// TmChkOther(); /////////////////////////////////////

}

// TmChkOther(); //////////////////

break;

case 1: //mode 0 1 年設定の入力

//dispD = 0;

tmpfg = HIGH;

dispD = 3;

while (mainmode == 0 && submode[mainmode] == 1)

{

dispH = 20;

dispM = yr;

dispHour();

dispMin();

dispDp();

BtnChk();

btchk[ONOFFBT - OFST] = false;

if (btchk[UPBT - OFST]) {

yr = (yr + 1) % 100 ;

btchk[UPBT - OFST] = false;

}

if (btchk[DOWNBT - OFST]) {

yr = (yr - 1) ;

if (yr < 0) {

yr = yr + 100;

}

btchk[DOWNBT - OFST] = false;

}

chkDoOEproc(2);

}

//dispD = mainmode ;

break;

case 2: //mode 0 2 月設定の入力

//dispD = 0;

tmpfg = HIGH;

dispD = 1;

while (mainmode == 0 && submode[mainmode] == 2)

{

dispH = mh;

dispHour();

dispDp();

BtnChk();

btchk[ONOFFBT - OFST] = false;

if (btchk[UPBT - OFST]) {

mh = (mh + 1) % 13 ;

btchk[UPBT - OFST] = false;

}

if (btchk[DOWNBT - OFST]) {

mh = (mh - 1) ;

if (mh < 1) {

mh = mh + 12;

}

btchk[DOWNBT - OFST] = false;

}

chkDoOEproc(2);

}

break;

case 3: //mode 0 3 日設定の入力

//dispD = 0; //真ん中の2つの点を表示

dispD = 2; //下の点を表示

while (mainmode == 0 && submode[mainmode] == 3)

{

dispM = dy;

dispMin();

dispDp();

BtnChk();

btchk[ONOFFBT - OFST] = false;

if (btchk[UPBT - OFST]) {

dy = (dy + 1) % 32 ;

btchk[UPBT - OFST] = false;

}

if (btchk[DOWNBT - OFST]) {

dy = (dy - 1);

if (dy < 1) {

dy = dy + 31 ;

}

btchk[DOWNBT - OFST] = false;

}

chkDoOEproc(2);

}

break;

case 4: //mode 0 4 時設定の入力

dispD = 0;

while (mainmode == 0 && submode[mainmode] == 4)

{

dispH = h;

if (dispH / 10 == 0) {

tmpfg = LOW;

}

else {

tmpfg = HIGH;

}

dispHour();

dispDp();

BtnChk();

btchk[ONOFFBT - OFST] = false;

if (btchk[UPBT - OFST]) {

h = (h + 1) % 24 ;

btchk[UPBT - OFST] = false;

}

if (btchk[DOWNBT - OFST]) {

h = (h - 1) ;

if (h < 0) {

h = h + 24;

}

btchk[DOWNBT - OFST] = false;

}

chkDoOEproc(2);

}

break;

case 5: //mode 0 5 分設定の入力

dispD = 0; //真ん中の2つの点を表示

while (mainmode == 0 && submode[mainmode] == 5)

{

dispM = m;

dispMin();

dispDp();

BtnChk();

btchk[ONOFFBT - OFST] = false;

if (btchk[UPBT - OFST]) {

m = (m + 1) % 60 ;

btchk[UPBT - OFST] = false;

}

if (btchk[DOWNBT - OFST]) {

m = (m - 1);

if (m < 0) {

m = m + 60 ;

}

btchk[DOWNBT - OFST] = false;

}

chkDoOEproc(3);

}

break;

case 6: //mode 0 6 設定した時分をRTCに書き込み

setHour = h;

setMin = m;

setDay = dy;

setMonth = mh;

setYear = yr; // +30;

setTime();

setYMD();

submode[0] = 0;

break;

}

modebtFg = false;

setbtFg = false;

// TmChkOther();

break;

case 1: //mainmode 1 アラーム

modebtFg = false;

setbtFg = false;

//dispD = 0;

//dispD = mainmode;

tmpfg = HIGH; //20170625改定

int i1;

i1 = 0;

int ct;

ct = 0;

rptBb3=0;

rptBb4=0;

noTone(SUND);

// TmChkOther();

while (mainmode == 1) {

while (i1 < 16) {

dispDp();

i1++;

dispM = alM;

dispH = alH;

if (ct == 1) {

if (submode[mainmode] == 0) {

dispHour();

//delay(1);

} else {

dispMin();

//delay(1);

}

} else {

dispHour();

dispMin();

dispDp();

}

btchkReset();

BtnChk();

if (btchk[ONOFFBT - OFST]) { // ONOFFBT が押されたならアラームのOn/Off

alFg = ! alFg;

if (alFg) {

submode[1] = 0;

}

AlL = AlLed[alFg];

btchk[ONOFFBT - OFST] = false;

if (alFg == true) {

mainmode = 0;

submode[0] = 0;

}

}

if (submode[mainmode] == 0) { //分の設定

if (btchk[UPBT - OFST]) {

alM = (alM + 1) % 60 ;

btchk[UPBT - OFST] = false;

}

if (btchk[DOWNBT - OFST]) {

alM = (alM - 1);

if (alM < 0) {

alM = alM + 60 ;

}

btchk[DOWNBT - OFST] = false;

}

} else { //時間の設定

if (btchk[UPBT - OFST]) {

alH = (alH + 1) % 24 ;

btchk[UPBT - OFST] = false;

}

if (btchk[DOWNBT - OFST]) {

alH = (alH - 1);

if (alH < 0) {

alH = alH + 24 ;

}

btchk[DOWNBT - OFST] = false;

}

}

}

i1 = 0;

ct = 1 - ct;

// TmChkOther();

chkDoOEproc(3);

}

modebtFg = false;

setbtFg = false;

break;

case 2: //mainmode 2 タイマー

modebtFg = false;

setbtFg = false;

//dispD = 0;

//dispD = mainmode;

tmpfg = HIGH;

if (rptBb3==0 && rptBb4==0){

noTone(SUND);

}

switch (submode[2])

{

case 0: //mode 2 0 タイマー 秒設定

OpL = OpLed[0]; //DpA = DpAdd[0];

dispDp(); //いらないかもしれないけど一応

while (mainmode == 2 && submode[mainmode] == 0)

{

//dispD = 0; //真ん中の2つの点を表示

dispD = 1; //下の点を表示

tmOnFg = false;

dispM = tmrS;

upDisp = LOW;

dispIx = (dispIx + 1) % 50;

if (dispIx < 25) {

dispMin();

} else {

dispMinOff();

}

rptTmPre();

dispDp();

btchkReset();

BtnChk();

if (btchk[UPBT - OFST]) {

tmrS = (tmrS + 1) % 60 ;

btchk[UPBT - OFST] = false;

}

if (btchk[DOWNBT - OFST]) {

tmrS = (tmrS - 1);

if (tmrS < 0) {

tmrS = tmrS + 60 ;

}

btchk[DOWNBT - OFST] = false;

}

if (btLong[ONOFFBT - OFST] == true ) {

btLong[ONOFFBT - OFST] = false;

btchk[ONOFFBT - OFST] = false;

rptTmFg = ! rptTmFg;

}

if (btchk[ONOFFBT - OFST]) {

if (tmrM > 0) {

;

} else {

tmrM = 0;

}

if (tmrH > 0) {

;

} else {

tmrH = 0;

}

submode[mainmode] = 3;

btchk[ONOFFBT - OFST] = false;

}

chkDoOEproc(2);

}

break;

case 1: //mode 2 1 タイマー 分設定

OpL = OpLed[0]; //DpA = DpAdd[0];

dispDp(); //いらないかもしれないけど一応

while (mainmode == 2 && submode[mainmode] == 1)

{

//dispD = 0; //真ん中の2つの点を表示

dispD = 2; //上の点を表示

tmOnFg = false;

dispM = tmrM;

upDisp = HIGH;

dispIx = (dispIx + 1) % 50;

if (dispIx < 25) {

dispMin();

} else {

dispMinOff();

}

rptTmPre();

dispDp();

btchkReset();

BtnChk();

if (btchk[UPBT - OFST]) {

tmrM = (tmrM + 1) % 60 ;

btchk[UPBT - OFST] = false;

}

if (btchk[DOWNBT - OFST]) {

tmrM = (tmrM - 1);

if (tmrM < 0) {

tmrM = tmrM + 60 ;

}

btchk[DOWNBT - OFST] = false;

}

if (btLong[ONOFFBT - OFST] == true ) {

btLong[ONOFFBT - OFST] = false;

btchk[ONOFFBT - OFST] = false;

rptTmFg = ! rptTmFg;

}

if (btchk[ONOFFBT - OFST]) {

if (tmrS > 0) {

;

} else {

tmrS = 0;

}

if (tmrH > 0) {

;

} else {

tmrH = 0;

}

submode[mainmode] = 3;

btchk[ONOFFBT - OFST] = false;

}

chkDoOEproc(2);

}

break;

case 2: //mode 2 2 タイマー時設定

OpL = OpLed[0]; //DpA = DpAdd[0];

dispDp(); //いらないかもしれないけど一応

while (mainmode == 2 && submode[mainmode] == 2)

{

//dispD = 0; //真ん中の2つの点を表示

dispD = 0; //上下の点を表示

tmOnFg = false;

dispH = tmrH;

dispIx = (dispIx + 1) % 50;

if (dispIx < 25) {

dispHour();

} else {

dispHourOff();

}

rptTmPre();

dispDp();

btchkReset();

BtnChk();

if (btchk[UPBT - OFST]) {

tmrH = (tmrH + 1) % 24 ;

btchk[UPBT - OFST] = false;

}

if (btchk[DOWNBT - OFST]) {

tmrH = (tmrH - 1);

if (tmrH < 0) {

tmrH = tmrH + 24 ;

}

btchk[DOWNBT - OFST] = false;

}

if (btLong[ONOFFBT - OFST] == true ) {

btLong[ONOFFBT - OFST] = false;

btchk[ONOFFBT - OFST] = false;

rptTmFg = ! rptTmFg;

}

if (btchk[ONOFFBT - OFST]) {

if (tmrS > 0) {

;

} else {

tmrS = 0;

}

if (tmrM > 0) {

;

} else {

tmrM = 0;

}

submode[mainmode] = 3;

btchk[ONOFFBT - OFST] = false;

}

chkDoOEproc(2);

}

break;

case 3: //mode 2 3 セット完了、表示、スタート準備

int ttmmppq;

if ((tmrS == 0) && (tmrM == 0) && (tmrH == 0)) {

submode[mainmode] = 0;

for (int i = 0; i < timesModeSet; i++) {

PORTB = Seg[mainmode]; // OPRT DpAはしない;

digitalWrite(LED1, HIGH);

delay(5);

digitalWrite(LED1, LOW);

digitalWrite(LED2, LOW);

PORTB = Seg[submode[mainmode]]; // OPRT DpA;

digitalWrite(LED3, HIGH);

delay(5);

digitalWrite(LED3, LOW);

digitalWrite(LED4, LOW);

// PORTB = Seg[10];

// digitalWrite(LEDDP, HIGH);

// delay(5);

// digitalWrite(LEDDP, LOW);

dispDp();

}

} else {

ttmmppq = 0;

OpL = OpLed[1]; //DpA = DpAdd[1];

dispDp(); //いらないかもしれないけど一応

tmOnFg = false;

// dispM = tmrS; 20170918

dispM = tmrM;

dispH = tmrH;

while (mainmode == 2 && submode[mainmode] == 3)

{

if (tmrH == 0) {

dispH = tmrM;

dispM = tmrS;

} else {

if (ttmmppq > 70) {

upDisp = HIGH;

dispH = tmrM;

dispM = tmrS;

} else {

upDisp = LOW;

// dispH = tmrH;

dispM = tmrH;

}

ttmmppq = (ttmmppq + 1) % 150;

}

dispHour();

dispMin();

rptTmPre();

dispDp(); /////////////////////////////////////////////////////

btchkReset();

BtnChk();

rmS = 0;

rmM = 0;

rmH = 0;

if (btchk[ONOFFBT - OFST]) {

submode[mainmode] = 4;

if (RTC.read(tm)) {

;

}

nowH = tm.Hour;

nowM = tm.Minute;

nowS = tm.Second;

tgS = nowS + tmrS;

if (tgS > 59) {

krM = tgS / 60;

tgS = tgS % 60;

} else {

krM = 0;

}

tgM = nowM + tmrM + krM;

if (tgM > 59) {

krH = tgM / 60;

tgM = tgM % 60;

} else {

krH = 0;

}

tgH = nowH + tmrH + krH;

//tgS = nowS; 昔、秒を設定していなかった頃はこれ

//rmH=1;

//btchk[ONOFFBT - OFST] = false;

btchkReset();

}

}

}

break;

case 4: //mode 2 4 タイマー計測、表示、終わり待ち、終わったらブザー

int tt;

int ttmmpp;

ttmmpp = 0;

tt = false;

tmOnFg = true;

OpL = OpLed[0]; //DpA = DpAdd[0];

dispDp(); //いらないかもしれないけど一応

rmH = 1;

rmM = 1;

while ((tt == false) && (!((rmH == 0 && rmM == 0 && rmS == 0) || (rmH < 0 ))) && mainmode == 2 && submode[2] == 4 && tmOnFg == true)

// ((!(tt==true || (rmH==0 && rmM==0 && rmS==0) )) && mainmode == 2 && submode[2]==3)

{

btchkReset();

if (rptTmFg == true) {

RptTmChk();

if ((rptBb3 == 0) && (rptBb4 == 0)) {

noTone(SUND);

} else if (rptBb3 > 0) {

beebee3();

} else if (rptBb4 > 0) {

beebee4();

}

} else {

TmCheck(); // 時間がきていれば音鳴らす

if (tmEnd == true) {

tmEnd = false;

tmOnFg = false;

if (mainmode == 2) {

submode[mainmode] = 3;

}

}

}

if (rmH == 0) {

dispH = rmM;

dispM = rmS;

} else {

if (ttmmpp > 70) {

upDisp = LOW;

dispM = rmS;

} else {

upDisp = HIGH;

dispH = rmH;

dispM = rmM;

}

ttmmpp = (ttmmpp + 1) % 150;

}

dispHour();

dispMin();

rptTmPre();

dispDp(); ///////////////////////////////

upDisp = HIGH;

//stt = !stt;

if (dispD==0){

dispD = 3;

} else if(dispD==3){

dispD=0;

}

btchkReset();

BtnChk();

btchk[UPBT - OFST] = false;

btchk[DOWNBT - OFST] = false;

tt = btchk[ONOFFBT - OFST];

/* if (btchk[ONOFFBT - OFST]) {

submode[mainmode] = 2;

} */

btchk[ONOFFBT - OFST] = false;

} // while end   onoffボタン押されていないとか時間きてないとか 繰り返す

if (rptTmFg == true) { // 繰り返しモードの時

if (tt == true) { // onoffぼたん押されたとき

tmOnFg = false; // タイマー 終わり タイマー準備終わった徐状態に戻す

submode[2] = 3;

rptBb3 = 0;

rptBb4 = 0;

noTone(SUND);

} else { // onoffぼたん押されていないとき

;

}

} else { // 普通のタイマーの時、繰り返しモードでないとき、

if (rmH < 0 ) { // 時間が来ている時

submode[mainmode] = 3;

tmOnFg = false;

tmEnd = false;

rptBb3 = 0;

rptBb4 = 0;

} else { // 時間がまだ来ていないとき

if (tt == true) { // onoffボタンが押されたとき

submode[mainmode] = 5;

tmOnFg = false;

}

}

}

if (setbtFg) {

submode[2] = 3;

tmOnFg = false;

setbtFg = false;

}

//submode[mainmode]=2;

tt = false;

upDisp = HIGH;

break;

case 5: //mode 2 5 タイマー、途中でストップ、再開

//rptTm なら終わりの処理?

if (rptTmFg == true) {

// rptTmFg=false;

tmOnFg = false;

////////////////////////////////////////////////////////////////////////////////////////

if (mainmode == 2) {

submode[mainmode] = 3;

}

}

int ttt = false;

krM = 0;

krH = 0;

OpL = OpLed[1]; //DpA = DpAdd[1];

dispDp(); //いらないかもしれないけど一応

while (!ttt && !setbtFg && !modebtFg) {

tmOnFg = false;

if (rmH == 0) {

dispH = rmM;

dispM = rmS;

} else {

if (ttmmpp > 110) {

upDisp = LOW;

dispM = rmS;

} else {

upDisp = HIGH;

dispH = rmH;

dispM = rmM;

}

ttmmpp = (ttmmpp + 1) % 250;

}

dispHour();

dispMin();

// rptTmPre();

dispDp(); /////////////////////////////////////////////

dispD = 3;

BtnChk();

btchk[UPBT - OFST] = false;

btchk[DOWNBT - OFST] = false;

ttt = btchk[ONOFFBT - OFST];

if (ttt) {

submode[mainmode] = 4;

if (RTC.read(tm)) {

;

}

nowH = tm.Hour;

nowM = tm.Minute;

nowS = tm.Second;

tgS = nowS + rmS;

if (tgS > 59) {

tgS = tgS - 60;

krM = 1;

}

tgM = nowM + rmM + krM;

if (tgM > 59) {

tgM = tgM - 60;

krH = 1;

}

tgH = nowH + rmH + krH;

tmOnFg = true;

}

btchk[ONOFFBT - OFST] = false;

}

OpL = OpLed[0]; //DpA = DpAdd[0];

dispDp(); //いらないかもしれないけど一応

upDisp = HIGH;

dispD = 0;

if (setbtFg) {

submode[mainmode] = 0;

tmOnFg = false;

}

break; //end case 5 mode 2 5

OpL = OpLed[0]; //DpA = DpAdd[0];

dispDp(); //いらないかもしれないけど一応

}

modebtFg = false;

setbtFg = false;

upDisp = HIGH;

dispD = 0;

break; //end mainmode 2 タイマーモード 終わり

case 3: //mainmode 3 ストップウォッチ

modebtFg = HIGH;

setbtFg = HIGH;

//dispD = 0;

dispD = 0;

tmpfg = HIGH;

switch (submode[3])

{

case 0: // mode 3 0 ストップウォッチはじめの準備

// delay(20);

swOfH = 0;

swOfM = 0;

swOfS = 0;

OpL = OpLed[1]; //DpA = DpAdd[1];

dispDp(); //いらないかもしれないけど一応

while ((mainmode == 3 && submode[mainmode] == 0) ) {

dispH = 0;

dispM = 0;

dispHour();

dispMin();

dispDp();

BtnChk();

btchk[UPBT - OFST] = false;

btchk[DOWNBT - OFST] = false;

if (btchk[ONOFFBT - OFST]) {

submode[mainmode] = 1;

btchk[ONOFFBT - OFST] = false;

if (RTC.read(tm)) {

;

}

swSH = tm.Hour;

swSM = tm.Minute;

swSS = tm.Second;

}

TmChkOther();

chkDoOEproc(10);

}

OpL = OpLed[1]; //DpA = DpAdd[1];

dispDp(); //いらないかもしれないけど一応

break;

case 1: //mode 3 1 ストップウォッチ 計測、表示

int t ;

int ct;

int ttmmpp;

ct = 0;

t = false;

OpL = OpLed[0]; //DpA = DpAdd[0];

dispD = 0; //stt = true;

dispDp(); //いらないかもしれないけど一応

modebtFg = false;

setbtFg = false;

while (t == false && mainmode == 3 && submode[mainmode] == 1 && modebtFg == false && setbtFg == false)

{

if (RTC.read(tm)) {

;

}

krH = 0;

krM = 0;

swNS = tm.Second - swSS + swOfS;

if (swNS > 59) {

swNS = swNS - 60;

krM = 1;

}

if (swNS < 0) {

swNS = swNS + 60;

krM = -1;

}

swNM = tm.Minute - swSM + krM + swOfM;

if (swNM > 59) {

swNM = swNM - 60;

krH = 1;

}

if (swNM < 0) {

swNM = swNM + 60;

krH = -1;

}

swNH = tm.Hour - swSH + krH + swOfH;

if (swNH < 0) {

swNH = swNH + 24;

}

if (swNH == 0) {

dispH = swNM;

dispM = swNS;

} else {

if (ttmmpp > 70) {

upDisp = LOW;

dispM = swNS;

} else {

upDisp = HIGH;

dispH = swNH;

dispM = swNM;

}

ttmmpp = (ttmmpp + 1) % 150;

}

dispHour();

dispMin();

dispDp();

if (ct > 3) {

if (dispD == 1) {

dispD = 2;

ct = 0;

} else if (dispD == 2) {

dispD = 3;

ct = 0;

} else {

dispD = 1;

ct = 0;

}

} else {

ct++;

}

// stt = !stt; もとからコメントにしてあった

BtnChk();

btchk[UPBT - OFST] = false;

btchk[DOWNBT - OFST] = false;

if (btchk[ONOFFBT - OFST]) {

submode[mainmode] = 2;

}

//t = btchk[ONOFFBT - OFST] ;

btchk[ONOFFBT - OFST] = false;

//t=digitalRead(ONOFFBT);

TmChkOther();

}

//submode[3] = 2;

delay(20);

break;

case 2: //mode 3 2 ストップウォッチ 止めた時刻表示

int i = 0;

OpL = OpLed[1]; //DpA = DpAdd[1];

dispDp(); //いらないかもしれないけど一応

swOfS = swNS;

swOfM = swNM;

swOfH = swNH;

while (mainmode == 3 && submode[3] == 2) {

i++;

if (i > 80) {

i = 0;

}

if ((i < 40) && (swNH > 0)) {

dispD = 1;

dispH = swNH;

dispM = swNM;

upDisp = true;

} else {

upDisp = false;

dispD = 2;

dispH = swNM;

dispM = swNS;

}

upDisp = true;

dispHour();

dispMin();

dispDp();

BtnChk();

btchk[UPBT - OFST] = false;

btchk[DOWNBT - OFST] = false;

if (btchk[ONOFFBT - OFST]) {

submode[mainmode] = 1;

if (RTC.read(tm)) {

;

}

swSH = tm.Hour;

swSM = tm.Minute;

swSS = tm.Second;

}

btchk[ONOFFBT - OFST] = false;

TmChkOther();

}

break;

}

modebtFg = false;

setbtFg = false;

// plsDp=0; //////////////////////////////

break;

}

TmChkOther();

}

自作ギターなど手作り大好きキホーテの部屋

自作ギター、手作りウクレレ、電子回路、ミキサー、Arduinoを使った時計、木工などいろいろ、作ったり、直したり。道具の使い方も。ギター作りなど、手作り大好きキホーテの発想と失敗と反省と教訓と喜びなどの記録。