Created
September 11, 2016 14:10
-
-
Save iizukak/bfeb5ba7b0f58c7c74d24023044a3eaa to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "SPI.h" | |
#include <Wire.h> | |
#include <TimeLib.h> | |
#include <DS1307RTC.h> | |
const int cathode_pins[] = {2, 3, 4, 5, 6, 7, 8, 9, 14, 15, 16, 17}; // カソードに接続するArduinoのピン | |
const int number_of_cathode_pins = sizeof(cathode_pins) / sizeof(cathode_pins[0]); | |
int numbers_to_display = 0; // LEDに表示する数字を保持する変数 | |
int numbers_to_display_low = 0; | |
int numbers_to_display_middle = 0; | |
int numbers_to_display_upper = 0; | |
// int tmp_n; | |
const byte digits[] = { | |
0b11101011, // 0 | |
0b00101000, // 1 | |
0b10110011, // 2 | |
0b10111010, // 3 | |
0b01111000, // 4 | |
0b11011010, // 5 | |
0b11011011, // 6 | |
0b11101000, // 7 | |
0b11111011, // 8 | |
0b11111010, // 9 | |
}; | |
// 1桁の数字(n)を表示する | |
void display_number (int n) { | |
digitalWrite(SS, LOW); | |
SPI.transfer(digits[n]); | |
digitalWrite(SS, HIGH); | |
} | |
// アノードをすべてLOWにする | |
void clear_segments() { | |
digitalWrite(SS, LOW); | |
SPI.transfer(0); | |
digitalWrite(SS, HIGH); | |
} | |
void display_numbers () { | |
// int tmp_n = numbers_to_display; // number_to_displayの値を書き換えないために変数にコピー | |
int tmp_numbers_to_display_low = numbers_to_display_low; | |
int tmp_numbers_to_display_middle = numbers_to_display_middle; | |
int tmp_numbers_to_display_upper = numbers_to_display_upper; | |
for (int i = 0; i < 4; i++) { | |
digitalWrite(cathode_pins[i], LOW); | |
display_number(tmp_numbers_to_display_low % 10); // 最後の一桁を表示する | |
// display_number(8); // 最後の一桁を表示する | |
delayMicroseconds(100); | |
clear_segments(); | |
digitalWrite(cathode_pins[i], HIGH); | |
tmp_numbers_to_display_low = tmp_numbers_to_display_low / 10; // 10で割る | |
} | |
for (int i = 4; i < 8; i++) { | |
digitalWrite(cathode_pins[i], LOW); | |
display_number(tmp_numbers_to_display_middle % 10); // 最後の一桁を表示する | |
// display_number(8); // 最後の一桁を表示する | |
delayMicroseconds(100); | |
clear_segments(); | |
digitalWrite(cathode_pins[i], HIGH); | |
tmp_numbers_to_display_middle = tmp_numbers_to_display_middle / 10; // 10で割る | |
} | |
for (int i = 8; i < 12; i++) { | |
digitalWrite(cathode_pins[i], LOW); | |
display_number(tmp_numbers_to_display_upper % 10); // 最後の一桁を表示する | |
// display_number(8); // 最後の一桁を表示する | |
delayMicroseconds(100); | |
clear_segments(); | |
digitalWrite(cathode_pins[i], HIGH); | |
tmp_numbers_to_display_upper = tmp_numbers_to_display_upper / 10; // 10で割る | |
} | |
/* | |
for (int i = 0; i < number_of_cathode_pins; i++) { | |
digitalWrite(cathode_pins[i], LOW); | |
display_number(tmp_n % 10); // 最後の一桁を表示する | |
// display_number(8); // 最後の一桁を表示する | |
delayMicroseconds(100); | |
clear_segments(); | |
digitalWrite(cathode_pins[i], HIGH); | |
tmp_n = tmp_n / 10; // 10で割る | |
} | |
*/ | |
} | |
void set_numbers(time_t n) { | |
noInterrupts(); | |
numbers_to_display = n; | |
// Serial.println(n); | |
// 10000 以下の桁数に三分割する | |
numbers_to_display_low = n % 10000; | |
n = n / 10000; | |
numbers_to_display_middle = n % 10000; | |
n = n / 10000; | |
numbers_to_display_upper = n; | |
interrupts(); | |
// Serial.println(numbers_to_display_low); | |
// Serial.println(numbers_to_display_middle); | |
// Serial.println(numbers_to_display_upper); | |
} | |
void setup() { | |
SPI.begin(); | |
SPI.setBitOrder(MSBFIRST); | |
SPI.setClockDivider(SPI_CLOCK_DIV2); | |
SPI.setDataMode(SPI_MODE0); | |
for (int i = 0; i < number_of_cathode_pins; i++) { | |
pinMode(cathode_pins[i], OUTPUT); // cathode_pinを出力モードに設定する | |
digitalWrite(cathode_pins[i], HIGH); | |
} | |
// f = クロック周波数 / ( 2 * 分周比 * ( 1 + 比較レジスタの値)) | |
// 分周比=32, 比較レジスタの1値=255 -> f = 16000000 / (2 * 32 * 256) = 976 Hz | |
OCR2A = 255; // 255クロックごとに割り込みをかける | |
TCCR2B = 0b100; // 分周比を32に設定する | |
bitWrite(TIMSK2, OCIE2A, 1); // TIMER2を | |
Serial.begin(9600); | |
while (!Serial) ; // wait for serial | |
delay(200); | |
// Serial.println("DS1307RTC Read Test"); | |
// Serial.println("-------------------"); | |
} | |
void loop () { | |
tmElements_t tm; | |
time_t current_ut; | |
if (RTC.read(tm)) { | |
current_ut = makeTime(tm); | |
set_numbers(current_ut); | |
Serial.println(current_ut); | |
// Serial.print(current_ut); | |
// Serial.println(); | |
}else{ | |
Serial.println("Cannnot get time"); | |
} | |
delay(100); | |
} | |
ISR(TIMER2_COMPA_vect) | |
{ | |
display_numbers(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment