//数字表示用ピン const int pin7segA = 5; const int pin7segB = 7; const int pin7segC = 12; const int pin7segD = 10; const int pin7segE = 9; const int pin7segF = 6; const int pin7segG = 13; const int pin7segDP = 11; //桁制御用ピン const int pin7segDig1 = A5; const int pin7segDig2 = A4; const int pin7segDig3 = A3; const int pin7segDig4 = A2; //シリアル通信 char str[5]="0000"; //数字4桁+終端 char buf; int i; //7セグメントLED制御 int num; int numDisp[4]={0, 1, 2, 3}; //LEDに表示する数字 int numDigit; //表示桁 //割り込み処理 volatile int sw = LOW; volatile unsigned long time_prev = 0, time_now; unsigned long time_chat = 20; void setup() { //各ピンの設定 pinMode( pin7segA, OUTPUT ); pinMode( pin7segB, OUTPUT ); pinMode( pin7segC, OUTPUT ); pinMode( pin7segD, OUTPUT ); pinMode( pin7segE, OUTPUT ); pinMode( pin7segF, OUTPUT ); pinMode( pin7segG, OUTPUT ); pinMode( pin7segDP, OUTPUT ); pinMode( pin7segDig1, OUTPUT ); pinMode( pin7segDig2, OUTPUT ); pinMode( pin7segDig3, OUTPUT ); pinMode( pin7segDig4, OUTPUT ); digitalWrite(pin7segDP , LOW ); //シリアル通信の設定 Serial.begin(9600); //割り込み処理の設定 attachInterrupt(0, sendSW, CHANGE); //スイッチが変化したことをシリアル通信で通知 } void loop() { if (Serial.available() == 4) { //数字4桁 for( i=0; i<4; i++ ) str[i] = Serial.read(); num = atoi(str); } numDisp[0] = (num % 10); //1秒単位 numDisp[1] = (num/10) %10; //10秒単位 numDisp[2] = (num/100) % 10; //1分単位 numDisp[3] = (num/1000); //10分単位 //7セグメントLED制御 disp_7seg( -1 ); //残像対策として消灯 if( numDigit == 3 ) numDigit = 0; else numDigit++; //桁移動 dynamic_7seg( numDigit ); //桁移動 disp_7seg( numDisp[numDigit] ); //数字表示 delay(5); } //7セグメントLEDダイナミック点灯 void dynamic_7seg( int numDigit ) { switch(numDigit){ case 1: digitalWrite(pin7segDig4 , LOW ); digitalWrite(pin7segDig3 , HIGH ); digitalWrite(pin7segDig2 , LOW ); digitalWrite(pin7segDig1 , LOW ); break; case 2: digitalWrite(pin7segDig4 , LOW ); digitalWrite(pin7segDig3 , LOW ); digitalWrite(pin7segDig2 , HIGH ); digitalWrite(pin7segDig1 , LOW ); break; case 3: digitalWrite(pin7segDig4 , LOW ); digitalWrite(pin7segDig3 , LOW ); digitalWrite(pin7segDig2 , LOW ); digitalWrite(pin7segDig1 , HIGH ); break; default : digitalWrite(pin7segDig4 , HIGH ); digitalWrite(pin7segDig3 , LOW ); digitalWrite(pin7segDig2 , LOW ); digitalWrite(pin7segDig1 , LOW ); break; } } //7セグメントLED数字表示 void disp_7seg( int numDisp ) { switch(numDisp){ case 1: digitalWrite(pin7segA , LOW ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , LOW ); digitalWrite(pin7segE , LOW ); digitalWrite(pin7segF , LOW ); digitalWrite(pin7segG , LOW ); break; case 2: digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , LOW ); digitalWrite(pin7segD , HIGH ); digitalWrite(pin7segE , HIGH ); digitalWrite(pin7segF , LOW ); digitalWrite(pin7segG , HIGH ); break; case 3: digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , HIGH ); digitalWrite(pin7segE , LOW ); digitalWrite(pin7segF , LOW ); digitalWrite(pin7segG , HIGH ); break; case 4: digitalWrite(pin7segA , LOW ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , LOW ); digitalWrite(pin7segE , LOW ); digitalWrite(pin7segF , HIGH ); digitalWrite(pin7segG , HIGH ); break; case 5: digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , LOW ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , HIGH ); digitalWrite(pin7segE , LOW ); digitalWrite(pin7segF , HIGH ); digitalWrite(pin7segG , HIGH ); break; case 6: digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , LOW ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , HIGH ); digitalWrite(pin7segE , HIGH ); digitalWrite(pin7segF , HIGH ); digitalWrite(pin7segG , HIGH ); break; case 7: digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , LOW ); digitalWrite(pin7segE , LOW ); digitalWrite(pin7segF , HIGH ); digitalWrite(pin7segG , LOW ); break; case 8: digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , HIGH ); digitalWrite(pin7segE , HIGH ); digitalWrite(pin7segF , HIGH ); digitalWrite(pin7segG , HIGH ); break; case 9: digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , HIGH ); digitalWrite(pin7segE , LOW ); digitalWrite(pin7segF , HIGH ); digitalWrite(pin7segG , HIGH ); break; case -1: //消灯 digitalWrite(pin7segA , LOW ); digitalWrite(pin7segB , LOW ); digitalWrite(pin7segC , LOW ); digitalWrite(pin7segD , LOW ); digitalWrite(pin7segE , LOW ); digitalWrite(pin7segF , LOW ); digitalWrite(pin7segG , LOW ); break; default : //0 digitalWrite(pin7segA , HIGH ); digitalWrite(pin7segB , HIGH ); digitalWrite(pin7segC , HIGH ); digitalWrite(pin7segD , HIGH ); digitalWrite(pin7segE , HIGH ); digitalWrite(pin7segF , HIGH ); digitalWrite(pin7segG , LOW ); break; } } //割り込み処理 //前回のエッジ発生から20ms(time_chat)超過かつ、エッジ発生前の状態がLOW(=立ち上がりエッジが発生)の時に割り込み処理を実行 void sendSW() { time_now = millis(); if( time_now-time_prev > time_chat){ if( sw == LOW ) { //実行する割り込み処理 Serial.write(65); } sw = !sw; } time_prev = time_now; }