鱼C论坛

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

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

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

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

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

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



  4. def wifi_main():
  5.     global inif
  6.     wifi=network.WLAN(network.STA_IF)        #WIFI模式
  7.     if not wifi.isconnected():
  8.         #print('wifi  ing......')
  9.         wifi.active(True)
  10.         wifi.connect('xxxx','password')  #连接WIFI
  11.         
  12.         
  13.         
  14.         while not wifi.isconnected():
  15.             pass
  16.     print('Wifi connection succeeded')
  17.     print('network config:', wifi.ifconfig())
  18. wifi_main()
  19. while True:   #时间校准



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


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

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






  36. time0 = mytime.split(' ')

  37. time_date = time0[0]
  38. time_time = time0[1]

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

  42. if hour_full > 12:
  43.     #print(hour_full - 12)
  44.     print(bin(hour_full - 12))

  45. else:
  46.     print(hour_full)
  47.    
  48.    
  49. decimal_num = hour_full - 12



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


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

  54. print(listn)
  55. try:
  56.     n1 = listn[-1]
  57. except:
  58.     n1 =0
  59. try:
  60.     n3 = listn[-3]
  61. except:
  62.     n3 =0
  63. try:
  64.     n2 = listn[-2]
  65. except:
  66.     n2 =0
  67. try:
  68.     n4 = listn[-4]
  69. except:
  70.     n4 =0


  71. print(n4, n3, n2, n1)


  72. led1 = Pin(21, Pin.OUT)
  73. led2 = Pin(20, Pin.OUT)
  74. led3 = Pin(19, Pin.OUT)
  75. led4 = Pin(18, Pin.OUT)
  76. while True:
  77.     if n4 > 0:
  78.         led1.on()
  79.     else:
  80.         led1.off()
  81.     if n3 > 0:
  82.         led2.on()
  83.     else:
  84.         led2.off()
  85.     if n2 > 0:
  86.         led3.on()
  87.     else:
  88.         led3.off()
  89.     if n1 > 0:
  90.         led4.on()
  91.     else:
  92.         led4.off()


复制代码



分隔符部分有时运行太慢,有无其他方式获取时间?
或能优化提高成功率也好。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

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

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

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

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

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

使用道具 举报

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

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

以下是修改后的代码,使用DS3231模块获取当前时间:

  1. import time
  2. import network
  3. from machine import Pin, I2C
  4. from ds3231 import DS3231  # 假设你已经安装了ds3231库

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

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

  16. wifi_main()

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

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

  27. print(mytime)

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

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

  33. if hour_full > 12:
  34.     print(bin(hour_full - 12))
  35. else:
  36.     print(hour_full)

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

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

  42. print(listn)

  43. try:
  44.     n1 = listn[-1]
  45. except:
  46.     n1 = 0
  47. try:
  48.     n3 = listn[-3]
  49. except:
  50.     n3 = 0
  51. try:
  52.     n2 = listn[-2]
  53. except:
  54.     n2 = 0
  55. try:
  56.     n4 = listn[-4]
  57. except:
  58.     n4 = 0

  59. print(n4, n3, n2, n1)

  60. led1 = Pin(21, Pin.OUT)
  61. led2 = Pin(20, Pin.OUT)
  62. led3 = Pin(19, Pin.OUT)
  63. led4 = Pin(18, Pin.OUT)
  64. while True:
  65.     if n4 > 0:
  66.         led1.on()
  67.     else:
  68.         led1.off()
  69.     if n3 > 0:
  70.         led2.on()
  71.     else:
  72.         led2.off()
  73.     if n2 > 0:
  74.         led3.on()
  75.     else:
  76.         led3.off()
  77.     if n1 > 0:
  78.         led4.on()
  79.     else:
  80.         led4.off()
复制代码


请注意,这里假设你已经安装了名为 ds3231 的库。这样修改后的代码应该更稳定,无需依赖网络连接,可以提高成功率并减少等待时间。同时,使用RTC可以更准确地获取时间,尤其是当网络不稳定或无网络连接时。
小甲鱼最新课程 -> https://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秒。

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

使用道具 举报

 楼主| 发表于 2023-7-31 20:32:19 | 显示全部楼层
ok, 谢谢大家,已购rtc模块
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 04:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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