MicroPython ESP32Http Get方法获取网络时间+OLED显示
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MicroPython ESP32Http Get方法获取网络时间+OLED显示相关的知识,希望对你有一定的参考价值。
【MicroPython ESP32】Http Get方法获取网络时间+OLed显示
-
效果演示
-
本示例基于
Thonny
平台开发。
通过Http请求Get方法获取有关时间戳数据,然后通过将json数据解析,和时间换算,最终得到网络时间。这个和NTP直接获取时间有差别。
可供调用的网络时间API接口
- 淘宝API接口:
http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp
"api":"mtop.common.getTimestamp","v":"*","ret":["SUCCESS::接口调用成功"],"data":"t":"1661059774686"
- 苏宁API接口;
http://quan.suning.com/getSysTime.do
(本示例未使用该接口来做数据做解析)
"sysTime2":"2022-08-21 13:31:51","sysTime1":"20220821133151"
显示部分
- 使用
ssd 1306
0.96" OLED屏幕来显示时间。 - 接线说明
0.96"OLED ----ESP32
SCL ---- 26
SDA ---- 25
- 运行调试代码前,需要将
ssd1306.py
保存到micropython设备上,在运行主代码。
ssd1306模块下载地址:
- 中文下载站:
https://www.cnpython.com/pypi/micropython-ssd1306/download
- 官方下载站:
https://pypi.org/project/micropython-ssd1306/
实例代码
import network
import machine
from machine import Pin
from machine import RTC
import urequests
import utime
import ujson
from ssd1306 import SSD1306_I2C
#从JSON字符串中提取时间戳
#注意由于计算精度问题时间戳最后3位不要
def getInfoFromJSONStr(jsonStr):
jo=ujson.loads(jsonStr)
timeStamp=jo["data"]
return int(timeStamp["t"][:-3])
#收数字转为字符串
#若数字不足两位补前导0
def fromNumToStr(n):
result=str(n)
if len(result)<2:
result="0"+result
return result
#将元组转换为时间字符串
#注意年份和时区自定义调整
def fromTurpleToTimeStr(tup):
return (str(tup[0]-30)+"-"+fromNumToStr(tup[1])+"-"+fromNumToStr(tup[2]),
fromNumToStr(tup[4]+8)+":"+fromNumToStr(tup[5])+":"+fromNumToStr(tup[6]))
#将utime时间元组转换为RTC时间元组
def convertTurple(tup):
return (tup[0],tup[1],tup[2],tup[6],tup[3],tup[4],tup[5],0)
#0.96 " I2C OLED屏
sda=Pin(25)
scl=Pin(26)
i2c=machine.I2C(0,sda=sda,scl=scl,freq=400000)
oled=SSD1306_I2C(128,64,i2c)
#调整亮度。0最暗,255最亮
oled.contrast(5)
#连接网络
station = network.WLAN(network.STA_IF)
while(not station.isconnected()):
station.active(True)
try:
station.connect("MERCURY_D268G", "pba5ayzk") # wifi网络信息
utime.sleep(5.0)
except OSError:
print("OSError")
utime.sleep(2.0)
#获取时间戳JSON
#苏宁API:http://quan.suning.com/getSysTime.do # 不能调用这个,json暂不匹配
# 淘宝API:http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp
response = urequests.get("http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp")
#将从JSON中提取的时间戳解析为日期时间信息元组
timeTup=utime.localtime(getInfoFromJSONStr(response.text))
#创建RTC对象
rtc=RTC()
#设置RTC时间
rtc.datetime(convertTurple(timeTup))
#不断循环显示实时时间
while True:
#基于日期时间信息元组生成显示所需的日期、时间字符串元组
timeNr=fromTurpleToTimeStr(rtc.datetime())
#清空屏幕
oled.fill(0)
#显示日期
oled.text(timeNr[0],26,20,1)
#显示时间
oled.text(timeNr[1],34,36,1)
#执行显示
oled.show()
#休眠
utime.sleep(0.3)
通过定时器中断,每隔5秒刷新一次更新,直接通过网络访问带时间的API接口路,解析json中的时间数据,作为OLED显示。舍弃上面这那种通过时间戳转换获取的当前时间。缺点是,不能更新频率太高,服务器容易被拒绝。
import network
import machine
from machine import Pin,Timer
from machine import RTC
import urequests
import utime
import ujson
from ssd1306 import SSD1306_I2C
led = Pin(2,Pin.OUT)
#interruptCounter = 0 #声明一个计数器
#从JSON字符串中提取时间戳:"sysTime2":"2022-08-21 13:31:51","sysTime1":"20220821133151"
# "api":"mtop.common.getTimestamp","v":"*","ret":["SUCCESS::接口调用成功"],"data":"t":"1661059774686"
#注意由于计算精度问题时间戳最后3位不要
def getInfoFromJSONStr(jsonStr):
jo=ujson.loads(jsonStr)
time_s=jo["sysTime2"]
return time_s
#0.96 " I2C OLED屏
sda=Pin(25)
scl=Pin(26)
i2c=machine.I2C(0,sda=sda,scl=scl,freq=400000)
oled=SSD1306_I2C(128,64,i2c)
#调整屏幕亮度。0最暗,255最亮
oled.contrast(5)
#连接网络
station = network.WLAN(network.STA_IF)
while(not station.isconnected()):
station.active(True)
try:
station.connect("MERCURY_D268G", "pba5ayzk") # wifi网络信息
utime.sleep(1.0)
except OSError:
print("OSError")
utime.sleep(2.0)
#获取时间戳JSON
#苏宁API:http://quan.suning.com/getSysTime.do # 不能调用这个,json暂不匹配
# 淘宝API:http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp
#response = urequests.get("http://quan.suning.com/getSysTime.do")
#将从JSON中提取的时间戳解析为日期时间信息元组
#timeTup=utime.localtime(getInfoFromJSONStr(response.text))
tim0 = Timer(0) #创建定时器对象 tim0~3 共四个类
def Updata_Time(timer): #定时器中断服务函数
#global interruptCounter
#interruptCounter +=1
response = urequests.get("http://quan.suning.com/getSysTime.do")
Date= getInfoFromJSONStr(response.text)
oled.fill(0)
#显示日期
oled.text(Date[0:10],26,20)
#显示时间
oled.text(Date[11:19],34,36)
#执行显示
oled.show()
#print('interruptCounter:',interruptCounter,end='\\n')
led.value(led.value()^1 )
#每隔5秒更新一次
tim0.init(period=5000, mode=Timer.PERIODIC, callback=Updata_Time) #周期性模式 最小单位为ms
以上是关于MicroPython ESP32Http Get方法获取网络时间+OLED显示的主要内容,如果未能解决你的问题,请参考以下文章