ハードは出来ていないけどソフトはおおかた完成?
↓ この大型7セグLED6個とラズパイでNTP時計を作るのが目標なんです。丁度、今発売中のハム関係の雑誌で同じような記事があったから、そのソースコードが気になるんですが。
時刻取得及び7セグLED6桁ダイナミック表示ルーチン(無限ループ)は
このフローチャートはLucidchartのフリー版で作成。
一桁当たりの表示時間を3ミリ秒とすると、時刻の取得は1秒間に約55回になります。この時、Pi4でのCPU使用率は約8%でした。実際にはZeroにする予定なので、どの位のCPU使用率なるのか心配です。Zeroでも少ないCPU使用率なら時刻の取得サイクルは、このまま変えずに行きたいです。
/*
* test12.cpp
*
* daemon化
*
* 6桁ダイナミック表示対応
* 時刻 08:34:27 の場合
* 表示順序は 7 -> 2 -> 4 -> 3 -> 8 -> 0
*
*/
#include <iostream>
#include <pigpio.h>
#include <unistd.h>
#define H 0x1
#define L 0x0
#define SEG_ON 0x1
#define SEG_OFF 0x0
using namespace std;
void mainLoop(void);
int main(void)
{
if(daemon(0, 0) == 0) { // デーモン関数
mainLoop();
} else {
cout << "error" << endl;
}
return 0;
}
void mainLoop(void)
{
int i, j;
int num[6];
struct timespec ts;
struct tm lotm;
// 1秒 10秒 1分 10分 1時 10時
// Common 1 2 3 4 5 6
static int common[6] = {18, 23, 24, 17, 25, 5};
// GPIO 18 23 24 17 25 5
// 7seg a b c d e f g dp
static int nanaseg[8] = {21, 20, 16, 26, 19, 6, 13, 12};
// GPIO 21 20 16 26 19 6 13 12
static int segdata[12][8] = { // 7セグメントデータ
// a b c d e f g dp
{H, H, H, H, H, H, L, L}, // 0
{L, H, H, L, L, L, L, L}, // 1
{H, H, L, H, H, L, H, L}, // 2
{H, H, H, H, L, L, H, L}, // 3
{L, H, H, L, L, H, H, L}, // 4
{H, L, H, H, L, H, H, L}, // 5
{H, L, H, H, H, H, H, L}, // 6
{H, H, H, L, L, L, L, L}, // 7
{H, H, H, H, H, H, H, L}, // 8
{H, H, H, H, L, H, H, L}, // 9
{L, L, L, L, L, L, L, L}, // Blank
{L, L, L, L, L, L, L, H}, // dp
};
// pigpioライブラリ初期化
if (gpioInitialise() < 0) exit(1);
// コモン用GPIOピンをアウトプット設定
for (i = 0; i < 6; i++) {
gpioSetMode(common[i], PI_OUTPUT);
}
// セグメント用GPIOピンをアウトプット設定
for (i = 0; i < 8; i++) {
gpioSetMode(nanaseg[i], PI_OUTPUT);
}
/*
*
* 時刻取得及びダイナミック表示ルーチン(無限ループ)
*
* 時刻取得、1桁3ミリ秒表示×6、時刻取得、1桁3ミリ秒表示×6の繰り返し
*
*/
while (1) {
clock_gettime(CLOCK_REALTIME, &ts); // 時刻の取得
localtime_r(&ts.tv_sec, &lotm); // ローカル時間に変換
num[0] = lotm.tm_sec % 10; // 1秒の桁取得
num[1] = lotm.tm_sec / 10; // 10秒の桁取得
num[2] = lotm.tm_min % 10; // 1分の桁取得
num[3] = lotm.tm_min / 10; // 10分の桁取得
num[4] = lotm.tm_hour % 10; // 1時の桁取得
num[5] = lotm.tm_hour / 10; // 10時の桁取得
for (j = 0; j < 6; j++) { // 6桁ダイナミック表示ルーチン
for (i = 0; i < 8; i++) { // 7セグメントデータセット
gpioWrite(nanaseg[i], segdata[num[j]][i]);
}
gpioWrite(common[j], SEG_ON); // 7セグLED点灯
gpioDelay(3000); // 3ミリ秒点灯維持
gpioWrite(common[j], SEG_OFF); // 7セグLED消灯
}
}
// pigpioライブラリ終了処理
gpioTerminate(); // これは無限ループに含まれないので不要?
}
いよいよ例の7セグメントLED表示器の出番ですね。
(一行目、ソスト×→ソフト〇ですかね?)
誤字の指摘ありがとう御座います。
ハードの方は簡単な回路ですが、配線が大変そう。だからと言ってプリント基板設計ソストも扱えないしで、ハード作成は後回しになっています。