树莓派,Python调度程序和GPIO(I2C)

2024-05-23 15:40:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图通过i2c把数据从Arduino传送到Raspberry。在覆盆子上,我用的是SMBus。一切都很好,但是当我尝试使用python调度程序时,Arduino的第一个度量标准是。似乎从Raspberry中的非主线程访问i2c被阻塞了,或者我不明白什么。谢谢你

树莓上的Python代码:

bus = smbus.SMBus(1)
SLAVE_ADDRESS = 0x04

def readMessageFromArduino():
    smsMessage = ""
    data_received_from_Arduino = bus.read_i2c_block_data(SLAVE_ADDRESS, 0,32)
    length_sms = len(data_received_from_Arduino)

    for i in range(length_sms) :
        smsMessage += chr(data_received_from_Arduino[i])

    pars = smsMessage.split(';')
    print(pars[0:-1])
    df_pars = pd.DataFrame([pars[0:-1]],columns=['CO2(ppm)','Light(lx)','Temperature(C)','Humidity(%)'])
    with open('data.csv', 'a') as f:
        df_pars.to_csv(f, mode='a', index=False, header=f.tell()==0)
def run_job_sensors(sensors_config, logger):
    global need_light_up
    logger.info("Reading message from Arduino")
    need_light_up = readMessageFromArduino(sensors_config)
    logger.info("Light needed: " + str(need_light_up))
    logger.info("Message received")
if __name__ == '__main__':
    settings = parse_configs()

    logger = init_logger()
    logger.info("Script started")

    time.sleep(2)

    scheduler = BlockingScheduler()
    logger.info("Scheduling the job")
    scheduler.add_job(func=(lambda: run_job_cameras(settings["light_config"], settings["cameras_config"],
                                                    settings["sensors_config"], logger)), trigger="interval",
                      seconds=settings['run_interval'])
    scheduler.add_job(func=(lambda: run_job_sensors(settings["sensors_config"], logger)), trigger="interval",
                      seconds=60)

    atexit.register(lambda: scheduler.shutdown())
    scheduler.start()

Tags: runfrominfoconfigdatasettingsjobi2c