4293269 ランダム
 ホーム | 日記 | プロフィール 【フォローする】 【ログイン】

ラジオ、ときどきラーメン2

ラジオ、ときどきラーメン2

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! --/--
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

PR

カレンダー

サイド自由欄




2018.04.26
XML
カテゴリ:Arduino

ESP-32(IoT Express)でMicroPython I2C LCD(SC1602系)でNTPクロック。
トラ技2017年11月号に掲載されていた白阪一郎氏のMicroPythonのサンプル製作記事でSC1602系パラレルI/F接続のLCDを使ったNTP時計の改造記事です。
手持ちのLCDがI2CのI/Fに改造したものしか無かったため、それを使えるようにMicroPythoでI2C接続できるようにネットでググってライブラリ登録&コードを変更して動作できるようにしました。


コードを転送後、μPyCraft上からこのようにDefault Runで起動するとスタンドアロンで動作させられるようにできます。


モバイルバッテリーで動作させてみた、の図。

とりあえず以下にコードを載せておきます。
白阪氏のパラレルLCD使用のサンプルコード(ntpclock_lcd.py)からの変更内容は、パラレルLCD用のコード(ドライバ部)を削除、esp8266_i2c_lcd.pyとlcd_api.pyのimport、
そして、mainにLCDへ表示するメソッドのコードを記述。


NtpClock_i2c_LCD.py

#ここから



  1. '''

  2.  *category Micropython application

  3.  *package NTP CLOCK for I2CLCD(SC1602&PCF8574)

  4.  *author Ichiro Shirasaka

  5.  *copyright 2017 Ichiro Shirasaka All Rights Reserved

  6.  *UpDated for I2CLCD 2018/04/25

  7. '''

  8.  

  9. from time import sleep_ms, ticks_ms

  10. from machine import I2C, Pin

  11. from esp8266_i2c_lcd import I2cLcd


  12. # The PCF8574 has a jumper selectable address: 0x20 - 0x27

  13. DEFAULT_I2C_ADDR = 0x27

  14. #Convert local time

  15. def localtime(esptime):

  16.     global year,mon,day,hour,min,sec

  17.     esptime +=9*3600 #GMT -> JST

  18.     month1 = (31,28,31,30,31,30,31,31,30,31,30,31)

  19.     month2 = (31,29,31,30,31,30,31,31,30,31,30,31)


  20.     date = esptime // 86400

  21.     time = esptime % 86400


  22.     r1 = date % 1461

  23.     y1 = date // 1461

  24.     if r1 >= 366 :

  25.         r2 = (r1-366) % 365

  26.         y2 = (r1-366) // 365 + 1

  27.         year = y1*4 + y2 + 2000

  28.         for n in range(12):

  29.             if r2 - month1[n] < 0:

  30.                 mon = n+1

  31.                 break

  32.             r2 -= month1[n]

  33.         day = r2 + 1

  34.     else:

  35.         year = y1*4 + 2000

  36.         for n in range(12):

  37.             if r1 - month2[n] < 0:

  38.                 mon = n+1

  39.                 break

  40.             r1 -= month1[n]

  41.         day = r1

  42.     hour = time // 3600

  43.     min = (time % 3600) // 60

  44.     sec = time % 3600 % 60


  45. #calculate day of week

  46. def wday(year, mon, day):

  47.     week = "Sun","Mon","Tue","Wed","Thu","Fri","Sat"

  48.     if(mon < 3 ):

  49.         year -= 1

  50.         mon += 12

  51.     return week[int((year + year/4 - year/100 + year/400 + (13 * mon + 8)/5 + day)%7)]


  52. try:

  53.     import usocket as socket

  54. except:

  55.     import socket

  56. try:

  57.     import ustruct as struct

  58. except:

  59.     import struct


  60. NTP_DELTA = 3155673600 #2000.1.1 0:0:0

  61. host = 'ntp.nict.jp'


  62. #Connect by Station mode

  63. def do_connect():

  64.     import network

  65.     sta_if = network.WLAN(network.STA_IF)

  66.     if not sta_if.isconnected():

  67.         print('connecting to network...')

  68.         sta_if.active(True)

  69.         sta_if.connect('SSID12345678','Password12345678')


  70.         while not sta_if.isconnected():

  71.             pass

  72.     print('network config:', sta_if.ifconfig())


  73. #Get time from NTP server

  74. def ttime():

  75.     NTP_QUERY = bytearray(48)

  76.     NTP_QUERY[0] = 0x1b

  77.     addr = socket.getaddrinfo(host, 123)[0][-1]

  78.     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

  79.     s.settimeout(1)

  80.     res = s.sendto(NTP_QUERY, addr)

  81.     msg = s.recv(48)

  82.     s.close()

  83.     val = struct.unpack("!I", msg[40:44])[0]

  84.     return val - NTP_DELTA


  85. #NTP Clock Main process

  86. rtc_time = 0

  87. do_connect()

  88. rtc_time = ttime()#"""Test function for verifying basic functionality."""

  89. print("Running test_main")

  90. #lcd_init()

  91. i2c = I2C(scl=Pin(22), sda=Pin(21), freq=100000)

  92. lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16)

  93. lcd.putstr("LCD is Works!")

  94. sleep_ms(3000)

  95. lcd.clear()

  96. while True:

  97.     tick = ticks_ms()

  98.     if tick % 1000 == 0:

  99.         rtc_time += 1

  100.         localtime(rtc_time)

  101.         lcd.move_to(0, 0)

  102.         lcd.putstr("%4d/%2d/%2d (%s)" % (year, mon, day, wday(year, mon, day)))


  103.         print("%4d/%2d/%2d (%s)" % (year, mon, day, wday(year, mon, day)))

  104.         lcd.move_to(0, 1)

  105.         lcd.putstr(" %2d:%02d:%02d" % (hour, min, sec))


  106.         print(" %2d:%02d:%02d" % (hour, min, sec))

  107.         if sec == 0 and min == 0:

  108.             rtc_time = ttime()

  109.             print('get time')



#ここまで





お気に入りの記事を「いいね!」で応援しよう

最終更新日  2018.04.28 17:02:56
コメント(0) | コメントを書く
[Arduino] カテゴリの最新記事



© Rakuten Group, Inc.