
もう一台、Wifiで時刻合わせする時計を作りました。
秋月電子で7セグメント2桁LED10個が100円と安売りしていたので作ってみました。まだ8個も残っている・・・
赤外線リモコン用の受光部も付けてリモコンの信号を受信すると
日付を表示します。
マイコンは、Raspbarry Pi Pico Wを使用ました。
プログラムは、MicroPythonです。

主要使用部品
| マイコン | Raspberry Pi pico2 W | https://amzn.to/44hT4G2 | |
| 7seg LED | OSL2051A-LR | https://akizukidenshi.com/catalog/g/g112442/ | 店頭のみ特価販売品を購入 |
| 赤外線受光 | PL-IRM0101 | PL-IRM0101 | |
| ガラスケース | ダイソー |
# 薄型7seg x2 OSL2051A-LR Common Cathode type)
# 7-segment display layout
# LED
# A A = 6
# --- B = 9
# F | G | B C = 8
# --- D = 1
# E | | C E = 4
# --- F = 7
# D dp G = 3
# dp= 2
# Setting SWを押してながら電源を入れるとWifi設定が消去されます
#
import time
from network import (
WLAN,
STA_IF,
STAT_GOT_IP,
STAT_NO_AP_FOUND,
STAT_CONNECT_FAIL,
STAT_WRONG_PASSWORD,
)
from machine import Pin, Timer
from machine import reset
from wifi_setup import WifiConfig, WifiSetupPortal
import ntptime
#from LED7seg import init_LED
# 7SEG用フォント
global ledseg,font,dot,dat
dot = 0
ledseg = {}
font={}
font[0] = [0,1,1,1,1,1,0,1]
font[1] = [0,1,1,0,0,0,0,0]
font[2] = [0,1,0,0,1,1,1,1]
font[3] = [0,1,1,0,1,0,1,1]
font[4] = [0,1,1,1,0,0,1,0]
font[5] = [0,0,1,1,1,0,1,1]
font[6] = [0,0,1,1,1,1,1,1]
font[7] = [0,1,1,0,1,0,0,0]
font[8] = [0,1,1,1,1,1,1,1]
font[9] = [0,1,1,1,1,0,1,0]
s1=0
s2=0
s3=0
s4=0
time.sleep(5) #リセットの時間
sw1 = Pin(14, Pin.IN, Pin.PULL_UP)
sw1 = sw1.value()
#日本標準時(UTC+9時間)
UTC_OFFSET = 9
#NTPサーバ ドメイン
NTP_SRV = "ntp.nict.jp"
# タイマーを作成
disptimer = Timer()
def gpio_init():
global dot,ledseg,font,s1,s2,s3,s4,led0,led1,led2,led3,dot1,dot2
blink = machine.Pin("LED", machine.Pin.OUT) #内部LED
led0 = machine.Pin( 6, machine.Pin.OUT) #桁 common
led1 = machine.Pin(27, machine.Pin.OUT)
led2 = machine.Pin(15, machine.Pin.OUT)
led3 = machine.Pin(16, machine.Pin.OUT)
led0.value(0)
dot1 = machine.Pin(26 , machine.Pin.OUT)
dot2 = machine.Pin(20 , machine.Pin.OUT)
# 7SEG初期化
ledseg[1] = machine.Pin(10,machine.Pin.OUT)
ledseg[2] = machine.Pin(11,machine.Pin.OUT)
ledseg[3] = machine.Pin(12,machine.Pin.OUT)
ledseg[4] = machine.Pin(13,machine.Pin.OUT)
ledseg[5] = machine.Pin(18,machine.Pin.OUT)
ledseg[6] = machine.Pin(19,machine.Pin.OUT)
ledseg[7] = machine.Pin(21,machine.Pin.OUT)
# LEDを表示
def disp(timer):
t = 6 #表示時間
global dot,ledseg,font,s1,s2,s3,s4,led0,led1,led2,led3,dot
#1桁目
for a in range(1,8):
ledseg[a].value(font[s1][a])
led0.value(0)
if s1>0: # 時間1桁の場合表示しない
time.sleep_ms(t)
led0.value(1)
#2桁目
for a in range(1,8):
ledseg[a].value(font[s2][a])
dot = dot+1
if dot > 50:
dot2.value(1)
if dot >59:
dot = 0
led1.value(0)
time.sleep_ms(t)
dot2.value(0)
led1.value(1)
#3桁目
for a in range(1,8):
ledseg[a].value(font[s3][a])
led2.value(0)
time.sleep_ms(t)
led2.value(1)
#4桁目
for a in range(1,8):
ledseg[a].value(font[s4][a])
led3.value(0)
time.sleep_ms(t)
led3.value(1)
#【関数】NTPサーバから日時取得
def get_ntp_time():
#NTPサーバ
ntptime.server = NTP_SRV
#NTPサーバへの接続待ち
time.sleep(1)
#ローカル時刻をUTC標準時刻に同期
ntptime.settime()
#表示
print("Connected to NTP server.")
#print(tm)
#【関数】日付・時刻整形
def format_dttm(day_tm):
global dat
#日付
dat = ("%4d/%02d/%02d" % (day_tm[0:3]))
#時刻
tm = f'{ day_tm[3] :02}'+ f'{ day_tm[4] :02}'
#print(tm)
return tm
# 【関数】日付時刻を取得
def get_dattm():
#ローカル時刻
lcl_tm = time.localtime(time.mktime(time.localtime()) + UTC_OFFSET * 60 * 60)
#日付・時刻整形
tm = format_dttm(lcl_tm)
return tm
class IoTDevice:
def execute(self) -> None:
try:
if not WifiConfig().check():
print("start wifi setup portal") # Wifi 設定
WifiSetupPortal().execute()
else:
print("start iot device")
if not self._connect_wifi():
raise Exception("cannot connect wifi")
self._main_routine()
except Exception as e:
print(f"{e=}")
time.sleep(1)
reset()
def _connect_wifi(self) -> bool:
ssid: str
key: str
ssid, key = WifiConfig().get()
wlan: WLAN = WLAN(STA_IF)
wlan.active(True)
wlan.connect(ssid, key)
while True:
time.sleep(1)
status: int = wlan.status()
if status == STAT_NO_AP_FOUND or status == STAT_CONNECT_FAIL:
print("cannot connect wifi because incorrect password so wifi_config reset")
WifiConfig().delete()
reset()
break
elif status == STAT_WRONG_PASSWORD:
print("cannot connect wifi because incorrect password so wifi_config reset")
WifiConfig().delete()
reset()
break
elif status == STAT_GOT_IP:
print("cannot connect wifi")
return True
return False
#メイン
def _main_routine(self) -> None:
global s1,s2,s3,s4,sw1,dat
blink = machine.Pin("LED", machine.Pin.OUT)
irin = Pin( 2, Pin.IN)
print("Start main")
get_ntp_time()
gpio_init()
print ("タイマー開始")
disptimer.init(mode=Timer.PERIODIC, freq=60, callback=disp)
if sw1 ==0:
print("SW on Wifi Setting !!")
WifiConfig().delete()
reset()
else:
print("SW off")
while True:
ir =irin.value()
if ir ==0: # 赤外線リモコン信号検出
blink.value(1) # 5秒間日付を表示
s1 =int(dat[5])
s2 =int(dat[6])
s3 =int(dat[8])
s4 =int(dat[9])
time.sleep(5)
else:
blink.value(0)
#時刻取得
tm = get_dattm()
#時刻表示設定
s1 =int(tm[0])
s2 =int(tm[1])
s3 =int(tm[2])
s4 =int(tm[3])
if tm == "0201":
tm = get_ntp_time()
print(tm)
time.sleep(59)
if __name__ == "__main__":
IoTDevice().execute()
ネットワーク接続は、アクセスポイント接続してWebより設定するようにしています。
<<参考にしたホームページ>>
https://qiita.com/h0uk1st4r/items/e4428902e95ac9581e4a
