電波社

  • HOME
  • 会社概要
  • お問い合わせ

 //*****************************************************************************************

// 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 ******************************************