鱼C论坛

 找回密码
 立即注册
查看: 1637|回复: 4

raspberry pi pico 用 micropython 获取当前时间(辉光管用)(可联网/不联网最好)

[复制链接]
发表于 2023-7-30 17:16:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 maker_tinker 于 2023-7-30 17:22 编辑
import time,ntptime,network
import re
from machine import Pin



def wifi_main():
    global inif
    wifi=network.WLAN(network.STA_IF)        #WIFI模式
    if not wifi.isconnected():
        #print('wifi  ing......')
        wifi.active(True)
        wifi.connect('xxxx','password')  #连接WIFI
        
        
        
        while not wifi.isconnected():
            pass
    print('Wifi connection succeeded')
    print('network config:', wifi.ifconfig())
wifi_main()
while True:   #时间校准



#---------------------------------------------分隔符部分有时运行太慢,有无其他方式获取时间?或能优化提高成功率也好。
    try:
        #print('time ing')
        ntptime.settime()
        #print('time ok')
        break;
    except:
        print('time no')
        time.sleep(1)
#---------------------------------------------


mytime=time.localtime()
mytime='%d-%d-%d %d:%d:%d'%(mytime[0],mytime[1],mytime[2],mytime[3]+8,mytime[4],mytime[5])
alllist = list(mytime)
#print(alllist)

print(alllist[-8], end = '')
print(alllist[-7])






time0 = mytime.split(' ')

time_date = time0[0]
time_time = time0[1]

time_hour_etc = time_time.split(':')
hour_full = int(time_hour_etc[0])
print (time_hour_etc[0])

if hour_full > 12:
    #print(hour_full - 12)
    print(bin(hour_full - 12))

else:
    print(hour_full)
    
    
decimal_num = hour_full - 12



binary_num = "{0:b}".format(decimal_num)
print(binary_num)


num = binary_num
listn = [int(i) for i in str(num)]

print(listn)
try:
    n1 = listn[-1]
except:
    n1 =0
try:
    n3 = listn[-3]
except:
    n3 =0
try:
    n2 = listn[-2]
except:
    n2 =0
try:
    n4 = listn[-4]
except:
    n4 =0


print(n4, n3, n2, n1)


led1 = Pin(21, Pin.OUT)
led2 = Pin(20, Pin.OUT)
led3 = Pin(19, Pin.OUT)
led4 = Pin(18, Pin.OUT)
while True:
    if n4 > 0:
        led1.on()
    else:
        led1.off()
    if n3 > 0:
        led2.on()
    else:
        led2.off()
    if n2 > 0:
        led3.on()
    else:
        led3.off()
    if n1 > 0:
        led4.on()
    else:
        led4.off()


分隔符部分有时运行太慢,有无其他方式获取时间?
或能优化提高成功率也好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-30 17:17:08 | 显示全部楼层
您可以尝试对代码进行优化,以提高执行速度和成功率。以下是一些可能的优化建议:

1. 尽量减少网络操作次数:目前代码中在连接 WiFi 和校准时间时都使用了循环等待的方式,可以考虑设置最大等待时间或增加超时机制,以避免无限等待。另外,可以将网络操作放在程序开头执行,这样可以在后续代码中直接使用校准后的时间,而无需每次循环都进行校准。

2. 避免重复操作:将重复执行的操作移出循环。例如,将wifi_main()函数调用移到主循环之外,这样只需要在程序开始时连接一次 WiFi 即可。

3. 使用更高效的方法处理时间:使用内置的time.localtime()函数获取当前时间,而不是在主循环中反复调用。此外,您还可以尝试使用其他库或方法来获取当前时间,比如使用 MicroPython 的 RTC(Real-Time Clock)模块。

4. 简化代码逻辑:您的代码片段中有一部分用于将小时转换为二进制,并取出各个位上的数字。如果只是希望将十进制的小时转换为二进制,并提取各位数字,可以使用位运算来实现,而无需将其转换为字符串再进行切片和转换操作。

5. 选择合适的数据结构和算法:根据实际需求,选择适当的数据结构和算法可以提高代码的执行效率。例如,如果您只需要获取小时的二进制表示中的各个位数字,可以考虑使用位运算和位掩码来直接提取数字,而无需将其转换为字符串再转换回数字。

请注意,具体的优化方式取决于您的需求和代码的结构。建议您逐步尝试这些优化方法,并根据实际情况进行调整和改进。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-30 17:17:10 | 显示全部楼层
在代码中,加粗的部分涉及时间校准和设置时间。使用 ntptime.settime() 进行时间校准时可能会因为网络连接问题而导致运行较慢或失败。我们可以尝试使用更稳定的方式来获取当前时间。

