2017-01-26 3 views
0

У меня есть программа, работающая на малине pi, где есть 2 входа, 1 Гц и сигнал 50 Гц. Я записываю время, прошедшее от нарастающего фронта сигнала 50 Гц, к сигналу 1 Гц, а затем вычисляет разность фаз. Я хочу, чтобы ключ представлял текущее время нарастающего фронта 50Гц сигналов, а значение - разность фаз относительно сигнала 1 Гц.Сохранение переменных результатов из цикла while в словарь (python)

Вот мой код:

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 в словаре?

+3

Быстрое примечание: переменные не могут начинаться с числа, например '1HZ_PIN' или' 50HZ_PIN' –

+0

Еще одно примечание: 'x.isoformat()' не будет преобразовывать x в строку. Вам нужно сохранить результат x.isoformat() в другой переменной. Однако вы можете использовать объекты datetime как ключи в Python, поэтому вы не получаете ошибку из этой ошибки. Вы должны уметь удалить эту строку, не влияя на ваш код. –

+0

@Jerry Stratton Я удалил эту строку, и, как вы сказали, это не повлияло, но почему ключи не соответствуют возрастающим фронтам, которые печатаются. Вы хотите, чтобы я включил результат с консоли. В словаре также нет порядка с ключами, поскольку я предполагал, что они будут в хронологическом порядке. –

ответ

1

Я думаю, что вы печатаете значения даты и времени:

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

затем рассчитать его снова и сохранить его в переменной:

x = datetime.now() 

Эти два раза могут быть разными. Изменение его на:

x = datetime.now() 
print x 

должно работать, и вы должны получить соответствующее печатное и сохраненное время.

+0

Это сделало трюк, спасибо. –

0

Я считаю, что пользователь user3811623 имеет правильный ответ. Я также хотел бы отметить, -

  • Как @JerryStratton упоминалось, вы не измените значение х только путем применения x.isoformat(), для этого вам необходимо присвоить значение обратно х, а также -

x = x.isoformat()

  • ключей словаря не сортируется в хронологическом порядке, для хранения ключей порядка входящих вы хотите ordereddict -

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

  • Я нахожу любопытным, что вы получаете 50 valuess в словаре, как вы инициировать его внутри цикла, таким образом, сбросить его.

Например, this-

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

с

> t 
> y 
> u 
> s 

дает

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

Не знаете, как вы получаете 50 ключей здесь.

Смежные вопросы