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

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

PR

カレンダー

サイド自由欄




2018.04.26
XML
カテゴリ: Arduino


トラ技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. from time import sleep_ms, ticks_ms

  9. from machine import I2C, Pin

  10. from esp8266_i2c_lcd import I2cLcd


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

  12. DEFAULT_I2C_ADDR = 0x27

  13. #Convert local time

  14. def localtime(esptime):

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

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

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

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


  19.     date = esptime // 86400

  20.     time = esptime % 86400


  21.     r1 = date % 1461

  22.     y1 = date // 1461

  23.     if r1 >= 366 :

  24.         r2 = (r1-366) % 365

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

  26.         year = y1*4 + y2 + 2000

  27.         for n in range(12):

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

  29.                 mon = n+1

  30.                 break

  31.             r2 -= month1[n]

  32.         day = r2 + 1

  33.     else:

  34.         year = y1*4 + 2000

  35.         for n in range(12):

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

  37.                 mon = n+1

  38.                 break

  39.             r1 -= month1[n]

  40.         day = r1

  41.     hour = time // 3600

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

  43.     sec = time % 3600 % 60


  44. #calculate day of week

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

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

  47.     if(mon < 3 ):

  48.         year -= 1

  49.         mon += 12

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


  51. try:

  52.     import usocket as socket

  53. except:

  54.     import socket

  55. try:

  56.     import ustruct as struct

  57. except:

  58.     import struct


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

  60. host = 'ntp.nict.jp'


  61. #Connect by Station mode

  62. def do_connect():

  63.     import network

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

  65.     if not sta_if.isconnected():

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

  67.         sta_if.active(True)

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


  69.         while not sta_if.isconnected():

  70.             pass

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


  72. #Get time from NTP server

  73. def ttime():

  74.     NTP_QUERY = bytearray(48)

  75.     NTP_QUERY[0] = 0x1b

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

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

  78.     s.settimeout(1)

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

  80.     msg = s.recv(48)

  81.     s.close()

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

  83.     return val - NTP_DELTA


  84. #NTP Clock Main process

  85. rtc_time = 0

  86. do_connect()

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

  88. print( "Running test_main" )

  89. #lcd_init()

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

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

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

  93. sleep_ms(3000)

  94. lcd.clear()

  95. while True:

  96.     tick = ticks_ms()

  97.     if tick % 1000 == 0:

  98.         rtc_time += 1

  99.         localtime(rtc_time)

  100.         lcd.move_to(0, 0)

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


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

  103.         lcd.move_to(0, 1)

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


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

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

  107.             rtc_time = ttime()

  108.             print( 'get time' )



#ここまで





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

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


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

© Rakuten Group, Inc.
X
Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: