Ich habe einen digitalen Stromzähler in der Wohnung der nur eine Summe anzeigt, aber nicht den aktuellen Verbrauch in Watt.
Habe es gestern programmiert - allerdings gibt es eine kleine Abweichung zum Richtigen Zähler. Die LED blitzt nur kurz auf und ich habe kur ein LDR da. Loop hat nen sleep von nur 10ms.
Kann man das irgendwie mit eine Fototransistor lösen? Und wie sehe ich zu dass ich kein HIGH verpasse?
Die Folge der Blitze ist begrenzt: 1000 Stück = 1 kW/h
D.h. 1000 LED-Blitze in einer Stunde = 1 kW/h = je 3.6 Sek ein mal Blitzen.
Bei 5000 Watt sind es also gerade mal je 720 ms ein mal Blitzen.
Mit interrupts habe ich mich boch nicht beschäftigt. Wenn ich es richtig verstehe würde dies, kombiniert mit einem Fototransistor, das ganze lösen können.
Warum so viel ?
Und was meinst du mit "hat nen sleep" ?
Ein Blitz den du sehen kannst, sollte so ca. 10 ms oder länger sein. Das sollte auch ein LDR erkennen können.
Aber ein Phototransistor ist natürlich schneller. Aber Arduino Interrupts brauchst du nicht unbedingt, wenn du den "sleep von nur 10 ms" weglässt.
Mach doch einen Testsketch, der dir zeigt, wie lang ein Blitz dauert, wenn du ihn mit nem LDR erfasst.
(Und wie häufig einer kommt)
Dann kannst du immer noch sehen, ob da was verloren geht oder ob es doch nicht geht.
Die Einheit die da gezählt wird, ist übrigens kWh ( nicht kW/h ).
ein Fotowiderstand ist zu langsam um kurzes aufflackern der LED zu erkennen.
720mS sind für einen Kontroller eine Evigkeit.
Du brauchst keinen Interrupt Polling reicht völlig.
Wieso schaust Du dir nicht ein bereits pubbliziertes Projekt nach?
Grüße Uwe
Ja das habe ich bereits auch recherchiert - Das Problem scheint zu sein, dass die LDR sich "erholen" muss und bei schneller Blitzfolge dann nicht jeder Blitz erkannt wird. Das habe ich vorhin gesehen, als der Wasserkocher lief (2800 Watt) - die Anzeige hat zwischenzeitig auch 1400 Watt angezeigt. D.h. ein Signal wurde verschluckt.
Fertiges Sketch für Blitz-Erkennung habe ich nicht gefunden. Zumindest nicht mit LDR.
Ich hätte da noch ne Sensorplatine für Hinderniserkennung. Ich denke mal es ist ne IR-LED + ne Foto-Diode. Theoretisch müsste diese mit der roten LED des Stromzählers funktionieren, oder?
Sonst sollen LEDs auch als Sensor funktionieren. Klare, ultrahelle rote hätte ich da.
genau das wollte ich damit anmerken...Arduseitig kein Ding sowas.
michael_x:
Warum so viel ?
Und was meinst du mit "hat nen sleep" ?
Ein Blitz den du sehen kannst, sollte so ca. 10 ms oder länger sein. Das sollte auch ein LDR erkennen können.
Aber ein Phototransistor ist natürlich schneller. Aber Arduino Interrupts brauchst du nicht unbedingt, wenn du den "sleep von nur 10 ms" weglässt.
Am Ende der loop() Funktion. 10 MS Sleep = 100 mal AnalogRead, was ja völlig ausreicht um ein EIN der LED von der mehrfachen länge in min. 400-600 ms Abstand zu erfassen.
Aktuell läufts per Netzteil, wobei ich das aber gerne auf Akkubetrieb umstellen will, damit beim Stromausfall noch weiter erfasst wird (uralter Sicherungskasten in dieser Wohnung...paar mal pro Woche fliegt Sicherung raus wg. Überlastung beim Einschalten von Geräten). Richtiges Energiesparen wird noch eingebaut - für Anfang nur nen delay drin um die optimale Dauer zu ermitteln.
Die Blitze würde ich auf ~50 ms schätzen, da man das noch gut wahrnehmen kann (beim Test mit Taschenlampe die auch nur schnell drüber Fuhr hat 3-5 Messungen erfasst bei 10ms Delay).
Nur braucht der LDR anscheinend ein mehrfaches davon um sich zu erholen. LED aus = Analogread von 20..50. Grenze für AN-Erkennung liegt bei 200. Beim Blitzen wird normalerweise etwas um 300-600 gemessen.
Die LED 'kommt' nur alle 400...600ms - aber dann ist Diese auch nur für wenige ms am Leuchten.
Wenn Du davon jetzt 90% der Zeit verschläfst, könnten Dir ggf. Impulse verloren gehen.
Was ist so schlimm daran, daß der Arduino dann halt 700x an dieser Stelle vorbei kommt und 'sieht', daß Er gerade Nichts zu tun hat?
Die 'Rennerei', also der Stromverbrauch, ist bei delay() nicht anders, als wenn Du was sinnvolles in der Zeit machst - also wieder nur mögliche Probleme durch delay() - jo mei - wenn's schee macht, kannst des och so lass'n.
Da Du zur Erfassung der Blitze eh nen Fototransistor , oder ne Fotodiode nehmen musst, kannst du das Signal auch digital einlesen, also nicht analogRead, sondern digitalRead. Fototransistor/-diode dann natürlich an nem Digitalinput.
Ob die Fotodiode auch mit Sichtbarem Lichtspektrum arbeitet, musst Du erst ausprobieren. Manche IR-Fotodioden haben nen Filter eingebaut, der NUR oder fast nur IR durchlässt.
Deshalb kann ich nicht genau sagen , ob Deine Fototdiode auch für normales , sichtbares rot Empfindlich ist.
Die Farbe einer Roten LED ist nunmal nicht Infrarot, LED's haben die Eigenschaft ihr licht in einem recht engen Spektrum abzugeben - im Gegensatz zu Glühlampen.
Wenn Du den Typ der Fotodiode ablesen kannst (falls er aufgedruckt ist), kannst Du das Datenblatt der Diode konsultieren, da ist das Empfangs-Spektrum aufgezeichnet.
@Tommy56:
Oh ja, hast natürlich Recht, daran hab ich gar nicht mehr gedacht. Dass diese Pins (auch) als Analogeingang fungieren ist ja ein zusätzliches Feature dieser Pins.
Richtig ist, dass LDR (Fotowiderstände) langsamer sind als Fototransistoren oder gar Fotodioden. "Langsam" ist aber relativ! Auch ein Fotowiderstand kann problemlos Impulsfrequenzen bis zu einigen hundert Hertz folgen, nur eben nich Kilo- oder Megahertz ...
Die LED 'kommt' nur alle 400...600ms - aber dann ist Diese auch nur für wenige ms am Leuchten.
Wenn Du davon jetzt 90% der Zeit verschläfst, könnten Dir ggf. Impulse verloren gehen.
Geschätztes 50 ms "Blitzen" / 10 = 5 mal hat der Arduino Zeit das als HIGH zu erkennen - wieso sollte er das verpassen?
Habe das Delay/Sleep raus genommen gegen Mitternacht..prüfe nach der Arbeit inwieweit die Zähler auseinander gehen. Glaube nicht, dass es damit jetzt läuft. Zumindest nicht, wenn größere Verbräuchte anstehen. Bei aktuell nur Kühlschrank mit 100..150 Watt blinkt die led ja nur eetwa 2.3 mal pro Minute.
Das Problem ist dann eher wenn z.B. Wasserkocher und Herd gleichzeitig laufen, was ~6 kW entspricht. Aber schon beim Wasserkocher besteht das Problem, dass der ab und an nur die Hälfte anzheigt, also nicht alles mitbekommt, wie gestern Nacht noch geprüft ("2800...1400...2800..2800..").
Wenn der also trotzdem was verpasst, werd ich mal so ne Fotodiode nehmen. Habe nen Set irgendwann bei Pollin gekauft (transparent-blaue 3mm IR LEDs denke ich + so nen kleiner schwarzer "Kasten" mit kleiner Wölbung auf einer Seite. Fotos im Netz nach wohl eine Fotodiode).
@DeltaFlyer: das mit IR ist mir schon bewusst Kann aber schon passieren dass die rote LED mehr in IR strahlt bzw. der IR-Sensor noch ein wenig vom sichtbaren erwischt.
Sonst probier ich das echt mal mit ner roten Diode als Fotodiode.
Wenn du was verpasst, dann weil der Blitz zu kurz ist und du loop vermurkst hast (delay).
Selbst bei hoher Last sollte die Pause zwischen den Blitzen nicht kürzer sein als der Blitz.
//-LED an und eben aus gewesen? if(MeterLedState && !MeterLedStateLast)
{
...
}
MeterLedStateLast = MeterLedState;
DisplayRefresh = millisDisplay < MillisActual;
if (DisplayRefresh)
{
millisDisplay = MillisActual + 50; //333; //-Refresh time in ms DrawGraph();
}
In DrawGraph() gebe ich u.a. val_LDR auf dem TFT aus + MeterLedState in Forum eines Kreises (gelb = TRUE, dunkelgrau = FALSE).
MeterLedHighLevel stelle ich mittlerweile per Poti ein, welches aktuell auf 188 steht (bei ausgeschalteter LED am Zähler ist val_LDR zw. 50 und 100).
Geht die LED an, dann sprint val_LDR auf einen Wert zw. 250 und 9xx - also definitiv über 188.
MeterLedState scheint aber nicht immer auf TRUE zu gehen, da der Kreis nicht gelb gezeichnet wird.
Display wird alle 50 ms aktualisiert. Zustand der LED oberhalb MeterLedHighLevel ist also gut sichtbar und mehr als eine Bildschirmaktualisierung darüber (2-3 Frames - das Blitzen ist also doch länger als 50 ms).
Doc_Arduino:
ich gebe dir einen Tipp. Suche nach "Smartmeter auslesen" oder "Volkszaehler" oder "SML Telegramm" bevor du dich verrennst.
Ich verrenn mich nicht. Das Problem ist nicht das Programm sondern der Sensor. Code ist korrekt (bin Anwendungsentwickler und programmiere schon seit mittlerweile 28 Jahren..auch Hardware im Bereich Maschinendatenerfassung. Also Ja, ich weiß was ich da tue
Heute Früh noch mal gecheckt: Die Spitzen über 900 sind nicht >900 sonder 9x...die blöde Adafruit-Grafiklib flackert extrem wenn man Bildschirm leert, weshalb ich das nicht mehr mache, sondern Texte überschreibe. Wenn eine Zahl dann von 3 auf 2 Stellig wechselt, dann bleibt die dritte Stelle erhalten (linksbündige Ausgabe). Müsste für die Ausgabe also immer auf die maximale Stellenanzahl formatiere. Erstmal aber egal - ist ja nur ne Debug-Ausgabe zum Prüfen des Wertes.
Dennoch besteht das problem, dass nicht jeder Takt da ist. D.h. Sensor muss getauscht werden. LDR ist für sowas nicht zu gebrauchen. Werde es heute Abend mit einer de superhellen roten LEDs als Fotodiode probieren.
AlphaRay:
Code ist korrekt (bin Anwendungsentwickler und programmiere schon seit mittlerweile 28 Jahren..auch Hardware im Bereich Maschinendatenerfassung. Also Ja, ich weiß was ich da tue
Gerade dann solltest Du wissen, dass im Falle eines Problems/Fehlers meist die Suche 45cm vor dem Bildschirm beginnen sollte
Wie kommen denn die Daten zu Deinem Display (Rhetorische Frage)? Alle 50ms überträgst Du ein Update, welches auch eine gewisse Zeit beansprucht.
In dieser Zeit kannst Du natürlich Deinen AnalogInput nicht auslesen. Bzw. geht ggf. ein High an Dir vorbei.
Hast Du denn mal gemessen, wie lang die Diode leuchtet? Sketch ohne Display, ohne delay, welcher nur die Dauer berechnet, wenn Dein AnalogInput >188 ist?
Haha Die Software ist mehfach überprüft und getestet: halte ich die Drähte zusammen statt einer LDR dran, wird es immer korrekt erkannt und gezählt. So simuliere ich drüben am Rechner ob das ganze läuft. LDR hängt am Zähler mit Drähten nach Außen gelegt für die Experimentierplatine. Daher jetzt die Debug-Ausgaben auf dem Display für Echtbetrieb am Schrank.
Kann ja nicht messen, da ich bisher nichts bis auf das LDR nutze, welches ja so schon zw. 50 und 150 im dunklen Schrank hin und her schwankt und das Blitzen ab und an verpasst Und wenn es Blitzt "irgendein" Wert zw. ~200 und 800 erfasst wird. Ist einfach viel zu unzuverlässig bei kurze Lichtblitzen.
Könnte ja also nur die Dauer ausgeben wenn der Sensor so gnädig war auch was zu erkennen..das ist aber so unzuverlässig. Ich werd den einfach heute Abend durch ne LED tauschen.
Problem ist ja bei LDR, dass der Sensor sich langsam erholt. D.h. man erfasst nicht das Licht, sondern den Zeitpunkt wo das LDR endlich was erkannt hat + bis es sich "erholt" hat.
Das Display habe ich bis gestern je 500 ms aktualisiert - jetzt 50, da ich den LDR-Wert überwachen wollte.
WENN das LDR reagiert, dann sehe ich 2 - 3 Werte oberhalb der Grenze mit Erkennung als EIN.
Das Problem ist ja auch wenn das Display nur jede halbe Stunde aktualisiert wird + die LED nur jede paar Sekunden an geht. Das Zeichnen dauert nur wenige ms (kann das ja auch mal messen) und sollte nicht stören.
Hallo AlphaRay,
Du willst den LDR gegen eine LED tauschen? Du meinst doch sicher eine Photodiode oder Phototransistor die / der auch im sichtbaren Farbspektrum noch reagiert (gibt da viele , di zwar hauptsächlich für IR gebaut sind, aber auch im sichtbaren spektrum noch empfindlich genug sind, um deine LED-Blitze des Stromzählers zu erfassen.
Elektor hat mal versucht, eine normale rote LED als Lichtsensor zu nutzen, was durch (sehr) hohe verstärkung mit nem OP-AMP auch gelungen ist.
Was auch noch funktioniert ist: man nehme nen normalen NPN-Transistor im METAL-Gehäuse - gut geeignet sind da z.B BC140 im TO-39 Gehäuse oder wegen der grösseren chip-oberfläche nen 2N3055 im TO-3 Gehäüse und feilt den Kopf des Gehäuses soweit ab, bis der Chip sichtbar wird. Dann hast du auch nen brauchbaren Fototransistor. (hab ich selbst schon gemacht - funktioniert)
Du willst den LDR gegen eine LED tauschen? Du meinst doch sicher eine Photodiode oder Phototransistor die / der auch im sichtbaren Farbspektrum noch reagiert
Ich fürchte, AlphaRay will tatsächlich den Hack "normale LED als Photodiode verwenden" ausprobieren.
Wenn es darum geht, "weil ich sie rumliegen hab" spricht das vermutlich gegen einen opamp. Der ziemlich große erforderliche Vorwiderstand spricht gegen analogRead.
Für digitalRead muß der Vorwiderstand ziemlich groß sein und gut passen, fürchte ich. Und das nur weil die 50 ms Blitze zu kurz für einen LDR sein sollen?
Ich vermute, da verrennt sich gerade jemand.
Oder ich hab was falsch/nicht mitgekriegt.
michael_x:
Ich fürchte, AlphaRay will tatsächlich den Hack "normale LED als Photodiode verwenden" ausprobieren.
Wenn es darum geht, "weil ich sie rumliegen hab" spricht das vermutlich gegen einen opamp. Der ziemlich große erforderliche Vorwiderstand spricht gegen analogRead.
Richtig...rote, transparente "ultrahelle" LED (ultrahell stand irgendwo wären geeigneter bzw. empfindlicher) als "Fotodiode".
Die 50 ms sind ja geschätzt. ich denke das Problem hier ist nicht die Länge der Belichtung sondern die Trägheit des LDR, da der ja nicht immer reagiert, obwohl direkt vor die LED geklemmt und mit Alufolie abgeschirmt (=reflektierend).
Schau dir den Link von eben mal an. Durch einen sehr kurzen Blitz hat der LDR dann > 100 ms für's "Erholen" gebraucht.. Und es gibt natürlich auch unterschiedliche LDRs die unterschiedlich reagieren. Vielleicht habe ich ganz doofe da die halt nicht für sowas geeignet sind (Laut eMail von 2012 von Reichelt waren das LDR 07...oder von 2016 LDR 05)
Deltaflyer:
Elektor hat mal versucht, eine normale rote LED als Lichtsensor zu nutzen, was durch (sehr) hohe verstärkung mit nem OP-AMP auch gelungen ist
Was auch noch funktioniert ist: man nehme nen normalen NPN-Transistor im METAL-Gehäuse - gut geeignet sind da z.B BC140 im TO-39 Gehäuse oder wegen der grösseren chip-oberfläche nen 2N3055 im TO-3 Gehäüse und feilt den Kopf des Gehäuses soweit ab, bis der Chip sichtbar wird. Dann hast du auch nen brauchbaren Fototransistor. (hab ich selbst schon gemacht - funktioniert)
Cool..davon habe ich noch nicht gelesen! Danke für den Tipp - alte BC'ler habe ich in diversen Größen/Gehäusen rumfliegen...auch welche in Metall.
Ja das mit LED als Fotodiode habe ich in diveren Blogs/Foren gefunden.
Zwei BC548 reichen da wohl auch: