zwei variable verbinden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Domieos
User
Beiträge: 9
Registriert: Dienstag 18. Februar 2020, 20:43

Guten Abend, ich bitte um eure mithilfe und bitte habt Nachsicht mit mir.
Jede While schleife für sich läuft einwandfrei als eigenes .py programm.

Jetzt möchte ich Sie jedoch verbinden in eine py Datei um nicht beide Datein jeden morgen zu starten.

Code: Alles auswählen

import RPi.GPIO as GPIO
import time, gpiozero

adc = gpiozero.MCP3008 (channel = 0)
GPIO.setmode(GPIO.BOARD)
GPIO.setup (35, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup (36, GPIO.OUT)
GPIO.setup (29, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup (32, GPIO.OUT)



while (True) :
        if (GPIO.input (35) == True) :
            GPIO.output (36, True)
        else:
            GPIO.output (36, False)


        if (GPIO.input (29) == True) :
            GPIO.output (32, True)
        else:
            GPIO.output (32, False)
        

while True:
        voltage = adc.voltage
        voltage = voltage * 4.848
        spannung = (  "%.2f Volt" % voltage)
        uhr = (time.strftime("   Datum: %d.%m.%Y         Uhrzeit: %H:%M:%S"))
 
        gesamt = (spannung + uhr)
 
     #print (gesamt)
 
         file = open ("/media/pi/dm/log_spannung","a")  #a bedeutet  anfügen
         file.write(gesamt)
         file.write("\n")         #\n bedeutet nächste zeile
         file.close()
  
 

 
  
         time.sleep (1800)

        
        /code]
        
        
        Ich danke vielmals :)  :wink:  schönen Abend
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Na die while-Schleifen stehen nacheinander, werden also auch nacheinander abgearbeitet. Du musst die Funktionalität der beiden Schleifen in einer zusammenfassen. Indem man das sleep z.b. durch eine entsprechen lang laufende Schleife mit dem Inhalt der ersten Schleife ersetzt.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Domieos: Das ist unregelmässig eingerückt und kommt so nicht am Compiler vorbei.

Eingerückt wird in Python mit vier Leerzeichen pro Ebene.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

``as`` beim Importieren ist zum Umbenennen, `GPIO` wird aber gar nicht umbenannt.

Statt überall magische Zahlen zu verwenden sollte man die Pin-Nummern als Konstanten definieren. Weil Du das nicht gemacht hast, weiss man als Leser jetzt gar nicht was die Pins bedeuten.

Um die Bedingung bei ``if`` gehören keine Klammern. Und man vergleicht auch nicht mit literalen Wahrheitswerten, denn da kommt ja sowieso nur wieder ein Wahrheitswert bei heraus. Entweder der, den man sowieso schon hatte, oder dessen Gegenteil. Noch unsinniger werden die ``if``/``else``-Konstrukte dadurch das Du den Wert vom jeweiligen Input beim dazugehörigen Output setzt. Das kann man also auch direkt machen.

Anstelle von `time.strftime()` würde man eher mit dem `datetime`-Modul arbeiten und anstelle von Zeichenkettenformatierung mit dem veralteten ``%``-Operator mit f-Zeichenkettenliteralen. Und mit weniger Zwischenergebnissen.

Das Zeilenendezeichen kann man auch gleich in der f-Zeichenkette unterbringen.

Dateien öffnet man wo es geht zusammen mit der ``with``-Anweisung um das schliessen in jedem Fall zu gewährleisten.

Bei Textdateien sollte man immer eine explizite Kodierung angeben.

Den Dateinamen würde man als Konstante herausziehen, damit man den leicht anpassen kann.

Überarbeitet sähe Dein Code so aus (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import time
from datetime import datetime as DateTime

import gpiozero
from RPi import GPIO

VOLTAGE_LOG_FILENAME = "/media/pi/dm/log_spannung"
INPUT_PIN_A = 35
INPUT_PIN_B = 29
OUTPUT_PIN_A = 36
OUTPUT_PIN_B = 32


def main():
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup([INPUT_PIN_A, INPUT_PIN_B], GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup([OUTPUT_PIN_A, OUTPUT_PIN_B], GPIO.OUT)

    while True:
        GPIO.output(OUTPUT_PIN_A, GPIO.input(INPUT_PIN_A))
        GPIO.output(OUTPUT_PIN_B, GPIO.input(INPUT_PIN_B))

    adc = gpiozero.MCP3008()
    while True:
        now = DateTime.now()
        voltage = adc.voltage * 4.848
        line = (
            f"{voltage:.2f} Volt   Datum: {now:%d.%m.%Y}"
            f"         Uhrzeit: {now:%H:%M:%S}\n"
        )
        # print(line, end="")
        with open(VOLTAGE_LOG_FILENAME, "a", encoding="ascii") as file:
            file.write(line)

        time.sleep(30 * 60)


if __name__ == "__main__":
    main()
Du mischst `gpiozero` und `RPi.GPIO` — das geht nicht, beziehungsweise nur wenn `gpiozero` auch `RPi.GPIO` als Backend verwendet, was nicht wirklich garantiert ist. Die bessere API ist `gpiozero` also sollte man das komplett darauf portieren.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die erste Schleife ist eh völlig überflüssig, wenn man einfach per Event Registrierung direkt einen Eingang mit einem Ausgang verbindet. Oder die Verbindung gleich elektrisch herstellt, denn Daten verarbeitet werden da ja nicht.
Domieos
User
Beiträge: 9
Registriert: Dienstag 18. Februar 2020, 20:43

Ich werde alles anwenden und optimieren danke!

Als Bayer würde ich jetzt gerne jedem ein Bier ausgeben, aber online im Forum verbleibe ich bei einem GROßEM DANKE

Gruß Dominik
Antworten