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

将while循环中的变量结果存储到字典(python),python,while-loop,raspberry-pi,Python,While Loop,Raspberry Pi,我有一个在raspberry pi上运行的程序,其中有两个输入,一个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

我有一个在raspberry pi上运行的程序,其中有两个输入,一个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
导入pigpio
导入时间
输入数学
从日期时间导入日期时间
计数器=0
1HZ_引脚=23
50HZ_引脚=24
pi=pigpio.pi()
d={}
pi.set_模式(1HZ_引脚,pigpio.INPUT)
pi.设置上下拉(1HZ引脚,pigpio.上拉)
pi.set_模式(50HZ_引脚,pigpio.INPUT)
pi.设置上下拉(50HZ,pigpio.上拉)
尽管如此:
如果pi.等待_边缘(1HZ_引脚,pigpio.上升_边缘):
打印“PPS上升沿”
t1=datetime.now()
打印t1
计数器=0

当pi.等待_边缘(50HZ_引脚,pigpio.上升_边缘)和计数器时,我认为您正在打印日期时间值:

print 'Voltage Sinusoid rising edge'
print datetime.now()
然后再次计算并将其保存在变量中:

x = datetime.now()
这两次可能不同。将其更改为:

x = datetime.now()
print x

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

我相信@user3811623有正确的答案。我还想指出——

  • 正如@JerryStratton所提到的,您不会仅仅通过应用x.isoformat()来更改x的值,因为您还希望将值赋回x-
x=x.isoformat()

  • 字典键不是按时间顺序排序的,为了保持键输入的顺序,您需要按顺序排列dict-

  • 我觉得奇怪的是,当你在循环中启动它,从而重置它时,你的字典中得到了50个值
例如:

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

屈服

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

不确定您在这里是如何得到50个键的。

快速注释:变量不能以
1HZ\u PIN
50HZ\u PIN
这样的数字开头。另一个快速注释:
x。isoformat()
不会将x转换为字符串。您需要将x.isoformat()的结果存储在另一个变量中。但是,您可以在Python中使用datetime对象作为键,这就是为什么您不会从错误中得到错误。您应该能够删除该行,而不会对代码产生任何影响。@Jerry Stratton我删除了该行,正如您所说,它没有任何影响,但为什么键与打印的上升沿时间不匹配。您希望我包括控制台的结果吗。字典里也没有键的顺序,因为我认为它们是按时间顺序排列的。不,键不是按时间顺序排列的。要以排序方式使用键,您需要拉动键并自行排序。您可以使用
variable=d.keys()。()
>>>d
{'s': 's'}