将while循环中的变量结果存储到字典(python)

时间:2017-01-26 14:54:44

标签: python while-loop raspberry-pi

我有一个在树莓派上运行的程序,其中有2个输入,1Hz信号和50Hz信号。我正在记录从50Hz信号的上升沿到1Hz信号的上升沿经过的时间,然后计算相位差。我想用键表示50Hz波形上升沿的当前时间,该值是相对于1Hz信号的相位差。

这是我的代码:

import pigpio
import time
import math
from datetime import datetime

counter = 0 
1HZ_PIN = 23
50HZ_PIN = 24
pi = pigpio.pi()
d = {}

pi.set_mode(1HZ_PIN, pigpio.INPUT)
pi.set_pull_up_down(1HZ_PIN, pigpio.PUD_UP)
pi.set_mode(50HZ_PIN, pigpio.INPUT)
pi.set_pull_up_down(50HZ, pigpio.PUD_UP)

while True:
    if pi.wait_for_edge(1HZ_PIN, pigpio.RISING_EDGE):
        print 'PPS Rising edge'
        t1 = datetime.now()
        print t1
        counter = 0

        while pi.wait_for_edge(50HZ_PIN, pigpio.RISING_EDGE) and counter <50):
             d = {}
             counter = counter + 1
             print 'Voltage Sinusoid rising edge'
             print datetime.now()
             x = datetime.now()
             x.isoformat() # I added this line as you can't place datetime objects in a dictionary
             elapsed_time = x - t1
             elapsed_time_float = elapsed_time.total_seconds() # can't prerform arithmetic operations on datetime object
             phase = elapsed_time_float / 0.02/360
             d[x] = phase

我假设的最后一行将每个记录的上升沿时间作为键,相应的相位差作为值。但是当我按照预期打印列表中的50个键/值对时,它们与打印的上升沿时间不匹配。有没有一种正确的方法将变量从这个while循环放入字典?

2 个答案:

答案 0 :(得分:1)

我认为您正在打印日期时间值:

print 'Voltage Sinusoid rising edge'
print datetime.now()

然后再次计算并将其保存在变量中:

x = datetime.now()

这两次可能会有所不同。将其更改为:

x = datetime.now()
print x

应该有效,你应该得到匹配的打印和保存时间。

答案 1 :(得分:0)

我相信@ user3811623有正确的答案。我也想指出 -

  • 正如@JerryStratton所提到的,你只是通过应用x.isoformat()来改变x的值,因为你想要将值也分配给x -

x = x.isoformat()

  • 字典键不按时间顺序排序,以保持您想要的键输入顺序 -

https://docs.python.org/3/library/collections.html#collections.OrderedDict

  • 我觉得很奇怪你在字典中获得50个值,因为你在循环中启动它,从而重置它。

例如,这 -

while true:
    d={}
    x=raw_input('> ')
    d[k]=k
    if k=='s':
        break

> t
> y
> u
> s

产量

>>>d
{'s': 's'}

不知道你在这里如何获得50把钥匙。