Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
#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