Wifiデジタル時計②

Wifiデジタル時計②

2025年7月6日

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


主要使用部品

マイコン Raspberry Pi pico2 Whttps://amzn.to/44hT4G2
7seg LEDOSL2051A-LRhttps://akizukidenshi.com/catalog/g/g112442/店頭のみ特価販売品を購入
赤外線受光PL-IRM0101PL-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