Я хочу «вытащить» некоторые значения из моего Arduino в kivy на Raspberry, который подключен через беспроводной модуль NRF24. Я использую библиотеку this с python wrapperKivy Python - Функция обратного вызова с частичным
В чистом Python код работает хорошо, и теперь я хочу интегрировать его в Kivy.
Для этого я сделал две функции внутри zimmerwetter.py
:
One для настройки устройства радиосвязи и возвращает объект радио (должен быть запущен, как только начинается приложение):
def radiosetup():
radio = RF24(RPI_BPLUS_GPIO_J8_22, RPI_BPLUS_GPIO_J8_24, BCM2835_SPI_SPEED_8MHZ)
# doing setup stuff...
return radio
и другую функцию, которая отправьте запрос в Arduino, который поставляет некоторую дату окружающей среды (температура, влажность и т. д.).
def getenviroment(self,radio):
millis = lambda: int(round(time.time() * 1000))
# send command
send_payload = 'getdata'
# First, stop listening so we can talk.
radio.stopListening()
# Take the time, and send it. This will block until complete
print 'Now sending length ', len(send_payload), ' ... ',
radio.write(send_payload[:len(send_payload)])
a = datetime.datetime.now()
# Now, continue listening
radio.startListening()
# Wait here until we get a response, or timeout
started_waiting_at = millis()
timeout = False
while (not radio.available()) and (not timeout):
if (millis() - started_waiting_at) > 1000:
timeout = True
# Describe the results
if timeout:
b = datetime.datetime.now()
# print(b - a)
print 'failed, response timed out.'
else:
# Grab the response, compare, and send to debugging spew
length = radio.getDynamicPayloadSize()
receive_payload = []
receive_payload = radio.read(length)
print 'got response size=', length
print struct.unpack("bbbbhbbbb", ''.join(chr(c) for c in receive_payload))
b = datetime.datetime.now()
print(b - a)
return receive_payload
Функция getenviroment должна вызываться позже каждые х секунд из приложения kivy, частичная функция используется как предложено в the kivy clock module
from zimmerwetter import *
class PyowmApp(App):
def build(self):
radio = radiosetup()
Clock.schedule_interval(partial(getenviroment,radio), 10)
Ошибка является:
File "/home/pi/pyscripts/pyowm/zimmerwetter.py", line 83, in getenviroment
radio.stopListening()
AttributeError: 'float' object has no attribute 'stopListening'
Я интересно, почему возвращается объект float, когда я печатаю радиообъект с помощью (радио), он возвращает class RF24(Boost.Python.instance)
и функцию stoplistening() exis ц.
изменение инструкции на 'Clock.schedule_once (lambda dt: getenviroment (radio), 10)' и удаление аргумента self из функционала тоже работает (функция не объявлена в области действия App) – Triscus
@Triscus в вопросе не указано, где определяется 'getenviroment', поэтому я принял' PyownApp'. Замените 'self' на правильный экземпляр класса с' getenvironment'. Или подумайте об изменении параметра 'self'. – zeeMonkeez
Функции не были определены внутри класса, только с выражением 'def'. Думаю, я должен привыкнуть к ООП, спасибо за ваше вдохновение – Triscus