Raspberry Pi, планировщик Python и GPIO (I2C) - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь отправить данные из Arduino в Raspberry через i2c. На Малине я использую SMBus. Все хорошо, но когда я пытаюсь использовать python-планировщик, приходит единственная первая мера от Arduino. Кажется, доступ к i2c из не основного потока в Raspberry заблокирован, или я чего-то не понимаю. Спасибо.

Код 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()
...