Eine weitere Lichtmessung

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Grüße,

    ich bin im Besitz eines Photoresitors und Widerständen.

    Ich besitze aber nur 100uF, 10uF und 100nF Kondensatoren.

    Ich würde gern ein paar Links oder Vorschläge für eine Schaltung von euch erhalten wollen, sofern ihr ein paar gute Tipps habt, dann nehme ich sie gerne an.

    Ich besitze kein Wissen darüber wie man einen Photoresistor in die Schaltung einbringt.
    Desweiteren auch nicht wie ich die Daten in Raspian erfasse. Ich freue mich über Unterstüzung.

    Ich habe diese Schaltung nachgebaut:

    [/img]

    Ich benutze dazu folgendes Skript:

    Ich führe aus mit: sudo python pot_step.py

    11
    11
    11
    11
    9
    13
    13
    13
    4
    12
    12
    12


    Ich benutze 2x 1k Widerstände und statts dem 220nF Kondensator wie auf der Zeichnung einen 100nF Kondensator.

    Wie soll ich die Daten nun interpretieren?
    Es ist ein schwankender Wert trotz des gleichen Lichtes (Glühbirne ist an und Draußen ist es dunkel).

    Was ist der Unterschied zwischen den 220 und 100nF? Kommen dadurch die Schwankungen?

    Gruß

    Einmal editiert, zuletzt von AliceDeh (7. März 2015 um 03:42)

  • Hallo AliceDeh,

    der Kondensator wird entladen. Die Zeit bis zum Aufladen (erzeugt einen Pegel auf einem GPIO-Eingang) wird gemessen.

    Deine Zeiten entsprechen somit den Aufladezeiten des Kondensators.

    Interpretationsmöglichkeiten:

    Je kürzer die Zeiten, um so heller ist es / um so geringer ist die Kapazität des Kondensators.

    Da die Zeiten extrem schwanken, ist die Schaltung für eine Messung so nicht geeignet. Unter gleichbleibenden Bedingungen würde ich ähnliche Zeiten erwarten.

    Wenn man allerdings die beiden Ausreißer herausnimmt, dann sind die Zeiten (überraschend) konstant.

    Andererseits gibt eine Lichtquelle nicht immer die konstante Lichtstärke ab. Somit könnte man auch die beiden Ausreißer erklären.

    Was Du machen solltest: Einen Kondensator mit deutlich höherer Kapazität einsetzen. Dann sind die Zeiten bzw. Programmdurchläufe wesentlich größer.

    Der Photoresistor (so es einer sein sollte) wird genauso angeschlossen wie ein normaler Widerstand. Ein Photoresistor ändert seinen Widerstand in Abhängigkeit der Lichtstärke / Helligkeit.


    Da Du letztens mit Icon begonnen hast, hier die Version in dieser Programmiersprache:

    Dann halte ich die Entladezeit für zu gering. In meiner Programmversion habe ich die Verzögerung willkürlich auf 2000 ms gesetzt. Das erscheint mir wesentlich sinnvoller als der Versuch, einen Kondensator innerhalb von 5 ms entladen zu wollen.


    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.

    Einmal editiert, zuletzt von Andreas (7. März 2015 um 12:11)

  • :heart: :heart: :heart:

    Die Programmiersprache ist echt Klasse!! Wirklich sehr geeignet für Einsteiger.

    Eine kruze Anmerkung:
    Wenn der Photoresistor, wie der Name schon sagt, selber ein Widerstand. Wozu benötige ich dann zusätzlich noch zum Kondensaor die beiden anderen Widerstände in der Schaltung?

    PS: Ich feier das Skript :) Das ist so einfach geschrieben *_*

    Einmal editiert, zuletzt von AliceDeh (7. März 2015 um 12:02)

  • Hallo AliceDeh,

    Die Widerstände brauchst Du als Lebensrettungsmaßnahme für den Raspberry Pi.

    Wenn der Kondensator aufgeladen ist, dann liegt an seinen beiden Beinchen die Ladespannung an (U = 3,3V). Und wenn er sich entladen will, dann macht er das so schnell es geht. Notfalls wie bei einem Kurzschluss mit Funkensprühen. Sieht irre aus - muss man mal gesehen und erlebt haben. Aber bitte nicht direkt am Raspberry Pi!

    Der Widerstand R verringert nach dem Ohmschen Gesetz U=RI die Stromstärke I. Und somit fließt über die GPIO ein Strom, den Du erstmal selber ausrechnen solltest und der zweitens so um die 2 mA liegen sollte. 4 mA oder 6 mA oder dergleichen geht auch noch. Fließt aber ein Strom von > 50 mA, dann macht der Raspberry Pi die Grätsche. Er ist hinüber... =( und wird von einem Bastel-Computer zu einem Klumpen Elektronik-Schrott.

    Deswegen der Widerstand in dieser Schaltung. Deswegen der Vorwiderstand bei LEDs etc.


    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.

  • Es sind 220 Ohm.

    U = R * I

    I = U / R I = 3.3V / 220 I = 0,015A = 15mA ?

    Ich glaube habe auf jeden Fall einen Denkfehler, denn das Raspberry ist noch nicht kaputt :'D

    Desweiteren würde ich gerne noch einige Verständnisfragen zu deinem Code klären :)
    Ich dokumentiere immer mein Denken als Anfänger, da wenn jemand mal diesen Thread liest eventuell auch noch diese "Denkfehler" macht. :)

    Analyse des Skriptes:

    Code
    link GPIO
    
    
    $define a_pin 18
    $define b_pin 23

    a_pin = gpio pin nr. 18
    b_pin = gpio pin nr. 23

    Alles verstanden.

    Code
    procedure discharge()
        x := GPIO(a_pin)
        GPIO(b_pin, 0)
        delay(2000)
    end

    Erste Frage als Anfänger: Weshalb kommt die Entladung (dischage) vor der Aufladung(charge) ?
    Zweite Frage: Du weißt der Variable "x" den GPIO(a_pin) zu, aber Variable "x" wird nirgends weiter angewand?!
    "Delay" ist klar - Wiederholung auf 2000ms :)

    Code
    procedure charge_time()
        x := GPIO(b_pin)
        count := 0
        GPIO(a_pin, 1)
        while not (GPIO(b_pin)) do count +:= 1    # oder: while GPIO(b_pin) = 0 do count +:= 1
        return count
    end

    1.: Warum wird wieder "x" definiert?
    2.: GPIO(a_pin,1) - Steht die "1" für "ein" bzw die "0" für aus?
    3.: Die While-Schleife ist klar für mich.

    Code
    procedure analog_read()
        discharge()
        return charge_time()
    end

    1.: Wieder zuerst Entaldung(discharge), statts Aufladung(charge) ?

    Code
    procedure main()
        repeat
        {   write(analog_read())
            delay(1000)
        }
    end

    Diese Prozedur verstehe ich auch.

    Bitte verstehe dies nicht als Kritik an deinem Post :D Es sind nur Fragen die mir nicht ganz klar sind :)
    Das Skript funktioniert einwandfrei richtig genial Andreas!!!

    Doch würde ich auch gerne den kompletten Inhalt verstehen.

    Schönes Wetter heute :) Ich geh erstmal in Garten. Ich wünsche euch und vorallem dir Andreas ein angenehmes Wochenende!!

    Ich freue mich darauf nachher mit euch wieder zu Tippen!!

    Gruß Kevin

    Einmal editiert, zuletzt von AliceDeh (7. März 2015 um 12:27)

  • Hallo Kevin,

    Zum Widerstand: Mit 1650 Ohm würde ein Entladestrom von exakt 2 mA fließen.

    Dass bei Dir noch nichts kaputt gegangen ist,liegt daran, dass insgesamt kein Strom von mehr als 50 mA entnomen wurde. Abfließen darf wohl mehr. Andererseits fließt beim Aufladen ebenfalls ein Strom. Beim Aufladen besteht eine Spannung von 3,3V über GPIO und GND - allerdings mit 2 Widerständen. Dein 220 Ohm Widerstand sowie der Photowiderstand. Soweit ich mich entsinne hat der einen Widerstand von mehreren kOhm (Dunkelheit) sowie einigen wenigen Hundert Ohm bei Belichtung. Somit fließt beim Aufladen ein Aufladestrom von << 15 mA.

    Kritisch würde es werden, wenn insgesamt mehr als 50 mA über 3V3 bzw. alle über GPIO zu GND fließen. Also ist Vorsicht angebracht!


    Die Entladung wird vor der Aufladung durchgeführt, um einen möglichst identischen Ausgangszustand herbeizuführen. Ein Kondensator ist in der Lage, seinen Ladezustand über Tage hinweg aufrechtzuerhalten, wenn er keine Möglichkeit hat, sich zu entladen.


    Code
    x := GPIO(a_pin)

    habe ich aus didaktischen Gründen so geschrieben.

    Ich hätte auch

    Code
    GPIO(a_pin)

    schreiben können.

    Wie Dir bestimmt aufgefallen ist, wird sowohl zum Auslesen und zum Setzen eines GPIO-Pins der gleiche Befehl GPIO() verwendet.

    Dies habe ich mit Absicht so in der GPIO-Library programmiert.

    Code
    GPIO(pin, status, dauer)


    setzt einen GPIO-Pin [font="Courier"]pin[/font] auf einen Wert [font="Courier"]status[/font] und behält dies für die Zeit [font="Courier"]dauer[/font] [in ms] aufrecht.
    Hierbei gibt es zwei Werte für [font="Courier"]status[/font]: 0 oder 1, aus oder ein, LOW oder HIGH, ...

    Fehlt die Angabe [font="Courier"]dauer[/font], dann bleibt der Wert [font="Courier"]status[/font] dauerhaft erhalten.

    Tja, und fehlt auch die Angabe [font="Courier"]status[/font], dann geht die GPIO-Library davon aus, dass der GPIO-Pin [font="Courier"]pin[/font] ausgelesen werden soll.

    Daraus ergibt sich auch, dass bei Setzen des Parameters [font="Courier"]status[/font] der betreffende Pin [font="Courier"]pin[/font] als Ausgang geschaltet wird - fehlt [font="Courier"]status[/font] dagegen, wird der GPIO-Pin auf Eingang geschaltet.

    Und um das Auslesen, was immer mit der Übergabe des Ergebnisses verbunden ist, so richtig deutlich zu machen, habe ich

    Code
    x := GPIO(pin)

    geschrieben. Normalerweise bist Du ja beim Auslesen eines GPIO-Pins am ausgelesenen Wert interessiert. In dem Programmbeispiel wird der GPIO-Pin auf Eingang geschaltet, um das Entladen des Kondensators feststellen zu können. Hier geht es nur um einen Pegelwechsel.

    [font="Courier"]delay()[/font] verzögert die Programmausführung um die entsprechende Zeit in ms.

    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.

  • Hallo Kevin,

    momentan programmiere ich an einer Prozessleitsteuerung mit Visualisierung der Prozessdaten / -verläufe. Für den Fall schneller Prozesse habe ich die Kondensatorschaltung verwendet. Dabei sind mir folgende Dinge aufgefallen, auf die man auch durch vorheriges Nachdenken - also "Vordenken" hätte kommen können / müssen.

    Ausgangspunkt waren die Zeiten, die für das Laden / Entladen erforderlich sind. Mir kamen diese etwas arg kurz vor.

    Die Hardware meiner Prozesssteuerung verfügt gegenüber dem Raspberry Pi über einige echte Analog-Eingänge.

    Du musst wissen, dass der Raspberry Pi einen Digital-Eingang als LOW erkennt, wenn die Potentialdifferenz < 0,8 Volt beträgt. HIGH wird erkannt, wenn die Potentialdifferenz > 1,3 Volt beträgt. Daraus folgt, dass sich Dein Programm und auch meine Icon-Version ständig innerhalb dieses Unbestimmtheitsbereiches bewegt. Es findet niemals eine echte Entladung auf nahezu 0 V und niemals eine echte Aufladung auf nahezu 3,3V statt.

    Die am Digital-Eingang anliegende Potentialdifferenz fällt über einen Widerstand ab, somit misst Du physikalisch gesehen einen Stom. Du müsstest die am Digitaleingang anliegende Potentialdifferenz über einen Analog/Digital-Wandler auslesen und innerhalb der Entladungsroutine auf den Wert von annähernd 0 sowie bei der Aufladeroutine von annähernd 3,3 V abfragen.


    Die Abbildung, die mich stutzig gemacht hat, habe ich mal zur Verdeutlichung angehängt. Diese hat nur ganz grob Ähnlichkeit mit der Entladung / Aufladung eines Kondensators, wie man es aus den Physik-Büchern her kennt. Denn hier ist nur der mittlere Teil enthalten (zwischen 0,8 und 1,3 Volt). Der Rest geht aufgrund der oben geschilderten HIGH-LOW-Bereiche verloren.

    Beste Grüße

    Andreas

    Bilder

    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.

  • Grüße,

    Zitat


    GPIO(pin, status, dauer)
    setzt einen GPIO-Pin pin auf einen Wert status und behält dies für die Zeit dauer [in ms] aufrecht.
    Hierbei gibt es zwei Werte für status: 0 oder 1, aus oder ein, LOW oder HIGH, ...

    Fehlt die Angabe dauer, dann bleibt der Wert status dauerhaft erhalten.

    Tja, und fehlt auch die Angabe status, dann geht die GPIO-Library davon aus, dass der GPIO-Pin pin ausgelesen werden soll.

    Daraus ergibt sich auch, dass bei Setzen des Parameters status der betreffende Pin pin als Ausgang geschaltet wird - fehlt status dagegen, wird der GPIO-Pin auf Eingang geschaltet.

    Das ist sehr sehr clever und möchte ich deshalb hervorheben, da es anderen sicher von Nutzen sein kann.

    Wenn ich alles richtig verstanden habe, dann weiß ich jetzt, dass meine "Daten" die vom Kondensator kommen - welche wiederum beeinflusst werden vom Photowiderstand - verfälscht sind, weil das Pi den "HIGH-Pegel" bzw. "LOW-Pegel" nicht korrekt verarbeitet/ausliest/verwertet !?

    Sehr interessant doch bin ich immer noch auf Kriegsbeil mit "LOW" und "HIGH". Noch ist mir da nicht alles klar. :wallbash:

    Aber ich denke doch den Grundgedanken verstanden zu haben den du mir vermittelst.

    Was machen wir denn aber nun, damit der Digital-Eingang meines Raspberrys die "LOW" und "HIGH" Zuständen korrekt ausliest/verarbeitet/verwertet?

    Gruß

    Einmal editiert, zuletzt von AliceDeh (17. März 2015 um 18:50)

  • Hallo Kevin,

    Zitat


    Wenn ich alles richtig verstanden habe, dann weiß ich jetzt, dass meine "Daten" die vom Kondensator kommen - welche wiederum beeinflusst werden vom Photowiderstand - verfälscht sind, weil das Pi den "HIGH-Pegel" bzw. "LOW-Pegel" nicht korrekt verarbeitet/ausliest/verwertet !?

    Nö. Der Photo-Widerstand verändert die Stromstärke und hat damit Einfluss auf die Auflade-Zeit. Und bei der Schaltung, wie Du sie gepostet hast, auch nur auf diese. Eine Entladung findet relativ schnell statt, da da ja kein Widerstand im Spiel ist.

    Der Photowiderstand verfälscht gar nichts, Du siehst aber einen Einfluss auf die Aufladekurve.


    Zitat


    Sehr interessant doch bin ich immer noch auf Kriegsbeil mit "LOW" und "HIGH". Noch ist mir da nicht alles klar. Icon_wallbash

    Aber ich denke doch den Grundgedanken verstanden zu haben den du mir vermittelst.

    Was machen wir denn aber nun, damit der Digital-Eingang meines Raspberrys die "LOW" und "HIGH" Zuständen korrekt ausliest/verarbeitet/verwertet?


    Dein Digital-Eingang liest die LOWs und HIGHs korrekt aus, da er bei U < 0,8 V korrekt LOW meldet und bei U > 1,3 V HIGH meldet. Dein Programm und meine Icon-Version ermitteln lediglich die Zeiten zwischen diesen Pegel-Wechseln. Und eigentlich nicht die Zeiten, sondern die Anzahl der Schleifendurchläufe.

    Wenn Du eine Kurve haben möchtest, wie sie in Physikbüchern steht, musst Du die Software ergänzen.

    Es wird nicht zwischen 0,8 V und 1,3 V gefahren, sondern auf die Ladespannung 3,3 V aufgeladen und auf 0,0 V entladen.

    Das heißt, Du musst den Strom messen. Das ist am einfachsten, indem Du die Potentialdifferenz an einem Widerstand misst. U = R * I. Kennst Du den Widerstand und misst die analoge Größe Spannung, dann kannst Du den Strom ausrechnen: I = U / R.

    Heute habe ich einen Thread geschrieben, der sich rein zufällig genau mit dieser Thematik beschäftigt.

    Suche mal nach

    Code
    SPI Icon

    :thumbs1: Bei mir kommt das sogar als erster Link!

    Dort habe ich beschrieben, wie die analoge Größe Spannung über den Analog-Digital-Wandler MCP 3208 ausgelesen werden kann.

    Wenn Du Dein Kondensator-Programm mit dem anderen Programm sinnvoll kombinierst, und den Bereich mit dem Kondenstor anpasst, dann kommen da besserer Kurven heraus.

    Entladung bedeutet dann NICHT: wenn LOW auf Digital-Eingang.
    SONDERN: Es fließt kein Entladestrom, also U ist annähernd 0 V.

    Aufladung bedeutet dann NICHT: wenn HIGH auf Digital-Eingang.
    SONDERN: Es liegt eine Spannung am Kondensator an, die sich als Anteil dieses Widerstandes am Gesamtwiderstand berechnet. Wenn der Kondensator in Abhängigkeit der Ladespoannung aufgeladen ist, entlädt er sich


    In diesem Fall ist die Zeit zwischen Beginn der Aufladung und dem Beginn der Entladung interessant...


    Ich denke, dass sowohl die Schaltung als auch die Software eine schöne Übungsaufgabe für Dich sind, oder?

    Bedenke dabei, dass Du nie exakt 0,0000 V messen wirst. Sicherlich reicht es aus, wenn 0,01 V oder ein anderer kleiner Wert erreicht werden. Ebenso verfährst Du mit der maximalen Ladespannung.


    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.

    2 Mal editiert, zuletzt von Andreas (12. Oktober 2017 um 21:14)

Jetzt mitmachen!

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