Fragen zur Schnittstellenbelegung Raspberry
Hallo zusammen,
bevor ich mich in horrende Unkosten stürze, hätte ich gerne Eure Bestätigung, dass ich da nicht auf dem Holzweg bin mit meinem Vorhaben.
Für meine Wetterstation habe ich einen Raspberry 3, an dem am I2C ein Helligkeitssensor arbeitet. Die Pins des Sensors mit den Bezeichnungen SCL und SDA sind mit den entsprechenden Pins am Raspi verbunden (GPIO2 bzw GPIO3), Masse und Versorgungsspannung ebenfalls (Sonsor liefert seit längerem Daten, läuft also).
Nun möchte ich meine Station um einen Blitzsensor vom Typ AS3935 erweitern, ebenfalls ein I2C-Sensor. Die vorgeschlagene Pin-Belegung zum Raspberry ist hier beschrieben, es werden wieder SCL und SDA vom Raspi verwendet. Ist das okay, die beiden Sensoren dann an diesen Pins parallel zu betreiben (ich habe keine Ahnung von Bus-Systemen, vermute aber, dass es genau dafür gedacht ist).
Zusätzlich braucht es eine Spannungsversorgung, das ist klar, aber wofür ist "IRQ", der am Raspi auf GPIO17 gelegt wird? Warum hat das der Helligkeitssensor nicht?
Den Helligkeitssensor lese ich per cron alle 5 Minuten mittels eines Python-Prgramms aus. Den Blitzsensor kann man auch laut verlinkter Seite per Python auslesen.
Muss ich hier irgendwie sicherstellen, dass sich die beiden Programme nicht in die Quere kommen? ich würde nämlich den Blitzsensor im Sekunden-Takt auslesen wollen (oder zumindest in der kürzest möglichen Wiederholrate).
Was meint ihr?
Danke
michel_vaclav
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo zusammen,
jetzt habe ich doch Probleme mit der ganzen Geschichte. Offensichtlich kommen sich meine drei Sensoren in die Quere beim Benutzen des I2C-Busses.
Für zwei der drei Sensoren konnte ich das Problem relativ einfach lösen mit folgendem Ansatz:
Zwei Sensoren werden alle 5 Minuten per Cronjob ausgelesen, daher habe ich in das jeweilige Python-Programm eine Abfrage nach einem Flag eingebaut. Kurz gesagt: Wird die Abfrage eines Sensors getriggert, prüft das Programm zunächst das Vorhandensein einer Datei namens ic2flag.txt in /dev/shm. Ist diese Datei nicht vorhanden, wird sie angelegt mit dem Inhalt "False".
Im weiteren Verlauf der Abarbeitung wird dann an geeigneter Stelle vor dem Auslesen des Sensors geprüft, ob der Inhalt der oben genannten Datei "False" ist. Falls ja, wird der Inhalt auf "True" gesetzt und das Programm fortgesetzt. Vor Beendigung des Programms wird dann der Inhalt der Datei wieder auf "False" gesetzt.
Sollte nun bei der Prüfung der Datei vor Auslesen des Sensors "True" zurückgegeben werden, so wird einfach ein Delay von 5 Sekunden zusätzlich gesetzt, bevor der Sensor ausgelesen wird.
Diese Vorgehensweise funktioniert tadellos, wie mir die Logfiles dazu anzeigen (ich protokolliere die Wartezeiten, sofern sie auftreten, separat).
Mein Blitzsensor ist aber offensichtlich anders gestrickt. Dieser wird einmalig gestartet und läuft dann permanent. Muss er ja auch, weil er ja Blitze in Echtzeit beobachtet. Daher müsste ich jetzt in dem zugehörigen Python-Programm diese Abfrage nach Gesetztsein des Prüfungsflags unterbringen. Allerdings verstehe ich den Programmcode nicht, somit weiß ich nicht, an welcher Stelle ich das am Besten unterbringe. Daher bitte ich um fachkundigen Rat.
Im Anhang die Datei "blitze.py", die einmalig gestartet wird. Diese importiert eine weitere Datei namens "RPi_AS3935.py", die offensichtlich sehr viel mehr macht.
Wenn ich das richtig interpretiere, dann wird aus blitze.py je nach Status aus der zweiten Datei eine Sequenz aufgerufen. Ich hatte schon an verschiedenen Stellen die Prüfung der Datei /dev/shm/i2cflag.txt eingebaut und versucht, das auch zu loggen. Ich habe jedoch noch keine geeignete Stelle gefunden.
Wo würdet ihr die Prüfung hinsetzen?
BTW.: hänge ich den Blitzsensor an einen anderen Raspberry ohne zusätzliche I2C-Sensoren, dann läuft das Blitzezählen beliebig lange.
Vielen Dank schon mal an alle, die sich da reindenken.
michel_vaclav
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo nopes,
habe bei weitem noch nicht alles gelesen geschweige denn verstanden. Allerdings habe ich jetzt mal den Ansatz verfolgt und die Abfrage nach dem besagten Flag in die Endlosschleife gebaut. Und per Logging auch überprüft, hat soweit auch funktioniert.
Allerdings, wenn das Programm dann länger läuft, crashed es doch wieder mit folgender Fehlermeldung:
Code:
Traceback (most recent call last):
File "blitze.py", line 50, in handle_interrupt
reason = sensor.get_interrupt()
File "/home/user/RPi_AS3935.py", line 56, in get_interrupt
self.read_data()
File "/home/user/RPi_AS3935.py", line 242, in read_data
self.registers = self.i2cbus.read_i2c_block_data(self.address, 0x00)
IOError: [Errno 121] Remote I/O error
Traceback (most recent call last):
File "blitze.py", line 129, in <module>
noise = sensor.get_noise_floor()
File "/home/user/RPi_AS3935.py", line 80, in get_noise_floor
self.read_data()
File "/home/user/RPi_AS3935.py", line 242, in read_data
self.registers = self.i2cbus.read_i2c_block_data(self.address, 0x00)
IOError: [Errno 110] Connection timed out
Ich kann damit leider gar nichts anfangen. Nur dass es nicht in der Endlosschleife zu passieren scheint.
Was bedeutet dieser Fehler?
michel_vaclav