先日、Raspberry Pi 4でLチカを経験してから、毎晩これに夢中です。
あれから物凄く努力して、7セグLEDを1つ繋げて現時刻の0秒から9秒を表示出来るようになりました。
↑ 1桁ですが、疑似ダイナミック表示させています。点灯は0.25ミリ秒、消灯は1.25ミリ秒を繰り返して、6桁のダイナミック表示1桁目のつもりなんですが。
私の開発環境は、このブログ内にある「ラズパイで初めてのLチカ」を見て下さい。
↓ 点灯消灯時間を変えてありますが、そのソースコードです。
/*
* test7.cpp
* clock_gettime()に変更
*/
#include <iostream>
#include <pigpio.h>
#include <time.h>
using namespace std;
int main(void)
{
int i, j;
struct timespec ts;
struct tm lotm;
// 7seg a b c d e f g dp
int gpio_pin[8] = {21, 20, 16, 26, 19, 06, 13, 12};
// GPIO 21 20 16 26 19 06 13 12
int segdata[12][8] = { // 7segment 2次元配列
// a b c d e f g dp
{0, 0, 0, 0, 0, 0, 1, 1}, // 0
{1, 0, 0, 1, 1, 1, 1, 1}, // 1
{0, 0, 1, 0, 0, 1, 0, 1}, // 2
{0, 0, 0, 0, 1, 1, 0, 1}, // 3
{1, 0, 0, 1, 1, 0, 0, 1}, // 4
{0, 1, 0, 0, 1, 0, 0, 1}, // 5
{0, 1, 0, 0, 0, 0, 0, 1}, // 6
{0, 0, 0, 1, 1, 1, 1, 1}, // 7
{0, 0, 0, 0, 0, 0, 0, 1}, // 8
{0, 0, 0, 0, 1, 0, 0, 1}, // 9
{1, 1, 1, 1, 1, 1, 1, 1}, // Blank
{1, 1, 1, 1, 1, 1, 1, 0} // dp
};
// pigpioライブラリ初期化
if (gpioInitialise() < 0) exit(1);
// GPIO使用ピンをアウトプット設定
for (i = 0; i < 8; i++) {
gpioSetMode(gpio_pin[i], PI_OUTPUT);
}
// 表示消灯を100回繰り返して終了
for (i = 0; i < 100; i++) {
clock_gettime(CLOCK_REALTIME, &ts); // 時刻の取得
localtime_r(&ts.tv_sec, &lotm); // ローカル時間に変換
// int num = lotm.tm_hour / 10; // 時、十の位取得
// int num = lotm.tm_hour % 10; // 時、一の位取得
// int num = lotm.tm_min / 10; // 分、十の位取得
// int num = lotm.tm_min % 10; // 分、一の位取得
// int num = lotm.tm_sec / 10; // 秒、十の位取得
int num = lotm.tm_sec % 10; // 秒、一の桁取得
cout << num << flush;
for (j = 0; j < 8; j++) { // 7セグLED表示(秒一の位)
gpioWrite(gpio_pin[j], segdata[num][j]);
}
gpioDelay(4000); // 4ミリ秒
for (j = 0; j < 8; j++) { // 消灯(10 -> Blank)
gpioWrite(gpio_pin[j], segdata[10][j]);
}
gpioDelay(20000); // 20ミリ秒
}
cout << endl;
// pigpioライブラリ終了処理
gpioTerminate();
return 0;
}
$ sudo ./test7
6666666666677777777777777777777777777777777777777777888888888888888888888888888888888888888889999999
このソースコードの点灯4ミリ秒、消灯20ミリ秒、約41Hzの疑似ダイナミック表示なら、私の目に7セグLEDのちらつきは感じません。
でもVNCで遠隔操作している時は、そのサイクルを早くしても、ちらつきます。