G
Gelöschtes Mitglied 4431
Guest
Smartphone als Luxmeter, die Idee ist nicht neu!
Leute, die seltenst Lux messen oder loggen, sprich aufzeichnen/aufnehmen/recording, oder mal schnell einen direkten Laufzeitdiagramm-Vergleich machen wollen, z.B. Tala1 w/ Treiber1 versus Tala1 w/ Treiber2 versus Tala1 w/ Treiber3, können das nun ganz einfach über die kostenlose funktionstüchtige App "Lux Meter" von Angstrom Metrology in Verbindung mit meinem Code machen.
Die kostenlose Variante hat Werbeeinblendungen, kann man aber wegklicken:
https://play.google.com/store/apps/details?id=com.angstrommetrology.luxmeter&hl=en
Die Bezahlvariante kostet 1€, dann hat man keine Werbung na super:
https://play.google.com/store/apps/details?id=com.angstrommetrology.luxmeterp
Die Logging-Abtastfrequenz beträgt etwa 9.6Hz auf meinem Handy, was sehr hoch ist ("zittrige Kurve"); für unsere Zwecke habe ich einen gleitenden Durchschnitt von ca. 3.0s gewählt. Die Bedienung der App ist selbsterklärend, ganz kurz das Wesentliche:
![](https://abload.de/thumb/codescreenshot46c5a.gif)
Der Code macht nichts anderes als die Daten aus den Textdateien (Plural!) säuberlich zu extrahieren und dann mit den built-in Funktionen visuell darzustellen. Die visuelle Darstellung kann Excel 2010 auch und tbh viel bequemer/schöner/leichter in der Nachbearbeitung, aber es ist doch ganz nett, dass man mit so wenig Programmieraufwand das ganze auch automatisieren kann. Per 1x Knopfdruck, sozusagen. Ausserdem stellt der Code sicher, dass die x-Achse automatisch und korrekt die Laufzeit darstellt, egal welche Abtastfrequenz das Handy-Modell (Samsung, Xiaomi, iPhone, Huawei, usf.) an Tag legt. Bei unterschiedlich langen Tests stimmt die Länge der x-Achse mit der längsten Run Time überein und zeigt die Zeit im schönen Zeitformat an. Mit Excel 2010 ist es bestimmt mühsam, die Achseneinteilung vorzunehmen, wenn man ~60000 y-Werte hat und man nur weiss, dass sie über einen Zeitraum von ~1h37min49s gleichmäßig verteilt sind. Da müsste man entweder umständlich umrechnen, oder man verlöre die Lust bei dem ganzen Hantier. Wer nur Excel hat, würde schnell das Testen dieser netten Smartphone-App aufgeben.
Außerdem ist es für den Code egal, ob die eine Datei in Foot-Candle und die andere Datei in Lux aufgezeichnet wurden. Mit einem Mausklick werden die Kurven automatisch alle in Lux oder eben alle in Foot-Candle angezeigt.
Ach so, der Programmaufruf erfolgt z.B. so auf meine Win7 System:
Auf einem Raspberry Pi (z.B. per Win7 RealVNC Viewer Verbindung) erfolgt der Programmaufruf dann so:
Die Idee, die TXT-Datei nicht mit Excel zu verarbeiten, kam mir sofort, als ich den Inhalt/Aufbau der Textdatei sah. Sie hat ein stures Format. Das bietet sich förmlich an, per Code automatisch eingelesen u. verarbeitet zu werden:
![textfileformat.png textfileformat.png](https://www.taschenlampen-forum.de/data/attachments/90/90079-19de318113bc2f58ed902d8b778b63d4.jpg)
Leute, die seltenst Lux messen oder loggen, sprich aufzeichnen/aufnehmen/recording, oder mal schnell einen direkten Laufzeitdiagramm-Vergleich machen wollen, z.B. Tala1 w/ Treiber1 versus Tala1 w/ Treiber2 versus Tala1 w/ Treiber3, können das nun ganz einfach über die kostenlose funktionstüchtige App "Lux Meter" von Angstrom Metrology in Verbindung mit meinem Code machen.
Die kostenlose Variante hat Werbeeinblendungen, kann man aber wegklicken:
https://play.google.com/store/apps/details?id=com.angstrommetrology.luxmeter&hl=en
Die Bezahlvariante kostet 1€, dann hat man keine Werbung na super:
https://play.google.com/store/apps/details?id=com.angstrommetrology.luxmeterp
Die Logging-Abtastfrequenz beträgt etwa 9.6Hz auf meinem Handy, was sehr hoch ist ("zittrige Kurve"); für unsere Zwecke habe ich einen gleitenden Durchschnitt von ca. 3.0s gewählt. Die Bedienung der App ist selbsterklärend, ganz kurz das Wesentliche:
- Wenn links/unten der Button mit <LUX> beschriftet ist, heisst das, dass die Aufzeichnung in der Maßeinheit Lux erfolgt. Tippt man darauf, ändert sich die Beschriftung auf <FC> (und sein unterer Rand färbt sich blau); die Aufzeichnung geschieht dann in Foot-Candle.
- Um zu starten, tippt man auf den <OFF> Button. Seine Beschriftung ändert sich daraufhin auf <ON> (und sein unterer Rand färbt sich blau).
- Die Zeit fängt an zu laufen. Die Anzeige Run Time: ??:?? wechselt nach einer Stunde auf Run Time: ?:??:??. Es gibt also keine zeitliche Beschränkung auf 59min59s.
- Mein Handy-Display möchte sich nach 2min User-Inaktivität (Berühren des Displays) immer ausschalten. Beim Loggen muss ich also neben dem Handy sitzen und spätestens alle 2min das Display kurz antippen, damit die Messreihe ununterbrochen bleibt.
- Da die Laufzeit leider nicht automatisch im Log mitgespeichert wird, muss man zur Beendigung der Messung auf <HOLD> tippen. (Die Beschriftung des Buttons ändert sich dann auf <RESUME> und sein unterer Rand färbt sich blau.) Die Laufzeit ist dann noch ablesbar, z.B. als Run Time: 37:58 für einen knapp 38-minütigen Lauf.
- Jetzt tippt man auf <SAVE>, und eine Eingabemaske erscheint. Im Feld "Notes:" trägt man das Schlüsselwort "time" gefolgt von der memorierten Laufzeit ein, also etwa "time37.58", "time 37.58", "time37:58", oder "time 37:58" o.ä. Als Trennzeichen kann man also Punkt xor Doppelpunkt verwenden, und Leerzeichen nach dem Schlüsselwort sind auch egal (enter w/o quotes!). Wer will kann/sollte in dem Feld noch mehr Notizen zum Lauf hinzufügen, z.B. Tala-Modell, Helligkeitsstufe High-Mode, Akkukapazität, usw.
- Im Feld "File name" gibt man einen Dateinamen ein, ohne Dateiendung, z.B. "test1a" (enter w/o quotes!).
- Die Datei ist nun als "test1a.txt" auf dem internen Speicher des Smartphones abgespeichert, und auf meinem Handy manuell auffindbar am Ort:
Code:/storage/emulated/0/Android/data/com.angstrommetrology.luxmeter/files/LuxMeterFiles/test1a.txt
- Dann überträgt man die Datei kabellos auf den PC, z.B. per Filedrop app. Filedrop speichert die Datei automatisch im systemeigenen Download-Folder, also auf meinem Win7 System in:
Code:C:\Users\placebo\Downloads\test1a.txt
![](https://abload.de/thumb/codescreenshot46c5a.gif)
Code:
Clear[myfun];
myfun[files : {__}, labels_List] :=
Manipulate[
Module[
(* not all listed variables are needed *)
{colors, txt, data, calf, amb, pkval, num, time, fc2lux,
ToLuxFactors, TofcFactors, stl, tml},
(* quick'n dirty way of generating colors lol *)
colors = RandomColor[Length[files]];
(* import all given files to one list of strings *)
txt = Import[#, "Text"] & /@ files;
(* extract numerical values from the imported strings *)
data =
StringCases[#,
StartOfLine ~~ x : NumberString ~~ (" FootCandles" | " Lux") ~~
EndOfLine :> ToExpression[x]] & /@ txt;
calf =
First@StringCases[#,
StartOfLine ~~ "Cal Factor =" ~~ WhitespaceCharacter ... ~~
x : NumberString ~~ EndOfLine :> ToExpression[x]] & /@
txt; (* {1,1} *)
amb =
First@StringCases[#,
StartOfLine ~~ "Ambient =" ~~ WhitespaceCharacter ... ~~
x : NumberString ~~ EndOfLine :> ToExpression[x]] & /@
txt; (* {0,0} *)
pkval =
First@StringCases[#,
StartOfLine ~~ "Peak Value =" ~~ WhitespaceCharacter ... ~~
x : NumberString ~~ EndOfLine :> ToExpression[x]] & /@ txt;
num =
First@StringCases[#,
StartOfLine ~~ "Total Number of Data Points =" ~~
WhitespaceCharacter ... ~~ x : NumberString ~~ EndOfLine :>
ToExpression[x]] & /@ txt; (* {3472,2985} *)
(* check if number of extracted values equals given number *)
Print[Length /@ data == num]; (* True *)
(* extract user-written run time from annotation field *)
time =
StringCases[#,
"time" ~~ WhitespaceCharacter ... ~~
x : (DatePattern[{"Hour", "Minute", "Second"}] |
DatePattern[{"Minute", "Second"}] |
DatePattern[{"Second"}]) ~~ WhitespaceCharacter ... :>
x] & /@ txt; (* {{"6:0"},{"12.30"}} *)
(* convert the extracted time string into time numbers *)
If[AllTrue[time, # != {} &]
, time = First /@ time
; stl = tml =
Which[
StringLength@# <= 2, DateList[{#, {"Second"}}],
StringLength@# <= 5, DateList[{#, {"Minute", "Second"}}],
True, DateList[{#, {"Hour", "Minute", "Second"}}]
] & /@ time
];
(* set the run time start to 00:00:00 *)
Do[stl[[i, -3 ;; -1]] = 0, {i, 1, Length[stl]}];
(* 1fc = 10.76391.......lx *)
fc2lux =
QuantityMagnitude[UnitConvert[Quantity[1, "FootCandles"], "Lux"]];
(* prepare conversion factors for future multiplication *)
ToLuxFactors =
StringContainsQ[txt, "Lux"] /. {True -> 1, False -> fc2lux};
TofcFactors =
StringContainsQ[txt, "FootCandles"] /. {True -> 1,
False -> 1/fc2lux};
(* convert the data to all lux or to all foot-candle *)
If[ToLux
, data = MovingAverage[#, 29] & /@ (data*ToLuxFactors)
, data = MovingAverage[#, 29] & /@ (data*TofcFactors)
];
(* show a rudimentary visualization of all given files *)
Show[
MapThread[
Legended[
DateListPlot[#1, {#2, #3}, PlotStyle -> #4]
, Placed[Column[{
LineLegend[{#4}, {#5}]
, Row[{"Max=", N@Max[#1]}]
}], Bottom]
] &
, {data, stl, tml, colors, labels}
]
, PlotRange -> All
, ImageSize -> Full
, FrameLabel -> {"Time [hh:mm]", "Illuminance"}
(* you can modify the title here *)
, PlotLabel -> "runtime test on High mode (Eneloop AAA)"
]
]
, {{ToLux, True, "all values in Lux"}, {True, False}}
];
![vorsichtig :vorsichtig: :vorsichtig:](/styles/default/xenforo/smilies/cautious.png)
Ach so, der Programmaufruf erfolgt z.B. so auf meine Win7 System:
Code:
file1 = "C:\\Users\\placebo\\Downloads\\test1a.txt";
file2 = "C:\\Users\\placebo\\Downloads\\test2a.txt";
myfun[{file1, file2}, {"Tala A mit Treiber 1", "Tala A mit Treiber 2"}]
Auf einem Raspberry Pi (z.B. per Win7 RealVNC Viewer Verbindung) erfolgt der Programmaufruf dann so:
Code:
file1="/home/pi/Downloads/test1a.txt";
file2="/home/pi/Downloads/test2a.txt";
myfun[{file1, file2}, {"Tala A mit Treiber 1", "Tala A mit Treiber 2"}]
Die Idee, die TXT-Datei nicht mit Excel zu verarbeiten, kam mir sofort, als ich den Inhalt/Aufbau der Textdatei sah. Sie hat ein stures Format. Das bietet sich förmlich an, per Code automatisch eingelesen u. verarbeitet zu werden:
![textfileformat.png textfileformat.png](https://www.taschenlampen-forum.de/data/attachments/90/90079-19de318113bc2f58ed902d8b778b63d4.jpg)
Zuletzt bearbeitet von einem Moderator: