Berechnung einer Schaltung

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Sarkasmus, wenns sein muss. ;)

    Popups gibs bei mir jedenfalls nicht.

    Einmal editiert, zuletzt von flyppo (29. Dezember 2014 um 22:25)

  • Vielleicht noch ein Erklärungsversuch:

    Stell dir das Signal, welches in digitaler Form (also z.B. 00110100011101) aus dem Sensor kommt,
    nicht als strömenden Fluss vor.
    Das (theoretisch) kein Strom fließt, ist diese Vorstellung (das Modell) einfach nicht passend.
    Stell dir das digitale Signal ehr als ein Klopfen an einer Tür vor.
    Dabei wird nichts, außer die Information übergeben.
    Zumindest solange die Tür zu ist.
    Also die Tür ist der hochohmische Widerstand ;)

  • Moin,

    was haltet ihr eigentlich von dieser Schaltung mit diesem Skript: Schaltung

    Und dann mit python folgendes Skript laufen lassen:

    import os, glob, time

    os.system(′modprobe w1-gpio′)
    os.system(′modprobe w1-therm′)

    base_dir = ′/sys/bus/w1/devices/′
    device_folder = glob.glob(base_dir + ′28*′)[0]
    device_file = device_folder + ′/w1_slave′

    def read_temp_raw():
    f = open(device_file, ′r′)
    lines = f.readlines()
    f.close()
    return lines

    def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != ′YES′:
    time.sleep(0.2)
    lines = read_temp_raw()
    equals_pos = lines[1].find(′t=′)
    if equals_pos != -1:
    temp_string = lines[1][equals_pos+2:]
    temp_c = float(temp_string) / 1000.0
    temp_f = temp_c * 9.0 / 5.0 + 32.0
    return temp_c, temp_f

    while True:
    print("temp C=%f\ttemp F=%f" % read_temp())
    time.sleep(1)

    ---------------------------------------------------------------------------------

    $ python temp_DS18B20.py
    temp C=25.187000 temp F=77.336600
    temp C=25.125000 temp F=77.225000
    temp C=25.062000 temp F=77.111600
    temp C=26.312000 temp F=79.361600
    temp C=27.875000 temp F=82.175000
    temp C=28.875000 temp F=83.975000

    PS: Meine Rx- und Tx-Pin's also der eigentliche serielle Port sind freigeschalten und fungieren als Ein- und Ausgang, deswegen liegt das Datenkabel am Tx-Pin an in dem Bild :)

    Einmal editiert, zuletzt von AliceDeh (30. Dezember 2014 um 07:08)

  • Ich sehe da keinen Unterschied zu der von uns vorgeschlagenen Schaltung!
    In beiden Fällen werden die Pins 3,3V, GND und GPIO4 genutzt.
    Der Pin TXD ist auf dem Bild der, der rechts von GPIO4 liegt.
    Dein Script wird deshalb nicht funktionieren, weil du nach def nicht einrückst und damit Python die Subroutine / Funktion nicht erkennen kann:


    oder so ähnlich, musst du im Original gucken. Kann aus zeitlichen Gründen da nicht einsteigen, nutze selber ein anders - aber auch umfangreicheres - Script.

    Gruß aus der Stadt der CeBIT
    Jochen

    Einmal editiert, zuletzt von RasPi-Jo (30. Dezember 2014 um 10:01)


  • Ich sehe da keinen Unterschied zu der von uns vorgeschlagenen Schaltung!
    In beiden Fällen werden die Pins 3,3V, GND und GPIO4 genutzt.
    Der Pin TXD ist auf dem Bild der, der rechts von GPIO4 liegt.
    Dein Script wird deshalb nicht funktionieren, weil du nach def nicht einrückst und damit Python die Subroutine / Funktion nicht erkennen kann:


    oder so ähnlich, musst du im Original gucken. Kann aus zeitlichen Gründen da nicht einsteigen, nutze selber ein anders - aber auch umfangreicheres - Script.

    Dieses Skript ist aus einem Buch. Es muss funktionieren. Weshalb sollte es nicht? Was muss ich ändern?

  • So habe das Script aus dem letzten Post getestet. Es funktioniert schon deshalb - bei mir - nicht, da die 1. Zeile im Script

    Python
    #!/usr/bin/python


    lauten muss.
    Ausserdem erhalte ich folgende Fehlermeldung:

    Code
    raspberrypi-hzg:~# ./test2.py
      File "./test2.py", line 24
        temp_string = lines[1][equals_pos+2:]
                  ^
    IndentationError: expected an indented block


    das kann aber daran liegen dass ich drei Sensoren im Einsatz habe.
    Was definitiv funktioniert ist:

    Die Wert(e) für pathes sind natürlich anzupassen überflüssige zu sind zu Lösen. Die Ausgabe sieht bei mir dann so aus:


    Ich empfehle dir dazu den Artikel auf dieser Seite - nicht jedoch die Schaltung -da bleib bei deiner:

    Gruß aus der Stadt der CeBIT
    Jochen

  • Hallo AliceDeh,

    was sagt Dir denn

    Code
    uname -a

    Wenn hier irgendwas mit 3.18 kommt, dann mach noch den hier Stichwörter suchen

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Found it!

    sudo nano /boot/config.txt

    add :

    dtoverlay=w1-gpio

    Das musste ich in die Datei schreiben noch jetzt aknn ich ihn auslesen :) Ich danke für eure Hilfe!!

    RaspiJo: Ich habe versucht deine Schleife nachzubauen.

    def read_sensor(/sys/bus/w1/devices/28-0000065fa6c1):
    value = "U"
    try:
    f = open(/sys/bus/w1/devices/28-0000065fa6c1, "r")
    line = f.readline()
    if re.match(r"([0-9a-f]{2} ){9}: crc=[0-9a-f]{2} YES", line):
    line = f.readline()
    m = re.match(r"([0-9a-f]{2} ){9}t=([+-]?[0-9]+)", line)
    if m:
    value_c = float(m.group(2)) / 1000.0
    value_f = value_c * 9.0 / 5.0 + 32.0
    f.close()
    except (IOError), e:
    print time.strftime("%x %X"), "Error reading", /sys/bus/w1/devices/28-0000065fa6c1, ": ", e
    log('Error reading : No such file or directory:', datei)
    return value_c, value_f, /sys/bus/w1/devices/28-0000065fa6c1

    Ich hoffe mal das klappt jetzt :)

    FUNKTIONIERT
    cd /sys/bus/w1/devices
    cd 28-0000065fa6c1
    cat w1_slave

    HABE ICH IN DEN SYSTEMSTART EINGEFÜGT
    sudo modprobe w1-gpio pullup=1
    sudo modprobe w1-therm

    Syntax Error bei:

    def read_sensor(/sys/bus/w1/devices/28-0000065fa6c1):
    ^ invalid syntax

    Was ist beim Pfad falsch?

    PS:

    import os, glob, time

    os.system(′modprobe w1-gpio′)
    os.system(′modprobe w1-therm′)

    base_dir = ′/sys/bus/w1/devices/′
    device_folder = glob.glob(base_dir + ′28*′)[0]
    device_file = device_folder + ′/w1_slave′

    def read_temp_raw():
    f = open(device_file, ′r′)
    lines = f.readlines()
    f.close()
    return lines

    def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != ′YES′:
    time.sleep(0.2)
    lines = read_temp_raw()
    equals_pos = lines[1].find(′t=′)
    if equals_pos != -1:
    temp_string = lines[1][equals_pos+2:]
    temp_c = float(temp_string) / 1000.0
    temp_f = temp_c * 9.0 / 5.0 + 32.0
    return temp_c, temp_f

    while True:
    print("temp C=%f\ttemp F=%f" % read_temp())
    time.sleep(1)

    Funktioniert absolut klasse! Ich bekomme nun jede Sekunde das genau Ergebnis in C und F angezeigt. Sehr schön :)

    RaspiJo doch was ist mit deiner Schleife? Ich würde auch diese gerne mal testen, aber was stimmt bei dem PFad nicht?

    Gruß

    Einmal editiert, zuletzt von AliceDeh (28. Februar 2015 um 15:27)

  • Was muss für Path rein? Ich habe den kompletten Pfad angegeben wie oben in dem Code. Doch er sagt falsche Syntax /sys/bus/w1/...

  • An dieser Stelle muss gar nichts für "path rein"!
    Path ist der Übergabeparamter für dir Funktion read_sensor! Ich Zerlege mal das Ganze.
    Hier stehen die allgemeinen Definitionen:


    Nun folgt die Fehlerbehandlung, wobei beim Aufruf dieser Funktion

    Code
    log('Error reading : No such file or directory:', datei)


    der Wert für msg in der Klammer mitgegeben wird.


    Und die Funktion mit der Fehlermeldung


    Der Wert für Path wird beim Aufruf mitgegeben:

    Code
    print("temp C=%f\ttemp F=%f\tQuelle=%s"% read_sensor(path))


    Nun zum Hauptteil, der bei dir simpel ausfällt, da du nur einen Sensor hast:

    Code
    path="/sys/bus/w1/devices/28-0000065fa6c1/w1_slave"
    ######### Heinzung.py itself ####################
    # Endlosschleife
    while True:
        print("temp C=%f\ttemp F=%f\tQuelle=%s"% read_sensor(path))


    Der Wert für den path wird definiert und dann die Endlosschleife gestartet.
    So, jetzt gilt wieder probieren geht über studieren.

    PS: Das mit dem Übergabeparameter funktioniert in allen Programmiersprachen so. ;)

    Gruß aus der Stadt der CeBIT
    Jochen

  • Ich korrigiere mich. Deine Posts waren vollkommen korrekt alle gesamt, ich habe sie nur falsch interpretiert.

    Jetzt steh ich nur noch vor einem Problem:

    Was muss ich unten in diesem Code für "datei" einsetzen? Er meckert dort, weil "datei" nicht deklariert ist.

    Einmal editiert, zuletzt von AliceDeh (28. Februar 2015 um 17:25)

  • Traceback (most recent call last):
    File "temp_ds18b20.py", line 54, in <module>
    print("temp C=%f\ttemp F=%f\tQuelle=%s"% read_sensor(path))
    File "temp_ds18b20.py", line 42, in read_sensor
    return value_c, value_f, path
    UnboundLocalError: local variable 'value_c' referenced before assignment

    Ok ist erledigt :)

    Was sagst du dazu?

    Hier nochmal der komplette Code:

    Einmal editiert, zuletzt von AliceDeh (28. Februar 2015 um 18:26)

  • Tausch mal diesen Code


    gegen diesen aus:

    Code
    path = "/sys/bus/w1/devices/28-0000065fa6c1/w1_slave"
    
    
    # Endlosschleife
    while True:
        print("temp C=%f\ttemp F=%f\tQuelle=%s"% read_sensor(path))


    Und vergleiche das mal mit dem Code den ich im Thread 35 gelefert habe. Manch mal sind auch die kleinen Details von großer Bedeutung.
    Ich gehe davon aus, dass dein Sensor die Kennung 28-0000065fa6c1 hat! Sonst ist die Zeile entsprechend anzupassen.

    Gruß aus der Stadt der CeBIT
    Jochen

    Einmal editiert, zuletzt von RasPi-Jo (28. Februar 2015 um 18:38)

  • Ähm?^^

    Was machen wir nun mit "value_c"? :lol:

    Jawoll!!

    Vielen Dank RasPi-Jo für deine Unterstützung meines Projektes.

    Ich musste in deiner neuen Code-Zeile nur noch "while true" auf while True" ändern und jetzt läuft es. Ich danke dir, meine andere Lösung aus dem Buch war zwar auch korrekt, aber durch deinen Code und deine Tipps weiß ich nun wie ich auch die Werte mehrerer Sensoren anzeigen lassen kann.

    Hier nochmal die korrekten Lösungen.

    MEHRERE SENSOREN: pathes = ( "/sys/bus/w1/devices/28-0000065fa6c1/w1_slave", "", "")



    EIN SENSOR: pathes = ("/sys/bus/w1/devices/28-0000065fa6c1/w1_slave","", "")

    ANDERE LÖSUNG FÜR EINEN (1x) SENSOR:

    Ich danke auch allen andere die sich bemüht haben mir zu helfen.

    Code
    # path and name of the log file
    logfile = '/var/log/heizung/error.log'

    Der Ordner "Heizung" muss natürlich per Hand in "/var/log" erstellt werden. ;)

    PS: Der Code von RasPi-Jo läuft schneller und performanter.
    Die Anzeige nimmt auch die Temperaturänderung schneller war als die zweite Variante.

    Ich erkläre den Thread als

    -----CLOSED-----

    Einmal editiert, zuletzt von AliceDeh (28. Februar 2015 um 19:12)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!