Это вполне возможно.Но вам не хватает нескольких вещей.
Вы пытаетесь подключиться к последовательному порту после запуска вашего приложения, которое не будет работать, так как ваше приложение будет остановлено, когда вы приедете туда.Вместо этого вы хотите выполнить эту часть, пока ваше приложение работает.Я бы сделал попытку / кроме подключения к arduino в app.build.
def build (self):
try:
self.arduino = serial.Serial('/dev/ttyACM0')
exept:
print("unable to connect to arduino :(")
Clock.schedule_interval(self.update, 1)
return Builder.load_file("main.kv")
тогда, вы хотите проверить сообщения в методе обновления, но вы не хотите блокировать, так что вы толькопрочитайте объем данных, ожидающих в буфере.
def update(self, *args):
arduino = self.arduino
data = arduino.read(arduino.inWaiting())
затем вы выполняете обработку, я предполагаю, что ваши данные выглядят примерно так:
A value
B value
в таком случае вы можетепроанализируйте его и обновите соответствующую переменную, что-то вроде:
def update(self, *args):
arduino = self.arduino
data = arduino.read(arduino.inWaiting())
for line in data.split('\n'):
try:
sensor, value = line.strip().split(' ')
except:
print("parse error!")
continue
if sensor == 'A':
self.sensor1 = float(value)
elif sensor == 'B':
self.sensor2 = float(value)
else:
print("unknown data! {}".format(line))
сделает работу, это немного упрощенно, так как предполагает, что вы всегда получаете полные строки, но это может быть улучшено позже, если необходимо (и этомне кажется, этого достаточно для многих случаев).
Теперь нам нужно убедиться, что наши метки замечают изменения значений, для этого kivy использует properties
, которые являются более умными атрибутами, вам нужночтобы объявить их в классе приложения.
class XGApp(App):
sensor1 = NumericProperty(0)
sensor2 = NumericProperty(0)
Теперь вы можете сделать так, чтобы ваше обновление отображало значение напрямую через экземпляр приложения.
<ContScreen>:
FloatLayout
orientation: 'vertical'
padding: [10,50,10,50]
spacing: 50
Label:
id: 'TempLabel1'
text: str(app.sensor1)
color: 1,1,1,1
font_size: 80
pos_hint: {'center_x':0.2, 'center_y':0.6}
Label:
id: 'TempLabel2'
text: str(app.sensor2)
color: 1,1,1,1
font_size: 80
pos_hint: {'center_x':0.5, 'center_y':0.6}