Я пытаюсь отправить данные из 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()