大型NTP時計の初代がまた不調になったので、あきらめて新しく作ることにしました。
ESP32用のMicroPythonを使ったのが新しい点で、ntpの時刻でrtcをセットするのがとても簡単で感心しました。プログラムが書きやすいので、フォントデータの作り方をシンプルにできました。Apple2のフォントデータを使いました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
# wallClock4-240626.py Koji Ohashi 20240626 # Thanks to # https://www.microfan.jp/2023/10/esp32-net-micropython/ # VCC, GND, IO16 import network, ntptime, utime, time import machine, neopixel import random from machine import RTC ssid = '****************' passwd = '*****************' JST_OFFSET = 9 * 60 * 60 # 9時間(32400秒) WIDTH = 32 HEIGHT = 8 LED_COUNT = 256 DAY_START = 7 DAY_END = 20 LED_BLACK = ( 0, 0, 0) NIGHT_COLOR = ( 10, 5, 0) font_pos = ( 0, 7, 13, 18, 25) rtc_flag = True rtc = RTC() np = neopixel.NeoPixel(machine.Pin(16), LED_COUNT) # Apple 2 font # https://github.com/Michaelangel007/apple2_hgr_font_tutorial NumFont0 = ( ( 0x1C, 0x22, 0x32, 0x2A, 0x26, 0x22, 0x1C, 0x00), #0 ( 0x08, 0x0C, 0x08, 0x08, 0x08, 0x08, 0x1C, 0x00), #1 ( 0x1C, 0x22, 0x20, 0x18, 0x04, 0x02, 0x3E, 0x00), #2 ( 0x3E, 0x20, 0x10, 0x18, 0x20, 0x22, 0x1C, 0x00), #3 ( 0x10, 0x18, 0x14, 0x12, 0x3E, 0x10, 0x10, 0x00), #4 ( 0x3E, 0x02, 0x1E, 0x20, 0x20, 0x22, 0x1C, 0x00), #5 ( 0x38, 0x04, 0x02, 0x1E, 0x22, 0x22, 0x1C, 0x00), #6 ( 0x3E, 0x20, 0x10, 0x08, 0x04, 0x04, 0x04, 0x00), #7 ( 0x1C, 0x22, 0x22, 0x1C, 0x22, 0x22, 0x1C, 0x00), #8 ( 0x1C, 0x22, 0x22, 0x3C, 0x20, 0x10, 0x0E, 0x00), #9 ( 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00)) #: #HSV形式からRGB形式に変換 #h = 0 ~ 360, s = 0 ~ 255, v = 0 ~ 255 #R=0 ~ 255, G=0 ~ 255, B=0 ~ 255, def hsv_to_rgb(h,s,v): i = int(h / 60.0) mx = v mn = v - ((s / 255.0) * v) if h is None: return(0,0,0) if i == 0: (r1,g1,b1) = (mx,(h/60.0)*(mx-mn)+mn,mn) elif i == 1: (r1,g1,b1) = (((120.0-h)/60.0)*(mx-mn)+mn,mx,mn) elif i == 2: (r1,g1,b1) = (mn,mx,((h-120.0)/60.0)*(mx-mn)+mn) elif i == 3: (r1,g1,b1) = (mn,((240.0-h)/60.0)*(mx-mn)+mn,mx) elif i == 4: (r1,g1,b1) = (((h-240.0)/60.0)*(mx-mn)+mn,mn,mx) elif 5 <= i: (r1,g1,b1) = (mx,mn,((360.0-h)/60.0)*(mx-mn)+mn) return (int(r1), int(g1), int(b1)) def vibrant_color( hour, minute, column): h = (hour - DAY_START) * 30 + minute / 2 + column * 4 h = h % 360 return hsv_to_rgb(h,255,50) def read_font(n): font_list = [] for j in range(8): sub_list = [] for i in range(7): sub_list.append(((NumFont0[n][j] >> (7 - i)) & 1)) font_list.append(sub_list) return font_list def wifi_connect(ssid, passwd): # アクセスポイントへの接続 wifi = network.WLAN(network.STA_IF) wifi.active(True) if not wifi.isconnected(): print('connecting to network...') wifi.connect(ssid, passwd) while not wifi.isconnected(): print('.',end='') time.sleep_ms(500) print() return wifi def set_rtc(): ntptime.settime() ut = utime.localtime(utime.time() + JST_OFFSET) rtc.datetime((ut[0], ut[1], ut[2], ut[6]+1, ut[3], ut[4], ut[5], 0)) def pix_pos( x, y): if ( x % 2 == 0): pos = x * HEIGHT + y else: pos = x * HEIGHT + ( ( HEIGHT - 1) - y) return pos def adjust_rtc( rtctime, flag ): if ((rtctime[5] == 0) and (flag == False)): set_rtc() flag = True if ((rtctime[5] != 0) and (flag == True)): flag = False return flag def clear_led(): for i in range( LED_COUNT): np[i] = LED_BLACK np.write() clear_led() wifi = wifi_connect(ssid, passwd) set_rtc() time_now = rtc.datetime() rtc_flag = False while True: time_now = rtc.datetime() rtc_flag = adjust_rtc( time_now, rtc_flag ) hour = time_now[4] minute = time_now[5] second = time_now[6] str_hour = f'{time_now[4]:02}' str_min = f'{time_now[5]:02}' time_list = ( int(str_hour[0]), int(str_hour[1]), 10, int(str_min[0]), int(str_min[1])) i = 0 for n in time_list: for y in range( 8): for x in range( 7): column = font_pos[i] + x pos = pix_pos( column, y) if (read_font(n)[y][6-x] != 0): if (DAY_START <= hour <= DAY_END): if (second < 45): np[pos] = vibrant_color( hour, minute, column) else: np[pos] = hsv_to_rgb(random.randint( 0, 360),255,50) else: np[pos] = NIGHT_COLOR else: np[pos] = LED_BLACK i = i + 1 np.write() time.sleep(0.1) |
7時から21時までは明るく表示します。0-45秒は時間ごとに変わるグラデーション表示で、45-0秒はドット毎にランダムな色で表示します。夜中はオレンジ色で暗く表示します。
今回購入したLEDマトリックスは1100円ぐらいでしたが、電源投入直後に全点灯する不具合がありました。しばらく様子見です。