【发布时间】:2023-09-04 18:38:01
【问题描述】:
我有一个 Raspberry Pi Zero,我将它用于女巫的一个项目,我必须测量温度和压力并将这些值写入位于名为 Harvest 的文件夹中的 txt 文件中,该文件夹位于启动文件夹中(路径:/boot/Harvest/temp_and_press_sensor.txt)。我使用的传感器是 BMP388。在代码中,我有很多东西要读取来自 GPIO 引脚的值,最后我有更多代码来读取温度和压力值,打开 txt 文件,写入这些值并关闭,然后等待一些时间,然后重复该过程。 代码是:
import time
import datetime
import sys
import smbus
import spidev
import RPi.GPIO as GPIO
from math import pow
class DFRobot_BMP388:
def __init__(self):
self.op_mode = 0
self.par_t1 = 0
self.par_t2 = 0
self.par_t3 = 0
self.par_p1 = 0
self.par_p2 = 0
self.par_p3 = 0
self.par_p4 = 0
self.par_p5 = 0
self.par_p6 = 0
self.par_p7 = 0
self.par_p8 = 0
self.par_p9 = 0
self.par_p10 = 0
self.par_p11 = 0
chip_id = self.bmp3_get_regs(0x00, 1)[0]
if (chip_id != 0x50):
print("chip id error!")
sys.exit()
return
self.get_calib_data()
self.set_config()
def get_calib_data(self):
calib = self.bmp3_get_regs(0x31,21)
self.parse_calib_data(calib)
def uint8_int(self,num):
if(num>127):
num = num - 256
return num
def parse_calib_data(self,calib):
temp_var = 0.00390625
self.par_t1 = ((calib[1]<<8)|calib[0])/temp_var
temp_var = 1073741824.0
self.par_t2 = ((calib[3]<<8)|calib[2])/temp_var
temp_var = 281474976710656.0
calibTemp = self.uint8_int(calib[4])
self.par_t3 = (calibTemp)/temp_var
temp_var = 1048576.0
calibTempA = self.uint8_int(calib[6])
calibTempB = self.uint8_int(calib[5])
self.par_p1 = ((calibTempA|calibTempB)-16384)/temp_var
#print((calibTempA<<8)|calibTempB)
temp_var = 536870912.0
calibTempA = self.uint8_int(calib[8])
calibTempB = self.uint8_int(calib[7])
self.par_p2 = (((calibTempA<<8)|calibTempB)-16384)/temp_var
#print((calibTempA<<8)|calibTempB)
temp_var = 4294967296.0
calibTemp = self.uint8_int(calib[9])
self.par_p3 = calibTemp/temp_var
#print(calibTemp)
temp_var = 137438953472.0
calibTemp = self.uint8_int(calib[10])
self.par_p4 = calibTemp/temp_var
#print(calibTemp)
temp_var = 0.125
self.par_p5 = ((calib[12]<<8)|calib[11])/temp_var
#print((calib[12]<<8)|calib[11])
temp_var = 64.0
self.par_p6 = ((calib[14]<<8)|calib[13])/temp_var
#print((calib[14]<<8)|calib[13])
temp_var = 256.0
calibTemp = self.uint8_int(calib[15])
self.par_p7 = calibTemp/temp_var
#print(calibTemp)
temp_var = 32768.0
calibTemp = self.uint8_int(calib[16])
self.par_p8 = calibTemp/temp_var
#print(calibTemp)
temp_var = 281474976710656.0
self.par_p9 = ((calib[18]<<8)|calib[17])/temp_var
#print((calib[18]<<8)|calib[17])
temp_var = 281474976710656.0
calibTemp = self.uint8_int(calib[19])
self.par_p10 = (calibTemp)/temp_var
#print(calibTemp)
temp_var = 36893488147419103232.0
calibTemp = self.uint8_int(calib[20])
self.par_p11 = (calibTemp)/temp_var
#print(calibTemp)
def set_config(self):
settings_sel = 2|4|16|32|128
self.bmp3_set_sensor_settings(settings_sel)
self.op_mode = 0x03
self.write_power_mode()
def bmp3_set_sensor_settings(self,settings_sel):
#set_pwr_ctrl_settings
reg_data = self.bmp3_get_regs(0x1b,1)[0]
if(settings_sel & 2):
reg_data = (reg_data&~(0x01))|(0x01&0x01)
if(settings_sel & 4):
reg_data = (reg_data&~(0x02))|((0x01<<0x01)&0x02)
#data = bytearray(1)
data = [reg_data]
#print(data)
#print(data[0])
self.bmp3_set_regs(0x1b,data)
def write_power_mode(self):
op_mode_reg_val = self.bmp3_get_regs(0x1b,1)[0]
op_mode_reg_val = (op_mode_reg_val&~(0x30))|((self.op_mode<<0x04)&0x30)
#data = bytearray(1)
#data[0] = op_mode_reg_val
data = [op_mode_reg_val]
self.bmp3_set_regs(0x1b,data)
def readTemperature(self):
return round(self.bmp3_get_sensor_data(2),2)
def readPressure(self):
return round(self.bmp3_get_sensor_data(1),2)
def bmp3_get_sensor_data(self,sensor_comp):
rslt = self.bmp3_get_regs(0x04,6)
#parse_sensor_data
xlsb = rslt[0]
lsb = rslt[1] << 8
msb = rslt[2] << 16
uncomp_pressure = msb|lsb|xlsb
xlsb = rslt[3]
lsb = rslt[4] << 8
msb = rslt[5] << 16
uncomp_temperature = msb|lsb|xlsb
#print(uncomp_temperature)
value = self.compensate_data(sensor_comp,uncomp_pressure,uncomp_temperature)
return value
def compensate_data(self,sensor_comp,uncomp_pressure,uncomp_temperature):
if(sensor_comp & 0x03):
value = self.compensate_temperature(uncomp_temperature)
if(sensor_comp & 0x01):
value = self.compensate_pressure(uncomp_pressure,value)
return value
def compensate_temperature(self,uncomp_temperature):
uncomp_temp = uncomp_temperature
partial_data1 = (uncomp_temp - self.par_t1)
partial_data2 = (partial_data1 * self.par_t2)
comp_temp = partial_data2 + (partial_data1 * partial_data1)*self.par_t3
return comp_temp
def compensate_pressure(self,uncomp_pressure,t_lin):
partial_data1 = self.par_p6 * t_lin
partial_data2 = self.par_p7 * pow(t_lin, 2)
partial_data3 = self.par_p8 * pow(t_lin, 3)
partial_out1 = self.par_p5 + partial_data1 + partial_data2 + partial_data3
#print(partial_data1,partial_data2,partial_data3)
#print(partial_out1)
partial_data1 = self.par_p2 * t_lin
partial_data2 = self.par_p3 * pow(t_lin, 2)
partial_data3 = self.par_p4 * pow(t_lin, 3)
partial_out2 = uncomp_pressure *(self.par_p1-0.000145 + partial_data1 + partial_data2 + partial_data3)
#print(partial_out2)
partial_data1 = pow(uncomp_pressure, 2)
partial_data2 = self.par_p9 + self.par_p10 * t_lin
partial_data3 = partial_data1 * partial_data2
partial_data4 = partial_data3 + pow(uncomp_pressure, 3) * self.par_p11
#print(partial_data4)
comp_press = partial_out1 + partial_out2 + partial_data4
#print(comp_press)
#print(t_lin)
return comp_press;
def readCalibratedAltitude(self,seaLevel):
pressure = self.readPressure()
return round((1.0 - pow(pressure / seaLevel, 0.190284)) * 287.15 / 0.0065,2)
def readSeaLevel(self, altitude):
pressure = self.readPressure()
return round(pressure / pow(1.0 - (altitude / 44330.0), 5.255),2)
def readAltitude(self):
pressure = self.readPressure()
return round((1.0 - pow(pressure / 101325, 0.190284)) * 287.15 / 0.0065,2)
def INTEnable(self):
reg_data = [0x40]
reg_addr = 0x19
self.bmp3_set_regs(reg_addr, reg_data)
def INTDisable(self):
reg_data = [0x00]
reg_addr = 0x19
self.bmp3_set_regs(reg_addr, reg_data)
class DFRobot_BMP388_SPI(DFRobot_BMP388):
def __init__(self,cs):
self.spi = spidev.SpiDev(0,0)
self.cs = cs
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(self.cs, GPIO.OUT,initial=1)
super(DFRobot_BMP388_SPI,self).__init__()
def bmp3_get_regs(self,reg,len):
regAddr = [reg|0x80]
GPIO.output(self.cs,0)
self.spi.xfer(regAddr)
rslt = self.spi.readbytes(len+1)
GPIO.output(self.cs,1)
data = bytearray(len)
for i in range(0,len):
data[i] = rslt[i+1]
return data
def bmp3_set_regs(self,reg,data):
value = []
for i in range(0,len(data)):
value.append(data[i])
regAddr = [reg&0x7f]
GPIO.output(self.cs,0)
self.spi.xfer(regAddr)
self.spi.xfer(value)
GPIO.output(self.cs,1)
class DFRobot_BMP388_I2C(DFRobot_BMP388):
def __init__(self, addr):
self._addr = addr
self.i2c = smbus.SMBus(1)
super(DFRobot_BMP388_I2C,self).__init__()
def bmp3_get_regs(self,reg,len):
rslt = self.i2c.read_i2c_block_data(self._addr,reg,len)
return rslt
def bmp3_set_regs(self,reg,data):
self.i2c.write_i2c_block_data(self._addr,reg,data)
# Create a bmp388 object to communicate with I2C.
bmp388 = DFRobot_BMP388_I2C(0x77)
#first
time.sleep(300)
ground_level = 470.0
seaLevel = bmp388.readSeaLevel(ground_level)
altitude = bmp388.readCalibratedAltitude(seaLevel)
temp = bmp388.readTemperature()
pres = bmp388.readPressure()
now = datetime.datetime.now()
file = open("/boot/Harvest/temp_and_press_sensor.txt", "a")
file.write(now.strftime("%Y/%m/%d %H:%M:%S") + " - TEMP: %s ºC" %temp + " | PRESS: %s Pa" %pres + "\n")
file.close()
#second
time.sleep(14100)
ground_level = 470.0
seaLevel = bmp388.readSeaLevel(ground_level)
altitude = bmp388.readCalibratedAltitude(seaLevel)
temp = bmp388.readTemperature()
pres = bmp388.readPressure()
now = datetime.datetime.now()
file = open("/boot/Harvest/temp_and_press_sensor.txt", "a")
file.write(now.strftime("%Y/%m/%d %H:%M:%S") + " - TEMP: %s ºC" %temp + " | PRESS: %s Pa" %pres + "\n")
file.close()
#thirth
time.sleep(14400)
ground_level = 470.0
seaLevel = bmp388.readSeaLevel(ground_level)
altitude = bmp388.readCalibratedAltitude(seaLevel)
temp = bmp388.readTemperature()
pres = bmp388.readPressure()
now = datetime.datetime.now()
file = open("/boot/Harvest/temp_and_press_sensor.txt", "a")
file.write(now.strftime("%Y/%m/%d %H:%M:%S") + " - TEMP: %s ºC" %temp + " | PRESS: %s Pa" %pres + "\n")
file.close()
#fourth
time.sleep(14400)
ground_level = 470.0
seaLevel = bmp388.readSeaLevel(ground_level)
altitude = bmp388.readCalibratedAltitude(seaLevel)
temp = bmp388.readTemperature()
pres = bmp388.readPressure()
now = datetime.datetime.now()
file = open("/boot/Harvest/temp_and_press_sensor.txt", "a")
file.write(now.strftime("%Y/%m/%d %H:%M:%S") + " - TEMP: %s ºC" %temp + " | PRESS: %s Pa" %pres + "\n" + "\n")
file.close()
我希望每次启动树莓派时都运行此代码,因此,我在终端中输入:sudo crontab -e,然后选择 nano。然后我写道:@reboot python /home/pi/Desktop/Harvest/bmp388.py & 并保存。 我面临的问题是,当我从 python 编辑器运行代码时,一切正常并且值被写入 txt 文件,但是当我重新启动我的 rpi 并等待在 txt 文件中运行和写入所需的时间时,它从来不会。我什至尝试创建一个 txt 文件,然后在这个新文件中写入,但没有注意到,所以我假设代码没有运行。我发现它很奇怪,因为在 crontab 中,我还有另一行代码可以在重新启动时运行不同的程序,并且该程序每次都会运行。
你知道可能是什么问题吗?
谢谢你,阿方索
【问题讨论】:
标签: python cron raspberry-pi startup