python - 使用 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)
解决方案
如果您每次都想要一个新的读数,那么对 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)
推荐阅读
- html - Angular 8 routerLink 无法正常工作
- java - 配置 RetryTemplate 以测试除 404 之外的所有失败代码
- angularjs - angularJs中与服务(api)的同步功能
- python - 创建 Pandas 数据框时出现值错误
- c - 为什么,当我尝试读取 Elf32_Shdr 时,fread() 函数会抛出分段错误?
- rust - 有没有办法 `f64::from(0.23_f32)` 并获得 0.23_f64?
- vim - vim 去掉行号下划线
- javascript - ShadyCSS polyfill 无法正确处理 Edge 中的 CSS
- r - 如何使用 R 客户端连接到 Docker Influxdb?
- pandas - 根据值获取列索引标签