raspberry pi pico 用 micropython 获取当前时间(辉光管用)(可联网/不联网最好)
本帖最后由 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('wifiing......')
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,mytime,mytime,mytime+8,mytime,mytime)
alllist = list(mytime)
#print(alllist)
print(alllist[-8], end = '')
print(alllist[-7])
time0 = mytime.split(' ')
time_date = time0
time_time = time0
time_hour_etc = time_time.split(':')
hour_full = int(time_hour_etc)
print (time_hour_etc)
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 =
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()
分隔符部分有时运行太慢,有无其他方式获取时间?
或能优化提高成功率也好。 您可以尝试对代码进行优化,以提高执行速度和成功率。以下是一些可能的优化建议:
1. 尽量减少网络操作次数:目前代码中在连接 WiFi 和校准时间时都使用了循环等待的方式,可以考虑设置最大等待时间或增加超时机制,以避免无限等待。另外,可以将网络操作放在程序开头执行,这样可以在后续代码中直接使用校准后的时间,而无需每次循环都进行校准。
2. 避免重复操作:将重复执行的操作移出循环。例如,将wifi_main()函数调用移到主循环之外,这样只需要在程序开始时连接一次 WiFi 即可。
3. 使用更高效的方法处理时间:使用内置的time.localtime()函数获取当前时间,而不是在主循环中反复调用。此外,您还可以尝试使用其他库或方法来获取当前时间,比如使用 MicroPython 的 RTC(Real-Time Clock)模块。
4. 简化代码逻辑:您的代码片段中有一部分用于将小时转换为二进制,并取出各个位上的数字。如果只是希望将十进制的小时转换为二进制,并提取各位数字,可以使用位运算来实现,而无需将其转换为字符串再进行切片和转换操作。
5. 选择合适的数据结构和算法:根据实际需求,选择适当的数据结构和算法可以提高代码的执行效率。例如,如果您只需要获取小时的二进制表示中的各个位数字,可以考虑使用位运算和位掩码来直接提取数字,而无需将其转换为字符串再转换回数字。
请注意,具体的优化方式取决于您的需求和代码的结构。建议您逐步尝试这些优化方法,并根据实际情况进行调整和改进。
如果问题已经解决,请设置最佳答案 在代码中,加粗的部分涉及时间校准和设置时间。使用 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('wifiing......')
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, t, t, t, t, t)
print("获取时间成功")
except Exception as e:
print("获取时间失败")
mytime = time.localtime()
mytime = "{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format(mytime, mytime, mytime, mytime + 8, mytime, mytime)
print(mytime)
time0 = mytime.split(' ')
time_date = time0
time_time = time0
time_hour_etc = time_time.split(':')
hour_full = int(time_hour_etc)
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 =
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可以更准确地获取时间,尤其是当网络不稳定或无网络连接时。 在你的代码中,你使用了ntptime.settime()函数来从网络中获取当前时间。然而,这种方式有时会运行得比较慢,并且可能会失败。你可以尝试以下几种方式来改进和优化获取时间的过程:
使用实时时钟(RTC)模块:将一个实时时钟模块(例如DS3231)连接到你的Raspberry Pi Pico,并使用它来获取准确的当前时间。这样不依赖于网络连接,可以提高成功率和响应速度。
使用本地系统时间:如果你的Raspberry Pi Pico与主机(如电脑)连接,可以通过串行通信将当前时间传输给Pico。主机计算机上运行的程序可以从系统时钟获取时间,并将其发送给Pico。
缓存时间:当成功获取到时间后,将其保存在变量中或者在文件系统中进行缓存。然后,在下一次启动Pico时,先检查缓存中的时间,如果时间尚未过期,则可以使用缓存的时间而无需重新从网络获取。
调整超时时间:在调用ntptime.settime()函数之前,可以尝试调整等待的超时时间,以减少等待时间。可以使用network.settimeout()函数设置超时时间,例如wifi.settimeout(5),将超时时间设置为5秒。
请注意,这些方法都是一种改进和优化的尝试,结果可能因多种因素而有所不同。你可以尝试使用其中的一个或多个方法,看是否能够提高获取时间的成功率和速度。 ok, 谢谢大家,已购rtc模块
页:
[1]