STM32G031と内部タイマーを使って3分タイマー (秋月シリアル7セグ)


目的
waitでもタイマーは、作れるがそれより正確な
内部タイマーを使って3分タイマーを作ってみた。
3分経つとカウンターが止まる
arduinoで内部タイマーが動く事がわたった。
当然ms(ミリ秒)、us(マイクロ秒)が動く事がわかつた。


![co2_3pun_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/331b01d4-bd7b-744c-2b01-5d70027580c0.jpeg)


![l_3pun_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/92c2052a-30e9-858c-e219-fe59ceeab4f9.jpeg)

いろいろ
パターンは、分割設計　失敗したら切り話して
ほぼ無料で配布する予定
多少は、高くてもP版に出稿する予定。
基板の出稿方法を
なんもかんも全部、忘れてしまったので
時間が掛りそう。
約600円で約50枚->約3万円ぐらいを想定
36時間ぐらいパターンを熟成させて20日の月曜ぐらい
20日は、やすみか　その次ぐらいに出稿
約16の20あるから4センチx5センチ

50x40 55枚　p版
基板製造サービス(ご選択ください)
ウルトラクイック　-日　　見積依頼
スーパークイック　2日　　　57,695
クイック　　　　　3日　　　40,315
ノーマル　　　　　5日　　　30,250
量産　　　　　　　15日　　58,282

ちょっと考えよう
びびったので
3個ぐらい人力で作って配布できたら次のステップに進もう

```c++


#include <Arduino.h>

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

#define DW   digitalWrite

//031
#define swdclk   PA14 // 8pin
#define swdio    PA13 // 7pin
// #define swdclk   PA12 // 6pin
// #define swdio    PA11 // 5pin
// //#define t_led1   PA12 // 6pin
// //#define t_led2   PA11 // 5pin
//#define en       PA0  // 4pin
//#define in7      PB7  // 1pin
#define en      PB7  // 1pin

char seg[32] = {
   0x00 , //0 @ -> ' '
   0x77 , //1 A  o
   0x7c , //2 B     　combined use "6"
   0x39 , //3 C
   0x5e , //4 D
   0x79 , //5 E  o
   0x71 , //6 F
   0x3d , //7 G

   0x76 , //8 H  o
   0x06 , //9 I    　combined use "1"
   0x1e , //10 J
   0x75 , //11 K 
   0x38 , //12 L  o
   0x15 , //13 M
   0x37 , //14 N  o
   0x3f , //15 O  o　combined use "0"

   0x73  , //16 P
   0x67  , //17 Q　combined use "9"
   0x50  , //18 R
   0x6d  , //19 S　combined use "5"
   0x78  , //20 T
   0x3e  , //21 U
   0x1c  , //22 V
   0x2a  , //23 W  o
   0x64  , //24 X

   0x6e  , //25 Y
   0x5b  , //26 Z　combined use "2"
   0x4f  , //27 [  --> "3"
   0x66  , //28 \  --> "4"
   0x27  , //29 ]  --> "7"
   0x7f  , //26 ^  --> "8"
   0x08    //31 _
};

//             12345678   12345678   12345678   12345678
char b8[8] = {0b10000000,0b01000000,0b00100000,0b00010000,
              0b00001000,0b00000100,0b00000010,0b00000001 };

void seg1(char v)
{
    for(int jj=0;jj<8;jj++){
        if( (v & b8[jj]) == 0 ){
                DW(swdio,0); //ビットが0
        } else {
                DW(swdio,1); //ビットが1
        }//endif
        DW(swdclk,1);
        DW(swdclk,0);
    }//for
    DW(en,1);
    DW(en,0);
}//seg1

char nn[]={'O','I','Z','[','\\','S','B', ']','^','Q'};

int comma1=0; // コンマ(小数点)の有効フラグ　1で有効　0無効

//7segの一文字出力 nana_seg
int ns_putc(char ch) {

    if(ch == ' ') {
        ch = '@';
    } else if(ch == '.') {
        return(0);
    } else if (ch >= '0' && ch <= '9' ) {
        ch = nn[ch-'0'];
    }

    if( comma1 != 0 ) { comma1 = (0x80); }
    seg1(seg[ch-64] | comma1  );
    comma1 = 0;

    //戻り値
    return(0);
}//ns_putc

//文字列の表示 nana_seg
int ns_printf(char *str1) {

    //文字の中身がゼロか
    while(*str1){

        //コンマの処理
        comma1=0;
        if( (*(str1+1) ) == '.' ) { comma1=1; }

        //一文字出力
        ns_putc(*str1 ++);

    } //while

    //戻り値
    return(0);
}//ns_printf

int a_bk=0;    //秒のバックアップ
int mc,md,ml;  //タイマーの時間

//初期化
void setup() {

  delay(3000); //not Delete

  //7セグの初期化
  pinMode(swdclk,OUTPUT);
  pinMode(swdio,OUTPUT);
  pinMode(en,OUTPUT);
  DW(en,0);
  DW(swdclk,0);

  ns_printf("STAR");delay(1000); //debug

  //Serial.begin( 9600 );//debug 767

  a_bk = millis() / 1000 ;
  mc   = a_bk;

  //初期値の表示
  ns_printf("0000");

  //最初のウエート　約1秒待つ
  delay(980);


}//setup

int  ii;           //ループカウンター
char data_read[8]; //バッファー
char h,m;          //時分

int a,b,c,d,e; //分秒
//int a_bk=0;    //秒のバックアップ

//ループ
void loop() {

  //秒が変わるまで待つ
  while(1) {
    a = millis() / 1000; //秒
    if( a != a_bk) {break;}
  }//while
  a_bk=a; //値を保存

  md = a;
  ml = md - mc;
  a = ml;

  //秒から分の分離
  b =  a / 10;       //1シフト 123秒の時は、12が戻る
  c = a - (b*10);    //1の桁 123秒の時は、3が戻る
  d =  b / 6;        //分 12の時は、3分
  e = b - ( d * 6 ); // 秒の10の桁　12- 3分*6 = 0

  int s = a;
  int n0,n10,n100,n1000;

  n10   = s / 10;            // 1234 -> 123
  n0    = s - (n10 *10);     // 1234 -  1230 -> 4
  n100  = n10 / 10;          // 123  -> 12
  n10   = n10 - (n100 *10);  // 123  -  120 -> 3
  n1000 = n100 / 10;         // 12   -> 1
  n100  = n100 - (n1000*10); // 12   -  10  -> 2

  //画面に表示
  data_read[0] = '0' + n1000;
  data_read[1] = '0' + n100;
  data_read[2] = '0' + n10;
  data_read[3] = '0' + n0;
  data_read[4] = 0;
  ns_printf(data_read);

  //3分経ったらループを停止してブリンク
  if( a == 180 /*3分*/ ) {
    while(1){
    }//while
  }//if
  
  //約1秒待つ
  delay(980);
  
}//loop



```


![h_con28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/26f993b4-547a-fcd9-3487-89fdabb50654.jpeg)