一个较好的方法是使用RTC(实时时钟)来获取时间。这样可以不依赖于网络连接,提高成功率并减少时间校准的等待时间。Raspberry Pi Pico并没有内置RTC,但可以通过外部模块,如DS3231,来实现。

以下是修改后的代码,使用DS3231模块获取当前时间:
import time
import network
from machine import Pin, I2C
from ds3231 import DS3231  # 假设你已经安装了ds3231库

def wifi_main():
    global inif
    wifi = network.WLAN(network.STA_IF)  # WIFI模式
    if not wifi.isconnected():
        # print('wifi  ing......')
        wifi.active(True)
        wifi.connect('xxxx', 'password')  # 连接WIFI

    while not wifi.isconnected():
        pass
    print('Wifi connection succeeded')
    print('network config:', wifi.ifconfig())

wifi_main()

i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=100000)  # 根据实际引脚连接调整

try:
    rtc = DS3231(i2c)
    t = rtc.datetime()
    mytime = "{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format(t[0], t[1], t[2], t[4], t[5], t[6])
    print("获取时间成功")
except Exception as e:
    print("获取时间失败")
    mytime = time.localtime()
    mytime = "{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format(mytime[0], mytime[1], mytime[2], mytime[3] + 8, mytime[4], mytime[5])

print(mytime)

time0 = mytime.split(' ')
time_date = time0[0]
time_time = time0[1]

time_hour_etc = time_time.split(':')
hour_full = int(time_hour_etc[0])

if hour_full > 12:
    print(bin(hour_full - 12))
else:
    print(hour_full)

decimal_num = hour_full - 12
binary_num = "{0:b}".format(decimal_num)
print(binary_num)

num = binary_num
listn = [int(i) for i in str(num)]

print(listn)

try:
    n1 = listn[-1]
except:
    n1 = 0
try:
    n3 = listn[-3]
except:
    n3 = 0
try:
    n2 = listn[-2]
except:
    n2 = 0
try:
    n4 = listn[-4]
except:
    n4 = 0

print(n4, n3, n2, n1)

led1 = Pin(21, Pin.OUT)
led2 = Pin(20, Pin.OUT)
led3 = Pin(19, Pin.OUT)
led4 = Pin(18, Pin.OUT)
while True:
    if n4 > 0:
        led1.on()
    else:
        led1.off()
    if n3 > 0:
        led2.on()
    else:
        led2.off()
    if n2 > 0:
        led3.on()
    else:
        led3.off()
    if n1 > 0:
        led4.on()
    else:
        led4.off()

请注意,这里假设你已经安装了名为 ds3231 的库。这样修改后的代码应该更稳定,无需依赖网络连接,可以提高成功率并减少等待时间。同时,使用RTC可以更准确地获取时间,尤其是当网络不稳定或无网络连接时。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-7-30 22:36:28 | 显示全部楼层
在你的代码中,你使用了ntptime.settime()函数来从网络中获取当前时间。然而,这种方式有时会运行得比较慢,并且可能会失败。你可以尝试以下几种方式来改进和优化获取时间的过程:

使用实时时钟(RTC)模块:将一个实时时钟模块(例如DS3231)连接到你的Raspberry Pi Pico,并使用它来获取准确的当前时间。这样不依赖于网络连接,可以提高成功率和响应速度。

使用本地系统时间:如果你的Raspberry Pi Pico与主机(如电脑)连接,可以通过串行通信将当前时间传输给Pico。主机计算机上运行的程序可以从系统时钟获取时间,并将其发送给Pico。

缓存时间:当成功获取到时间后,将其保存在变量中或者在文件系统中进行缓存。然后,在下一次启动Pico时,先检查缓存中的时间,如果时间尚未过期,则可以使用缓存的时间而无需重新从网络获取。

调整超时时间:在调用ntptime.settime()函数之前,可以尝试调整等待的超时时间,以减少等待时间。可以使用network.settimeout()函数设置超时时间,例如wifi.settimeout(5),将超时时间设置为5秒。

请注意,这些方法都是一种改进和优化的尝试,结果可能因多种因素而有所不同。你可以尝试使用其中的一个或多个方法,看是否能够提高获取时间的成功率和速度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-31 20:32:19 | 显示全部楼层
ok, 谢谢大家,已购rtc模块
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 07:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表