Ваш скрипт не работает для меня, поэтому я просто добавлю код, который вам нужно понять.
Ваш скрипт выполняет не в режиме реального времени, а обрабатывает данные в пакетном режиме со значениями размера 500. Я изменил скрипт для обновления графиков в реальном времени.
Я использовал deque. Я создал из deque буфер размером 500, поэтому, если вы продолжите добавлять его слева, он автоматически вытолкнет старые значения, поэтому, если вы продолжите чертить его, он будет выглядеть в реальном времени.
После того, как вы получите новое значение и до того, как будете наносить данные на график каждый цикл, у вас есть время для выполнения фильтрации - например, с помощью метода грубой зернистости (вам нужно его запрограммировать), или вы просто продолжаете делать усреднение на основе нескольких предыдущих значений.
Ваш модифицированный код
import matplotlib.pyplot as plt
import numpy as np
import spidev, time
import RPi.GPIO as GPIO
from collections import deque
# read adc function
def analog_read(channel):
r = spi.xfer2([1,(8+channel)<<4,0])
adc_out = ((r[1]&3) << 8) + r[2]
return adc_out
spi = spidev.SpiDev()
spi.open(0,0)
fig = plt.figure()
ax = fig.add_subplot(111)
x = np.arange(500)
x = x.tolist()
y=[0 for iii in range(500)]
li, = ax.plot(x, y)
plt.ylim([0,3.3])
fig.canvas.draw()
plt.show(block=False)
# convert adc function
voltage_series = deque([],maxlen=500)
x_axis = x.tolist()
#fill it
for i in range(500):
voltage_series.append(0)
# Y-axis = voltage_series
# X-axis = x_axis
counter = 0
while True: # grapg updates every read
time.sleep(0.05)
reading = analog_read(0)
voltage = reading * 3.3 / 4096
vv=("%3.3f" % (voltage))
voltage_series.appendleft(voltage)
if counter%500==0:
### Time to realtime filtering
voltage_for_filtering = list(voltage_series)
# transfor to numpy for example np.array(voltage_for_filtering)
# or do standard method for smoothing noise - coarse graining
# voltage_for_filtering = coarse_grain(voltage_for_filtering) -->> example
li.set_ydata(voltage_for_filtering)
fig.canvas.draw()