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显示的主要内容,如果未能解决你的问题,请参考以下文章

MicroPython ESP32扫描I2C设备地址

MicroPython ESP32 入网和udp数据接收通讯示例

MicroPython ESP32I2C功能使用介绍

ESP32 MicroPython开发之旅

ESP32 MicroPython开发之旅

MicroPython 和 ESP8266 http 服务器请求不完整