【问题标题】:Raspberry Startup Script not RunningRaspberry 启动脚本未运行
【发布时间】: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


    【解决方案1】:

    一旦其他支持服务到位,确保后台任务(服务)在启动时运行的解决方案是创建systemd 服务。

    这是一个关于这个主题的link to the RasPi docs;这非常简单地解释了设置。

    【讨论】:

      最近更新 更多