//*****************************************************************************************
// Program name : big_clock.c
// Description : Big clock by Raspberry Pi Zero WH
// Author : Yoshio Kato
// Start date : 1st.Oct.2019
// Compile : cc -o big_clock big_clock.c -l wiringPi
// Excution : sudo ./big_clock
//*****************************************************************************************
#include <wiringPi.h> //wiringPiヘッダーファイルをインクルード
#include <time.h> //timeヘッダーファイルをインクルード
#include <stdio.h> //stdioiヘッダーファイルをインクルード
#include <stdlib.h> //stdlibヘッダーファイルをインクルード
#define a 14 // a セグメント GPIO
#define b 15 // b セグメント GPIO
#define c 18 // c セグメント GPIO
#define d 23 // d セグメント GPIO
#define e 24 // e セグメント GPIO
#define f 25 // f セグメント GPIO
#define g 8 // g セグメント GPIO
#define second_led 7 // 秒点滅LED
#define shutdown_sw 26 //シャットダウンスイッチのGPIO
char digit_gpio[4] = {21,20,16,12} ; //デジット選択 GPIO D1,D2,D3,D4
char segment[10][8] ={{a,b,c,d,e,f,0,0}, //0のセグメントデータ
{b,c,0,0,0,0,0,0}, //1のセグメントデータ
{a,b,d,e,g,0,0,0}, //2のセグメントデータ
{a,b,c,d,g,0,0,0}, //3のセグメントデータ
{b,c,f,g,0,0,0,0}, //4のセグメントデータ
{a,c,d,f,g,0,0,0}, //5のセグメントデータ
{a,c,d,e,f,g,0,0}, //6のセグメントデータ
{a,b,c,f,0,0,0,0}, //7のセグメントデータ
{a,b,c,d,e,f,g,0}, //8のセグメントデータ
{a,b,c,d,f,g,0,0}} ; //9のセグメントデータ
time_t timer ;
struct tm *tim ; //構造体の設定
char save_min ;
//*****************************************************************************************
// 初期設定処理
//*****************************************************************************************
int init(){
int i ;
if(wiringPiSetupGpio() == -1) //wiringPiの設定 戻り値が-1の時はエラー
return(-1) ; //エラーリターン
for(i=0; i<4; i++) //デジットのGPIO設定
pinMode(digit_gpio[i],OUTPUT) ; //デジットのGPIOを出力設定
for(i=0; i<7;i++)
pinMode(segment[8][i],OUTPUT) ; //各セグメントのGPIOを出力設定
pinMode(second_led,OUTPUT) ;
pinMode(shutdown_sw,INPUT) ; //シャットダウンスイッチのGPIOを入力設定
pullUpDnControl(shutdown_sw,PUD_UP) ; //シャットダウンスイッチのGPIOをプルアップ
return(1) ;
}
//*****************************************************************************************
// 7セグメント表示器を消去
//*****************************************************************************************
void erase_7seg_led(){
int i ;
for(i=0; i<7; i++)
digitalWrite(segment[8][i],0) ; //a~gセグメントをオフ
for(i=0; i<4; i++)
digitalWrite(digit_gpio[i],0) ; //全てのSA1015をオフ
}
//*****************************************************************************************
// 指定したデジットに数字を表示
//*****************************************************************************************
void display_data(char dgt, char time_data){
int i =0 ;
erase_7seg_led() ; //全ての表示を消去
while(segment[time_data][i] != 0) //数字を構成するデータが0でない間繰り返す
digitalWrite(segment[time_data][i++],1) ; //対応するセグメントをオン
digitalWrite(digit_gpio[dgt],1) ; //指定したデジットをオン 数字が表示
delay(4) ; //4ms時間をおく
}
//*****************************************************************************************
// 時と分の表示
//*****************************************************************************************
void display(){
display_data(0,tim->tm_hour /10) ; //時を10で割り商をデジット1へ表示
display_data(1,tim->tm_hour %10) ; //時を10で割り余りをデジット1へ表示
display_data(2,tim->tm_min /10) ; //分を10で割り商をデジット1へ表示
display_data(3,tim->tm_min % 10) ; //分を10で割り余りをデジット1へ表示
}
//*****************************************************************************************
// メイン
//*****************************************************************************************
int main(){
char count = 60 ; //表示回数カウンター用
if(init() == -1) //初期設定処理をコール
return(-1) ; //初期設定処理でエラー発生ならば終了
while(digitalRead(shutdown_sw) != 0){ //シャットダウンスイッチが押されていない間繰り返す
if(count == 60){ //60回(約1秒)表示したら時間を求める
time(&timer) ;
tim = localtime(&timer) ; //現在時刻を求める
count = 0;
}
display() ; //表示処理をコール
count++ ; //表示回数に1を加える
if(count <= 30)
digitalWrite(second_led,0); //秒点滅LEDオフ
else
digitalWrite(second_led,1); //秒点滅LEDオン
}
erase_7seg_led() ; //全ての表示を消去
digitalWrite(second_led,0) ; //秒点滅LEDをオフ
count = 0 ;
while(digitalRead(shutdown_sw) == 0){ //shutdownスイッチが離されるまでの間実行
delay(100) ; //100msのdelay
count ++ ; //100ms毎にcountをプラスする
}
if(count >= 30) //countが30(3秒)以上か
system("sudo shutdown -h now") ; //3秒以上なのでshutdownコマンドを実行し終了する
else
return(1) ; //shutdownではないのでOSへ戻る
}
//********************************** End of Program ******************************************