Ich möchte einige Werte von meinem Arduino in kivy auf Raspberry "ziehen", die über eine drahtlose NRF24-Modul verbunden ist. Ich verwende this Bibliothek mit python wrapperKivy Python - Callback-Funktion mit partiellen
In reinem Python funktioniert der Code gut und jetzt möchte ich es in Kivy integrieren.
für das gemacht I zwei Funktionen innerhalb zimmerwetter.py
:
eine für das Funkgerät der Einrichtung und gibt den Funk Objekt (sollte ausgeführt werden, wenn die Anwendung gestartet wird):
def radiosetup():
radio = RF24(RPI_BPLUS_GPIO_J8_22, RPI_BPLUS_GPIO_J8_24, BCM2835_SPI_SPEED_8MHZ)
# doing setup stuff...
return radio
und eine andere Funktion, die Senden Sie eine Anfrage an den Arduino, die ein Datum für die Umgebung liefert (Temperatur, Luftfeuchtigkeit usw.).
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
Die getenviroment Funktion sollte the kivy clock module
from zimmerwetter import *
class PyowmApp(App):
def build(self):
radio = radiosetup()
Clock.schedule_interval(partial(getenviroment,radio), 10)
Der Fehler ist in wie vorgeschlagen genannt werden später alle x Sekunden vom Kivy App, die Teilfunktion verwendet:
File "/home/pi/pyscripts/pyowm/zimmerwetter.py", line 83, in getenviroment
radio.stopListening()
AttributeError: 'float' object has no attribute 'stopListening'
I Ich frage mich, warum ein Float-Objekt zurückgegeben wird, wenn ich das Radio-Objekt mit Hilfe (Radio) drucke, gibt es class RF24(Boost.Python.instance)
und die Funktion stoplistening() exis zurück ts.
die Anweisung in 'Clock.schedule_once (Lambda dt: getenviroment (radio), 10)' zu ändern und das self-Argument von der functon zu entfernen, funktioniert auch (die Funktion ist nicht im Rahmen der App) – Triscus
@Triscus die Frage gibt nicht an, wo 'getenviroment' definiert ist, also nahm ich' PyownApp' an. Ersetzen Sie "self" durch die korrekte Instanz der Klasse mit 'getenvironment'. Oder erwägen Sie, den Parameter 'self' zu ändern. – zeeMonkeez
Die Funktionen wurden nicht innerhalb einer Klasse definiert, nur mit einer 'def'-Anweisung. Ich denke, ich sollte mich an OOP gewöhnen, danke für Ihre Inspiration – Triscus