首页 > 解决方案 > 使用 Python 将传感器数据添加到列表中

问题描述

我正在做一个项目,我试图将传感器数据(温度、湿度等)存储在列表中。我的程序是用 python 编写的(我还是 Python 新手)。我将以各种速率获取传感器样本。我希望将十个最近的传感器样本存储在一个列表中,并取十个值的平均值。这将有助于平滑来自传感器的数据。

我无法让它按照我想要的方式正确工作。我的输出不断将一个传感器读数附加到我的列表末尾,而且只有一个。我希望它不断推出旧数据并将新数据带入列表。例如,如果给定的传感器只采集了十个样本,那么列表将如下所示 [1,2,3,4,5,6,7,8,9,10] ,那么第 11 个样本将来自传感器,它将变为 [2,3,4,5,6,7,8,9,10,11] ,然后是第 12 个 [3,4,5,6,7,8,9,10,11, 12],以此类推。任何帮助将不胜感激!

这是我试图用来将传感器数据附加到列表中的代码,让该列表仅包含十个最近的样本,并定期计算这十个样本的移动平均值。

import time
import spidev

def getReading(channel):
  rawData = spi.xfer([1,(8+channel)<<4,0])
  processesData = (rawData[1]&3)<<8)+rawData[2]
  return processedData

voltage = (getReading(7)/1023.0)*3.3
readings = []
reading = round(voltage, 2)
max_samples = 10

def mean(nums):
  return float(sum(nums)) / max(len(nums), 1)

avg = mean(readings)

while True:
  print ('current average = ' , avg)
  print ('readings used for average' , readings)
  
  readings.append(reading) 

  if len(readings) == max_samples:
    readings.pop(0)
  
  print ('readings saved for next time:' , readings)
  
  time.sleep(10)

标签: python

解决方案


如果您每次都想要一个新的读数,那么对 getReading 的调用不应该在循环中吗?就像是:

import time
import spidev

def getReading(channel):
  rawData = spi.xfer([1,(8+channel)<<4,0])
  processesData = (rawData[1]&3)<<8)+rawData[2]
  return processedData


readings = []
max_samples = 10

def mean(nums):
  return float(sum(nums)) / max(len(nums), 1)



while True:
  voltage = (getReading(7)/1023.0)*3.3
  reading = round(voltage, 2)
  readings.append(reading) 

  avg = mean(readings)     

  print ('current average = ' , avg)
  print ('readings used for average' , readings)

  if len(readings) == max_samples:
    readings.pop(0)
  
  print ('readings saved for next time:' , readings)
  
  time.sleep(10)

推荐阅读