hyle Wenn Du unbedingt die Crontab benutzen willst, dann erstelle einen Cronjob der das Script startet...
Vielen Dank für deine Mühe! Aber das finde ich wirklich unschön. Dann lasse ich das Skript einfach durchlaufen
hyle Wenn Du unbedingt die Crontab benutzen willst, dann erstelle einen Cronjob der das Script startet...
Vielen Dank für deine Mühe! Aber das finde ich wirklich unschön. Dann lasse ich das Skript einfach durchlaufen
Wie sage ich es in Python ? (Einsteigerfragen)? Schau mal ob du hier fündig wirst!
Das Problem ist, dass die LED zwar eingeschaltet wird, am Ende des Scripts aber wieder erlischt, da das Script die Ausgänge wieder reseted.
Das ist mit GPIO.cleanup() aus RPi.GPIO vergleichbar. Wird das Script beendet/verlassen (terminiert) werden alle GPIO's wieder in den Werkszustand zurück gesetzt - so macht es gpiozero, was eigentlich besser und auch Anfängerfreundlicher ist.
Mir ist leider keine Möglichkeit bekannt das abzustellen. Dir bleibt dann nur übrig dein Anliegen mit einem anderen Module zu realisieren (pigpio gäbs noch), oder das Script permanent laufen zu lassen.
meigrafd ...oder das Script permanent laufen zu lassen.
Ich denke, genau das werde ich nun tun. Irgendwo habe ich mal gesehen, dass eine (so kurze) while True: Schleife mit nur einem if(): am Ende noch ein time.sleep(0.2) enthält, damit der Rechner "Zeit für andere Sachen hat". Meine Anwendung mit der Zeitschaltuhr ist ja absolut nicht zeitkritisch. Macht es daher Sinn, so eine Pause mit einzubauen? Es könnten für diesen Fall ja auch 1 Sekunde oder auch 30 Sekunden sein.
Eine Pause in jedem Fall! Du kannst die Schleife auch 60 Sekunden oder länger schlafen legen, wenn es nicht auf die Minute ankommt.
Super danke!
Wenn du keine Pause, bzw eigentlich ist das eine Blockade, einbaust verursacht das Script eine sehr hohe CPU Auslastung, da die while dann extrem schnell rotiert.
Schlecht:
Besser:
Oder:
import time
def do_something(text):
print(text)
time.sleep(0.01)
while True:
do_something(time.time())
do_something blockiert die Schleife derweil es beschäftigt ist - das ist mit jedem "Befehl" so, nur eben unterschiedlich. Hierbei bedarf es keines zusätzlichen Blockierens (sleep).
Ein "print" alleine benötigt zwar auch einige Microsekunden, reicht aber nicht aus um eine 100% CPU Auslastung zu verhindern.
Hallo ich habe ein Problem mit meinem Raspi 2 mit aktuellem System.
ich wollte eine simple LED ansteuern und hab dazu das folgende Script benutzt .
LED Steckt an Pin 11 also GPIO 17 und 6 über Widerstand aber es tut sich außer Fehlermeldung
(
Warning (from warnings module):
File "/home/pi/blink1.py", line 5
IO.setup(11, IO.OUT)
RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
gar nichts.
der Code den ich in python 2 programm eingab und mit F5 starten wollte ist.
#! / Usr / bin/ python
import RPi.GPIO as IO
import time
IO.setmode(IO.BOARD)
IO.setup(11, IO.OUT)
state = True
while True:
IO.output(11, state)
state = not state
time.sleep(1)
Ziel war eigentlich ein wechselblinken von 2 LED ( Weiß; Blau)
könnt ihr mir helfen ich bin nunmal Neuling und Ratlos
Danke
Für mich ist Python neu und ich tue mich gerade ein bisschen schwer damit. Im Prinzip habe ich vier Variablen, die ich gerne sequentiell in eine Datei schreiben möchte, so dass ich sie mit einem anderen Programm zur weiteren Verarbeitung übernehmen kann. Die einzige Bedingung ist, dass die Daten problemlos und möglichst einfach von einem C-Programm übernommen werden können. Wenn es nicht anders geht, wäre auch eine Ausgabe in Form von JSON ok.
Leider habe ich keine Ahnung, wie ich meine Daten in die Datei schreiben kann (siehe auskommentierte f.write() Operationen unten im Code).
Es geht um folgende Variablen:
file_mark: 1 Byte Code (z.B. ASCII "c" zur Markierung der Datei. Sollte in der Datei im ersten Byte liegen.
base: Float mit einem Wert, der vom Anwender mitgeliefert werden muss (wird später über UI abgefragt).
factor: Integer der anhand der Daten errechnet wird und vom Benutzer im UI angepasst werden kann.
m: zweidimensionale Liste mit 256 x 256 Messwerten die zwischen 0.0 und 256.0 liegen.
# arrays.py - Test Script zur Datenaufbereitung in Listen und Bereitstellung der .ter Files.
# Fiktive Scanner-Funktion für Testzwecke ohne reale Messwerte.
def scan(x, y):
return (x*y) + 0.5
# Hauptprogramm - Entry Point der Anwendung
def main(args=None):
# 1-Byte Integer um die Datei als .ter File zu markieren.
# Darf auch ein Byte mit einem beliebig anderen definierten Wert zwischen 1 und 254 inklusive sein.
file_mark = 'c'
# Basis mit der die Daten aufgezeichnet wurden. Wird in der realen Anwendung über das UI eingegeben.
base = 21.0
# Kompressionsfaktor, wird anhand der erfassten Daten berechet, kann bei Bedarf angepasst werden.
# Je kleiner der Wert desto grösser die Präzision, je grösser der Wert desto höher die Kompression.
# Aktuell mögliche Werte sind 64 (default), 32 und 16.
factor = 64
# Zweidimensionale Liste von 256 x 256 Floats mit den Messwerten
m = [[0.0 for x in range(256)] for y in range(256)]
# Matrix mit Daten füllen (Scannen)
for y in range(256):
for x in range(256):
m[x][y] = scan(x+1, y+1)
# Matrix zu Testzwecken an der Konsole ausgeben
for y in range(256):
for x in range(256):
print(x+1, y+1, m[x][ y])
# Ausgabe der Daten in demo.ter File.
# Als binary mit "wb"? Geht nicht! Als string mit "w"? Geht nur für String!
# Anderweitig? Auch o.k., aber wie? Auch JSON wäre ok! (nur unschön wegen der Datenmenge)
f = open("demo.ter", "wb")
# Ich habe keine Ahnung wie ich die Daten hier in die Datei ausgebe.
'''
f.write(file_mark)
f.write(base)
f.write(m)
'''
f.close()
# Nur ausführen, wenn als Script ausgeführt
if __name__ == "__main__":
main()
Alles anzeigen
Irgendwie scheinen alle Tutorials und Beispiele dort aufzuhören, wo ich anfange
LG
Peter
Hallo,
du kannst in eine Datei nur Strings schreiben. Mini-Beispiel für Python 3 basierend auf deinem:
with open('demo.ter', 'w') as f:
f.write('c\n')
f.write('base=64\n')
m = [['0.0' for _ in range(10)] for _ in range(10)]
for row in m:
f.write('|'.join(row))
f.write('\n')
Wenn du dazu noch Fragen hast startest du am bestehen einen eigenen Thread, das wird sonst unübersichtlich hier im Sammelthread. In deinem Code sind auch Anti-Pattern, was Iteration in Python angeht.
Gruß, noisefloor
Erstmal ein Hallo an die RaspberryPi Community!
Ich bin neu hier, genauso wenig Erfahrung habe ich mit dem Raspberry, als auch mit Python.
Nach ersten Gehversuchen mit Beidem, wie sie in den ersten Tagen wohl jeder macht, habe ich auch schon die erste für mich unüberwindbare Hürde:
Aus einer Tabelle, (zb. *.csv oder *.xlsx) mit den 3 Spalten "Schritt / GPIO-HIGHorLOW / Zeitdauer" will ich auslesen, dass ich einen Pin auf 1 oder 0 (Spalte 2) setze, und zwar für die Dauer aus Spalte 3. Soweit habe ich das auch ohne Probleme mit csv_read hinbekommen. Das Hauptproblem liegt aber darin, dass ich nach der abgelaufenen Zeit (ich habe time.sleep() verwendet), in die nächste Zeile springe, um dort wieder den Pin auf 0 oder 1 zu stellen, und zwar für die nächste Zeitdauer etc..
Ich habe mich die letzten Stunden etwas in Numpay (arrays) eingelesen, weil ich mir dachte, dass das eventuell nützlich sein könnte, kann das aber auch schlecht verbinden.
Auf welche Art und Weise würden das die Profis hier realisieren?
Danke im Voraus!
Hallo und Willkommen im Forum,
Das Hauptproblem liegt aber darin, dass ich nach der abgelaufenen Zeit (ich habe time.sleep() verwendet), in die nächste Zeile springe, um dort wieder den Pin auf 0 oder 1 zu stellen, und zwar für die nächste Zeitdauer etc..
und wo liegt genau das Problem? so wie du es beschreibst funktioniert es ja oder etwa nicht?!
Bei Programmierfragen bitte auch immer den kompletten Code (für den Fall das es mal Fehler gibt auch immer den kompletten Traceback) posten.
Numpay
Falls Du numpy meinst: Das ist für Dein Anliegen deutlich überdimensioniert. Ansonsten was Hofei sagt.
Hallo,
du musst einfach zeilenweise über die CSV-Datei iterieren, mehr nicht.
Gruß, noisefloor
Hallo zusammen,
ich habe eine weitere Einsteigerfrage für mein Projekt. Und zwar habe ich eine INI-Datei mit Einstellungen für meine Ventile. Pro Ventil gibt es einen Abschnitt mit den jeweiligen Einstellungen:
Ich habe mit einer Klasse valve() begonnen, und ich habe meine 6 Ventile zur Zeit fest eincodiert:
v1 = valve()
v2 = valve()
...
Aber es wäre ja wesentlich schöner, wenn ich dassdessen über die INI-Datei iterieren könnte und bei jedem Abschnitt "Valve" dann eine neue Instanz von meiner Klasse ableite. Wie könnte ich das denn besser dynamisch machen?
Ich bin auch später nicht mehr drauf angewiesen auf die Variablennamen der einzelnen Ventile in der Programmierung.
Jede Instanz der Klasse valve() registiert sich in einer Liste listofallvalves[]. So kann ich später einen Wasserkreislauf nach dem anderen Abklappern wenn die Bewässerung läuft:
(das letztere ist nur ein Platzhalter zum Verdeutlichen meines Plans)
Vorschläge willkommen. Vielen Dank.
Eigentlich sind doppelte Sections im INI Format nicht vorgesehen. Du brauchst eine Art "Hack", weil Python im ConfigParser standardmäßig ein dict verwendet, und so bei mehreren gleichen Keys jedes mal überschreibt. https://stackoverflow.com/questions/9876…-name-in-python
Ich würde JSON oder ähnliches empfehlen.
Haha, jetzt habe ich mich selbst reingelegt. Zur Zeit habe ich noch Abschnitte "Valve1", "Valve2" etc, in der INI-Datei drin, und es funktioniert. Dachte mir aber gerade, dass ich immer den gleichen Bezeichner brauche, um die zu finden.
Anyways, wie kriege ich denn dynamisch eine Instanz abelegt wenn er ein "Valve*" findet?
import configparser
class Test:
tests = []
def __init__(self, name):
self.name = name
Test.tests.append(self)
def load_config():
config = configparser.ConfigParser()
config.read('test.ini')
for section in config.sections():
if section.startswith('Test'):
Test(config[section]['name'])
def main():
load_config()
print(f"Created {len(Test.tests)} 'Test' instances")
for test in Test.tests:
print(test.name)
if __name__ == "__main__":
main()
Alles anzeigen
Klassen bitte so schreiben: MyClassName! (zur besseren Unterscheidung von Funktionen (my_function_name).
Die Klasse ist sinnfrei und ein Exemplar der Klasse wird nicht wirklich benutzt. Das obige Beispiel ist eine Umschreibung einer globalen Variable, denn die __init__() wird nur wegen ihres globalen Effekts aufgerufen wie eine Funktion. Also weg damit und @marcuszurhorst vergiss das Beispiel.
Die Klasse ist sinnfrei und ein Exemplar der Klasse wird nicht wirklich benutzt.
Guess what, es geht um was anderes
Zeile 11-17 sind die Antwort auf sie Frage von marcuszurhorst, aber du kannst es ja mal wieder besser
Anyways, wie kriege ich denn dynamisch eine Instanz abelegt wenn er ein "Valve*" findet?
Und tschüss.
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!