最近急に7セグメントLEDに興味を持ったのでarduinoかラズパイで何か作れないか考えていた。
ラズパイであればpysonでのプログラミングとなる。pysonはネットワークにつながっていればモジュールをインポートするだけで時間を取得することができる。
とりあえず7セグメントひとつだけでGPIOを制御してみた。
#!/usr/bin/python
# coding: utf-8
# モジュールをインポートする
import time
import RPi.GPIO as GPIO
# GPIO指定をGPIO番号で行う
GPIO.setmode(GPIO.BCM)
num = 0
while num < 2:
t = time.localtime()
sec = t[5] #取得した時間のうち5が秒となる。
print(sec)
if sec == 0:
GPIO.setup(2, GPIO.OUT)
GPIO.output(2, 1)
GPIO.setup(22, GPIO.OUT)
GPIO.output(22, 1)
GPIO.setup(3, GPIO.OUT)
GPIO.output(3, 1)
GPIO.setup(4, GPIO.OUT)
GPIO.output(4, 1)
GPIO.setup(27, GPIO.OUT)
GPIO.output(27, 1)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, 1)
else:
GPIO.setup(22, GPIO.OUT)
GPIO.output(22, 0)
GPIO.setup(2, GPIO.OUT)
GPIO.output(2, 0)
GPIO.setup(3, GPIO.OUT)
GPIO.output(3, 0)
GPIO.setup(4, GPIO.OUT)
GPIO.output(4, 0)
GPIO.setup(27, GPIO.OUT)
GPIO.output(27, 0)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, 0)
if sec == 1:
GPIO.setup(22, GPIO.OUT)
GPIO.output(22, 1)
GPIO.setup(3, GPIO.OUT)
GPIO.output(3, 1)
else:
GPIO.setup(22, GPIO.OUT)
GPIO.output(22, 0)
GPIO.setup(3, GPIO.OUT)
GPIO.output(3, 0)
if sec == 2:
GPIO.setup(2, GPIO.OUT)
GPIO.output(2, 1)
GPIO.setup(22, GPIO.OUT)
GPIO.output(22, 1)
GPIO.setup(27, GPIO.OUT)
GPIO.output(27, 1)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, 1)
GPIO.setup(14, GPIO.OUT)
GPIO.output(14, 1)
else:
GPIO.setup(22, GPIO.OUT)
GPIO.output(22, 0)
GPIO.setup(2, GPIO.OUT)
GPIO.output(2, 0)
GPIO.setup(14, GPIO.OUT)
GPIO.output(14, 0)
GPIO.setup(27, GPIO.OUT)
GPIO.output(27, 0)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, 0)
if sec == 4:
GPIO.setup(4, GPIO.OUT)
GPIO.output(4, 1)
else:
GPIO.setup(4, GPIO.OUT)
GPIO.output(4, 0)
if sec == 5:
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, 1)
else:
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, 0)
if sec == 6:
GPIO.setup(27, GPIO.OUT)
GPIO.output(27, 1)
else:
GPIO.setup(27, GPIO.OUT)
GPIO.output(27, 0)
if sec == 7:
GPIO.setup(14, GPIO.OUT)
GPIO.output(14, 1)
else:
GPIO.setup(14, GPIO.OUT)
GPIO.output(14, 0)
時間のモジュールをとりこみ、秒を0~9までif文で場合分けし、それぞれGPIOにて出力した。
ラズパイではネットワークにつなぐのが楽なので容易に7セグメントに出力できた。
しかしながら、この調子でケタを増やすとなるとコネクタもコードも煩雑になり困難を極める。
ということで、GPIO出力が多くネットワークにつなげるのが可能なESP32を使うことにした。
arduinoでもほぼ同じコードでできるが、イーサネットシールドが必要になる。
#include <WiFi.h>
#include <time.h>
#define JST 3600* -9
const char* ssid = "SSIDを入れて下さい";
const char* password = "パスワードを入れて下さい";
void setup() {
Serial.begin(115200);
delay(100);
Serial.print("\n\nStart\n");
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(500);
}
Serial.println();
Serial.printf("Connected, IP address: ");
Serial.println(WiFi.localIP());
configTime( JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
pinMode(13,OUTPUT);
pinMode(25,OUTPUT);
pinMode(16,OUTPUT);
pinMode(17,OUTPUT);
pinMode(18,OUTPUT);
pinMode(19,OUTPUT);
pinMode(22,OUTPUT);
pinMode(23,OUTPUT);
pinMode(26,OUTPUT);
pinMode(27,OUTPUT);
pinMode(21,OUTPUT);
}
void loop() {
time_t t;
struct tm *tm;
static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
t = time(NULL);
tm = localtime(&t);
Serial.printf(" %04d/%02d/%02d(%s) %02d:%02d:%02d\n",
tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
wd[tm->tm_wday],
tm->tm_hour, tm->tm_min, tm->tm_sec);
//時
if("%02d",tm->tm_hour ==1 ){
digitalWrite(13,HIGH);//1桁目 1
digitalWrite(17,LOW);//2桁目 0
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 0
digitalWrite(16,LOW);//右上 0
digitalWrite(22,HIGH);//中段 0
digitalWrite(23,LOW);//上段 0
digitalWrite(27,LOW);//下段 0
digitalWrite(26,LOW);//左下 0
digitalWrite(21,LOW);//左下 0
delay(5);
digitalWrite(13,LOW);//1桁目 0
digitalWrite(17,HIGH);//2桁目 1
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 1
digitalWrite(25,LOW);//右下 1
digitalWrite(16,LOW);//右上 1
digitalWrite(22,HIGH);//中段 1
digitalWrite(23,HIGH);//上段 1
digitalWrite(27,HIGH);//下段 1
digitalWrite(26,HIGH);//左下 1
digitalWrite(21,HIGH);//左上 1
delay(5);
;}
if("%02d",tm->tm_hour ==2 ){
digitalWrite(13,HIGH);//1桁目 1
digitalWrite(17,LOW);//2桁目 0
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 0
digitalWrite(16,LOW);//右上 0
digitalWrite(22,HIGH);//中段 0
digitalWrite(23,LOW);//上段 0
digitalWrite(27,LOW);//下段 0
digitalWrite(26,LOW);//左下 0
digitalWrite(21,LOW);//左下 0
delay(5);
digitalWrite(13,LOW);//1桁目 0
digitalWrite(17,HIGH);//2桁目 1
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 2
digitalWrite(25,HIGH);//右下 2
digitalWrite(16,LOW);//右上 2
digitalWrite(22,LOW);//中段 2
digitalWrite(23,LOW);//上段 2
digitalWrite(27,LOW);//下段 2
digitalWrite(26,LOW);//左下 2
digitalWrite(21,HIGH);//左上 2
delay(5);
;}
if("%02d",tm->tm_hour ==3 ){
digitalWrite(13,HIGH);//1桁目 1
digitalWrite(17,LOW);//2桁目 0
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 0
digitalWrite(16,LOW);//右上 0
digitalWrite(22,HIGH);//中段 0
digitalWrite(23,LOW);//上段 0
digitalWrite(27,LOW);//下段 0
digitalWrite(26,LOW);//左下 0
digitalWrite(21,LOW);//左下 0
delay(5);
digitalWrite(13,LOW);//1桁目 0
digitalWrite(17,HIGH);//2桁目 1
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 3
digitalWrite(25,LOW);//右下 3
digitalWrite(16,LOW);//右上 3
digitalWrite(22,LOW);//中段 3
digitalWrite(23,LOW);//上段 3
digitalWrite(27,LOW);//下段 3
digitalWrite(26,HIGH);//左下 3
digitalWrite(21,HIGH);//左上 3
delay(5);
;}
if("%02d",tm->tm_hour ==4 ){
digitalWrite(13,HIGH);//1桁目 1
digitalWrite(17,LOW);//2桁目 0
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 0
digitalWrite(16,LOW);//右上 0
digitalWrite(22,HIGH);//中段 0
digitalWrite(23,LOW);//上段 0
digitalWrite(27,LOW);//下段 0
digitalWrite(26,LOW);//左下 0
digitalWrite(21,LOW);//左下 0
delay(5);
digitalWrite(13,LOW);//1桁目 0
digitalWrite(17,HIGH);//2桁目 1
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 4
digitalWrite(25,LOW);//右下 4
digitalWrite(16,LOW);//右上 4
digitalWrite(22,LOW);//中段 4
digitalWrite(23,HIGH);//上段 4
digitalWrite(27,HIGH);//下段 4
digitalWrite(26,HIGH);//左下 4
digitalWrite(21,LOW);//左上 4
delay(5);
;}
if("%02d",tm->tm_hour ==5 ){
digitalWrite(13,HIGH);//1桁目 1
digitalWrite(17,LOW);//2桁目 0
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 0
digitalWrite(16,LOW);//右上 0
digitalWrite(22,HIGH);//中段 0
digitalWrite(23,LOW);//上段 0
digitalWrite(27,LOW);//下段 0
digitalWrite(26,LOW);//左下 0
digitalWrite(21,LOW);//左下 0
delay(5);
digitalWrite(13,LOW);//1桁目 0
digitalWrite(17,HIGH);//2桁目 1
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 5
digitalWrite(25,LOW);//右下 5
digitalWrite(16,HIGH);//右上 5
digitalWrite(22,LOW);//中段 5
digitalWrite(23,LOW);//上段 5
digitalWrite(27,LOW);//下段 5
digitalWrite(26,HIGH);//左下 5
digitalWrite(21,LOW);//左上 5
delay(5);
;}
if("%02d",tm->tm_hour ==6 ){
digitalWrite(13,HIGH);//1桁目 1
digitalWrite(17,LOW);//2桁目 0
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 0
digitalWrite(16,LOW);//右上 0
digitalWrite(22,HIGH);//中段 0
digitalWrite(23,LOW);//上段 0
digitalWrite(27,LOW);//下段 0
digitalWrite(26,LOW);//左下 0
digitalWrite(21,LOW);//左下 0
delay(5);
digitalWrite(13,LOW);//1桁目 0
digitalWrite(17,HIGH);//2桁目 1
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 6
digitalWrite(25,LOW);//右下 6
digitalWrite(16,HIGH);//右上 6
digitalWrite(22,LOW);//中段 6
digitalWrite(23,LOW);//上段 6
digitalWrite(27,LOW);//下段 6
digitalWrite(26,LOW);//左下 6
digitalWrite(21,LOW);//左上 6
delay(5);
;}
if("%02d",tm->tm_hour ==7 ){
digitalWrite(13,HIGH);//1桁目 1
digitalWrite(17,LOW);//2桁目 0
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 0
digitalWrite(16,LOW);//右上 0
digitalWrite(22,HIGH);//中段 0
digitalWrite(23,LOW);//上段 0
digitalWrite(27,LOW);//下段 0
digitalWrite(26,LOW);//左下 0
digitalWrite(21,LOW);//左下 0
delay(5);
digitalWrite(13,LOW);//1桁目 0
digitalWrite(17,HIGH);//2桁目 1
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 7
digitalWrite(16,LOW);//右上 7
digitalWrite(22,HIGH);//中段 7
digitalWrite(23,LOW);//上段 7
digitalWrite(27,HIGH);//下段 7
digitalWrite(26,HIGH);//左下 7
digitalWrite(21,HIGH);//左上 7
delay(5);
;}
if("%02d",tm->tm_hour ==8 ){
digitalWrite(13,HIGH);//1桁目 1
digitalWrite(17,LOW);//2桁目 0
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 0
digitalWrite(16,LOW);//右上 0
digitalWrite(22,HIGH);//中段 0
digitalWrite(23,LOW);//上段 0
digitalWrite(27,LOW);//下段 0
digitalWrite(26,LOW);//左下 0
digitalWrite(21,LOW);//左下 0
delay(5);
digitalWrite(13,LOW);//1桁目 0
digitalWrite(17,HIGH);//2桁目 1
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 8
digitalWrite(16,LOW);//右上 8
digitalWrite(22,LOW);//中段 8
digitalWrite(23,LOW);//上段 8
digitalWrite(27,LOW);//下段 8
digitalWrite(26,LOW);//左下 8
digitalWrite(21,LOW);//左上 8
delay(5);
;}
if("%02d",tm->tm_hour ==9 ){
digitalWrite(13,HIGH);//1桁目 1
digitalWrite(17,LOW);//2桁目 0
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 0
digitalWrite(16,LOW);//右上 0
digitalWrite(22,HIGH);//中段 0
digitalWrite(23,LOW);//上段 0
digitalWrite(27,LOW);//下段 0
digitalWrite(26,LOW);//左下 0
digitalWrite(21,LOW);//左下 0
delay(5);
digitalWrite(13,LOW);//1桁目 0
digitalWrite(17,HIGH);//2桁目 1
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 9
digitalWrite(16,LOW);//右上 9
digitalWrite(22,LOW);//中段 9
digitalWrite(23,LOW);//上段 9
digitalWrite(27,LOW);//下段 9
digitalWrite(26,HIGH);//左下 9
digitalWrite(21,LOW);//左上 9
delay(5);
;}
if("%02d",tm->tm_hour ==10 ){
digitalWrite(13,HIGH);//1桁目 1
digitalWrite(17,LOW);//2桁目 0
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 1
digitalWrite(16,LOW);//右上 1
digitalWrite(22,HIGH);//中段 1
digitalWrite(23,HIGH);//上段 1
digitalWrite(27,HIGH);//下段 1
digitalWrite(26,HIGH);//左下 1
digitalWrite(21,HIGH);//左上 1
delay(5);
digitalWrite(13,LOW);//1桁目 0
digitalWrite(17,HIGH);//2桁目 1
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 0
digitalWrite(16,LOW);//右上 0
digitalWrite(22,HIGH);//中段 0
digitalWrite(23,LOW);//上段 0
digitalWrite(27,LOW);//下段 0
digitalWrite(26,LOW);//左下 0
digitalWrite(21,LOW);//左下 0
delay(5);
;}
if("%02d",tm->tm_hour ==11 ){
digitalWrite(13,HIGH);//1桁目 1
digitalWrite(17,LOW);//2桁目 0
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 1
digitalWrite(16,LOW);//右上 1
digitalWrite(22,HIGH);//中段 1
digitalWrite(23,HIGH);//上段 1
digitalWrite(27,HIGH);//下段 1
digitalWrite(26,HIGH);//左下 1
digitalWrite(21,HIGH);//左上 1
delay(5);
digitalWrite(13,LOW);//1桁目 0
digitalWrite(17,HIGH);//2桁目 1
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 1
digitalWrite(16,LOW);//右上 1
digitalWrite(22,HIGH);//中段 1
digitalWrite(23,HIGH);//上段 1
digitalWrite(27,HIGH);//下段 1
digitalWrite(26,HIGH);//左下 1
digitalWrite(21,HIGH);//左上 1
delay(5);
;}
if("%02d",tm->tm_hour ==12 ){
digitalWrite(13,HIGH);//1桁目 1
digitalWrite(17,LOW);//2桁目 0
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 1
digitalWrite(16,LOW);//右上 1
digitalWrite(22,HIGH);//中段 1
digitalWrite(23,HIGH);//上段 1
digitalWrite(27,HIGH);//下段 1
digitalWrite(26,HIGH);//左下 1
digitalWrite(21,HIGH);//左上 1
delay(5);
digitalWrite(13,LOW);//1桁目 0
digitalWrite(17,HIGH);//2桁目 1
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,HIGH);//右下 2
digitalWrite(16,LOW);//右上 2
digitalWrite(22,LOW);//中段 2
digitalWrite(23,LOW);//上段 2
digitalWrite(27,LOW);//下段 2
digitalWrite(26,LOW);//左下 2
digitalWrite(21,HIGH);//左上 2
delay(5);
;}
if("%02d",tm->tm_hour ==13 ){
digitalWrite(13,HIGH);//1桁目 1
digitalWrite(17,LOW);//2桁目 0
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 1
digitalWrite(16,LOW);//右上 1
digitalWrite(22,HIGH);//中段 1
digitalWrite(23,HIGH);//上段 1
digitalWrite(27,HIGH);//下段 1
digitalWrite(26,HIGH);//左下 1
digitalWrite(21,HIGH);//左上 1
delay(5);
digitalWrite(13,LOW);//1桁目 0
digitalWrite(17,HIGH);//2桁目 1
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 3
digitalWrite(16,LOW);//右上 3
digitalWrite(22,LOW);//中段 3
digitalWrite(23,LOW);//上段 3
digitalWrite(27,LOW);//下段 3
digitalWrite(26,HIGH);//左下 3
digitalWrite(21,HIGH);//左上 3
delay(5);
;}
if("%02d",tm->tm_hour ==14 ){
digitalWrite(13,HIGH);//1桁目 1
digitalWrite(17,LOW);//2桁目 0
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 1
digitalWrite(16,LOW);//右上 1
digitalWrite(22,HIGH);//中段 1
digitalWrite(23,HIGH);//上段 1
digitalWrite(27,HIGH);//下段 1
digitalWrite(26,HIGH);//左下 1
digitalWrite(21,HIGH);//左上 1
delay(5);
digitalWrite(13,LOW);//1桁目 0
digitalWrite(17,HIGH);//2桁目 1
digitalWrite(18,LOW);//3桁目 0
digitalWrite(19,LOW);//4桁目 0
digitalWrite(25,LOW);//右下 4
digitalWrite(16,LOW);//右上 4
digitalWrite(22,LOW);//中段 4
digitalWrite(23,HIGH);//上段 4
digitalWrite(27,HIGH);//下段 4
digitalWrite(26,HIGH);//左下 4
digitalWrite(21,LOW);//左上 4
delay(5);
;}
以下略
こんな調子で1,2桁目を時間、3、4桁目を分にすれば一般的なデジタル時計ができる。
同時に1~4桁表示できないので5ミリ秒ずつ表示をずらして残像で表示するダイナミック点灯方式の7セグメントを使用した。
これで指定のWi-Fi環境にあればズレるとなく時間を刻み続ける。 現在屋外照明のタイマーなどは何年もすればすぐずれてしまうが、IoT機器がどんどん増えていけば、正確にON、OFFができる様になるかもしれない。