From 4832f6a365dd54af6497f35e2cd8c376b186135b Mon Sep 17 00:00:00 2001 From: Fisch Date: Thu, 22 Mar 2018 08:57:53 +0100 Subject: [PATCH] Initial commit --- UI_Design.xcf | Bin 0 -> 10756 bytes calibration.txt | 17 + ...180123_prototype_calibration (Kopie 1).csv | 248 +++++ .../20180123_prototype_calibration.csv | 248 +++++ ..._prototype_calibration_bright_3_ab12.5.png | Bin 0 -> 18997 bytes .../20180123_prototype_calibration_low_3.png | Bin 0 -> 20151 bytes calibration/20180123_prototype_valuesTest.csv | 154 ++++ calibration/calibration.py | 39 + lightmeter.ino | 854 ++++++++++++++++++ 9 files changed, 1560 insertions(+) create mode 100644 UI_Design.xcf create mode 100644 calibration.txt create mode 100644 calibration/20180123_prototype_calibration (Kopie 1).csv create mode 100644 calibration/20180123_prototype_calibration.csv create mode 100644 calibration/20180123_prototype_calibration_bright_3_ab12.5.png create mode 100644 calibration/20180123_prototype_calibration_low_3.png create mode 100644 calibration/20180123_prototype_valuesTest.csv create mode 100644 calibration/calibration.py create mode 100644 lightmeter.ino diff --git a/UI_Design.xcf b/UI_Design.xcf new file mode 100644 index 0000000000000000000000000000000000000000..05c72ecd4878f3346942b42ba346e8d03a3edfeb GIT binary patch literal 10756 zcmeHN%WGU!7(e&UOp>PaNLp2&v;-WhjdE86~l1WLX*n)UR z1lQdQ{s-blTxsz^H{z}<5y6GvMx{^}KH6S?zu!IgF_}9|n_^n+=7KzjsG2GjuuEKa#cA%7O1wHAh* zU*1?>_d8vDH)QTRz3DG@{T1)+cK5t@_O;jFAZJRV?e)c$Ki}GHuaE|5$INbZFR%ID z*2Y?UWo~kIwY9vlwz28W>SKPhwY2CRdFF^(4sz78=FoL1r)$jjh9m5HY3st`a=X*= zj>dC=csY+~Y4aC5?XK7EET8wc*neYnb<6K23bOYgDWddutXGeddX-1jXKzXW965Am|={dD&eW2#?})-+>b2{2*G zVcpybF?tDvTOnR)g5Rsg3HL<|d~=97eQXe>j2o88adX)X3~@UiZ=kaV*Hn(VjcF^G zz5;zPT$Uw`q~Tb?8pptHq>Sa1!v?wId`P3ThjgovF@|mxBKb@(cF3(@U};x3f8#`i zc0tmaOIRo^VTsdE;5}V*;gZ*|{;s}*5jbCx??BoGNE?1(_e16%4viBb2|PH2V{S$h z@+4y3g9B0}b3^^OvH0cB!FUq8s~BsTR5@B@t9$-PIWn4x`ebM0E0qE98@*K=LL5nL zBp&vJ0xJ$7PK^$#J*qheOzaUd#UU&#Vb)#_vvIUXg(b}T+)?hh2G1i`t4Oc0xC51`% z>ST9p10BR2{f>AVQHVCQu61_9Df%UaRCU}A7agWaVZ zq=(NY0BK6&6!NiOfV1@gP0-GP#`Fmhu}sWK9Lww0-A6I(sAo_Q9)`~IVNmZuk%j0Q zTpy)&AKyXeD-XVN-7JJBsee#cp#d9YJOJAYfH^Nu-oAmP8N^-7lq+_wyd%hr+qUVC zEfQ;vBRG8x<$$02>C@jM(bf@s88@(QGqoCUn;m04_H$8mIc2(K3ag~)%nB2ujMK|p zcuK~#6j@qXQ2HndtFI+t0J%Er4>&skWaitaO`*`vSEvE!Q;i)^6}u`&M+)PH2G*Aw z#iU&BFxjLUL|MwPd(6C@@kT^sOp)wSUBwJHe9rvE%Zy(K6&q-LfRAKP%W1 zDPc}#^vdri6Ipo*Jrp|)Fl@acJ%yt>Knabs2TI>z)T9o4g$*0H}hyp7pc8s5f}L)0WpH*$)?l25Zi$ukL+ zCA0K_95j{BNka3Pc#{WLiwm4E2!4QE-`wN3E?K8f3D@eiwn}37&uVo#-#UFCY>;2{=Jh994bxzK00^ z+I=Xi7FLOh9+$@cE{PT4N6FIci+Z znwwl7qeemHDg3=(`?3)0euM}!av_>oycC-Ra{(oSmng}&SYv5}ScX4NvR>lZ1Un8o zOYsXRQ)nPbKMzV!`n}jvyI#r$iY?_G!VwyJ4~tvsM3-~7Z|PU}VR%{48@i(@W0a53 zzhDLKyReutA(30CzQ|%p6W{^ZdVnT?t@>)a)Acu7n-@DP{QfZfCCa5DQJeeJB0YRI h0r*F|x$gjf0%z+1n)v<`;8)-#n92vRng9=A{smAj9i0FG literal 0 HcmV?d00001 diff --git a/calibration.txt b/calibration.txt new file mode 100644 index 0000000..a94d96d --- /dev/null +++ b/calibration.txt @@ -0,0 +1,17 @@ +Am Dell U2715H Brightness 50/ Contrast 50 +abstand zu kamera 1m + +EOS 600D +ISO 800 F5.6. Kit @55mm +gray eos ldr /brightmode ldr +0% 1.3s 580/70 +10% 0.3s 720/85 +20% 1/10 1075/140 +30% 1/25 1555/230 +40% 1/50 2020/350 +50% 1/80 2410/495 +60% 1/125 2735/653 +70% 1/200 2950/800 +80% 1/250 3140/965 +90% 1/400 3295/1130 +100% 1/500 3400/1280 \ No newline at end of file diff --git a/calibration/20180123_prototype_calibration (Kopie 1).csv b/calibration/20180123_prototype_calibration (Kopie 1).csv new file mode 100644 index 0000000..42c3845 --- /dev/null +++ b/calibration/20180123_prototype_calibration (Kopie 1).csv @@ -0,0 +1,248 @@ +low,bright,Aperature(at iso 100),shutter time,EV,EV Norm +793,101,5.6,0.25,6.9708536543,7 +794,100,5.6,0.25,6.9708536543,7 +797,99,5.6,0.25,6.9708536543,7 +790,97,5.6,0.25,6.9708536543,7 +799,98,5.6,0.25,6.9708536543,7 +794,99,5.6,0.25,6.9708536543,7 +793,99,5.6,0.25,6.9708536543,7 +797,97,5.6,0.25,6.9708536543,7 +791,98,5.6,0.25,6.9708536543,7 +797,99,5.6,0.25,6.9708536543,7 +796,97,5.6,0.25,6.9708536543,7 +793,99,5.6,0.25,6.9708536543,7 +800,100,5.6,0.25,6.9708536543,7 +793,101,5.6,0.25,6.9708536543,7 +,,,,, +791,98,5.6,0.25,6.9708536543,7 +791,97,5.6,0.25,6.9708536543,7 +793,98,5.6,0.25,6.9708536543,7 +792,99,5.6,0.25,6.9708536543,7 +792,98,5.6,0.25,6.9708536543,7 +794,99,5.6,0.25,6.9708536543,7 +794,101,5.6,0.25,6.9708536543,7 +793,99,5.6,0.25,6.9708536543,7 +792,99,5.6,0.25,6.9708536543,7 +791,97,5.6,0.25,6.9708536543,7 +794,99,5.6,0.25,6.9708536543,7 +792,98,5.6,0.25,6.9708536543,7 +,,,,, +525,63,5.6,8,1.9708536543,2 +527,63,5.6,8,1.9708536543,2 +525,61,5.6,8,1.9708536543,2 +524,62,5.6,8,1.9708536543,2 +526,62,5.6,8,1.9708536543,2 +527,61,5.6,8,1.9708536543,2 +523,64,5.6,8,1.9708536543,2 +524,60,5.6,8,1.9708536543,2 +525,62,5.6,8,1.9708536543,2 +811,102,5.6,0.2,7.2927817492,7.3 +812,100,5.6,0.2,7.2927817492,7.3 +811,100,5.6,0.2,7.2927817492,7.3 +812,100,5.6,0.2,7.2927817492,7.3 +812,99,5.6,0.2,7.2927817492,7.3 +811,101,5.6,0.2,7.2927817492,7.3 +812,103,5.6,0.2,7.2927817492,7.3 +810,100,5.6,0.2,7.2927817492,7.3 +811,100,5.6,0.2,7.2927817492,7.3 +2194,413,5.6,0.02,10.6147098441,10.6 +2193,413,5.6,0.02,10.6147098441,10.6 +2195,413,5.6,0.02,10.6147098441,10.6 +2190,410,5.6,0.02,10.6147098441,10.6 +2195,411,5.6,0.02,10.6147098441,10.6 +2193,409,5.6,0.02,10.6147098441,10.6 +2193,413,5.6,0.02,10.6147098441,10.6 +2199,414,5.6,0.02,10.6147098441,10.6 +2201,412,5.6,0.02,10.6147098441,10.6 +2205,413,5.6,0.02,10.6147098441,10.6 +2202,412,5.6,0.02,10.6147098441,10.6 +2203,412,5.6,0.02,10.6147098441,10.6 +2194,413,5.6,0.008,11.936637939,11.9 +2193,413,5.6,0.008,11.936637939,11.9 +2195,413,5.6,0.008,11.936637939,11.9 +2190,410,5.6,0.008,11.936637939,11.9 +2195,411,5.6,0.008,11.936637939,11.9 +2193,409,5.6,0.008,11.936637939,11.9 +2193,413,5.6,0.008,11.936637939,11.9 +2199,414,5.6,0.008,11.936637939,11.9 +2201,412,5.6,0.008,11.936637939,11.9 +2205,413,5.6,0.008,11.936637939,11.9 +2202,412,5.6,0.008,11.936637939,11.9 +2203,412,5.6,0.008,11.936637939,11.9 +,,,,, +3445,1297,5.6,0.0025,13.6147098441,13.6 +3342,1216,5.6,0.0025,13.6147098441,13.6 +3444,1354,5.6,0.0025,13.6147098441,13.6 +3402,1176,5.6,0.0025,13.6147098441,13.6 +3396,1335,5.6,0.0025,13.6147098441,13.6 +3401,1163,5.6,0.0025,13.6147098441,13.6 +3341,1329,5.6,0.0025,13.6147098441,13.6 +3429,1223,5.6,0.0025,13.6147098441,13.6 +3313,1295,5.6,0.0025,13.6147098441,13.6 +3462,1306,5.6,0.0025,13.6147098441,13.6 +3326,1217,5.6,0.0025,13.6147098441,13.6 +3447,1334,5.6,0.0025,13.6147098441,13.6 +3367,1185,5.6,0.0025,13.6147098441,13.6 +3423,1383,5.6,0.0025,13.6147098441,13.6 +3093,853,5.6,0.005,12.6147098441,12.6 +3077,984,5.6,0.005,12.6147098441,12.6 +3145,911,5.6,0.005,12.6147098441,12.6 +3055,959,5.6,0.005,12.6147098441,12.6 +3189,969,5.6,0.005,12.6147098441,12.6 +3056,877,5.6,0.005,12.6147098441,12.6 +3139,981,5.6,0.005,12.6147098441,12.6 +3106,856,5.6,0.005,12.6147098441,12.6 +3062,969,5.6,0.005,12.6147098441,12.6 +3136,893,5.6,0.005,12.6147098441,12.6 +2996,896,5.6,0.005,12.6147098441,12.6 +3147,938,5.6,0.005,12.6147098441,12.6 +3038,856,5.6,0.005,12.6147098441,12.6 +3191,1109,5.6,0.0035087719,13.1256717634,13.1 +3326,1133,5.6,0.0035087719,13.1256717634,13.1 +3216,1033,5.6,0.0035087719,13.1256717634,13.1 +3300,1169,5.6,0.0035087719,13.1256717634,13.1 +3280,1019,5.6,0.0035087719,13.1256717634,13.1 +3227,1156,5.6,0.0035087719,13.1256717634,13.1 +3310,1082,5.6,0.0035087719,13.1256717634,13.1 +3182,1082,5.6,0.0035087719,13.1256717634,13.1 +3319,1133,5.6,0.0035087719,13.1256717634,13.1 +3215,1019,5.6,0.0035087719,13.1256717634,13.1 +3283,1162,5.6,0.0035087719,13.1256717634,13.1 +3274,1013,5.6,0.0035087719,13.1256717634,13.1 +3215,1142,5.6,0.0035087719,13.1256717634,13.1 +3309,1079,5.6,0.0035087719,13.1256717634,13.1 +3705,1788,5.6,0.00125,14.6147098441,14.6 +3652,1916,5.6,0.00125,14.6147098441,14.6 +3737,1941,5.6,0.00125,14.6147098441,14.6 +3653,1797,5.6,0.00125,14.6147098441,14.6 +3722,2028,5.6,0.00125,14.6147098441,14.6 +3714,1761,5.6,0.00125,14.6147098441,14.6 +3689,2021,5.6,0.00125,14.6147098441,14.6 +3737,1903,5.6,0.00125,14.6147098441,14.6 +3645,1874,5.6,0.00125,14.6147098441,14.6 +3745,1982,5.6,0.00125,14.6147098441,14.6 +3685,1770,5.6,0.00125,14.6147098441,14.6 +3721,2021,5.6,0.00125,14.6147098441,14.6 +3715,1783,5.6,0.00125,14.6147098441,14.6 +3837,2612,16,0.0025,16.6438561898,16.6 +3889,2503,16,0.0025,16.6438561898,16.6 +3804,2367,16,0.0025,16.6438561898,16.6 +3887,2609,16,0.0025,16.6438561898,16.6 +3865,2239,16,0.0025,16.6438561898,16.6 +3836,2611,16,0.0025,16.6438561898,16.6 +3888,2500,16,0.0025,16.6438561898,16.6 +3808,2353,16,0.0025,16.6438561898,16.6 +3886,2619,16,0.0025,16.6438561898,16.6 +3868,2246,16,0.0025,16.6438561898,16.6 +3834,2601,16,0.0025,16.6438561898,16.6 +3891,2507,16,0.0025,16.6438561898,16.6 +3806,2354,16,0.0025,16.6438561898,16.6 +3887,2617,16,0.0025,16.6438561898,16.6 +3866,2244,16,0.0025,16.6438561898,16.6 +3834,2596,16,0.0025,16.6438561898,16.6 +3889,2518,16,0.0025,16.6438561898,16.6 +3810,2357,16,0.0025,16.6438561898,16.6 +3885,2623,16,0.0025,16.6438561898,16.6 +3869,2276,16,0.0025,16.6438561898,16.6 +3829,2586,16,0.0025,16.6438561898,16.6 +3893,2524,16,0.0025,16.6438561898,16.6 +3815,2346,16,0.0025,16.6438561898,16.6 +3881,2623,16,0.0025,16.6438561898,16.6 +3873,2301,16,0.0025,16.6438561898,16.6 +3828,2551,16,0.0025,16.6438561898,16.6 +3892,2538,16,0.0025,16.6438561898,16.6 +3825,2320,16,0.0025,16.6438561898,16.6 +3873,2631,16,0.0025,16.6438561898,16.6 +3873,2337,16,0.0025,16.6438561898,16.6 +3824,2527,16,0.0025,16.6438561898,16.6 +3937,2935,22,0.0015625,18.2407913322,18.2 +3983,3207,22,0.0015625,18.2407913322,18.2 +3980,2920,22,0.0015625,18.2407913322,18.2 +3943,3114,22,0.0015625,18.2407913322,18.2 +3992,3136,22,0.0015625,18.2407913322,18.2 +3950,2891,22,0.0015625,18.2407913322,18.2 +3976,3212,22,0.0015625,18.2407913322,18.2 +3981,2947,22,0.0015625,18.2407913322,18.2 +3941,3099,22,0.0015625,18.2407913322,18.2 +3990,3155,22,0.0015625,18.2407913322,18.2 +3954,2877,22,0.0015625,18.2407913322,18.2 +3972,3215,22,0.0015625,18.2407913322,18.2 +3983,2961,22,0.0015625,18.2407913322,18.2 +3940,3076,22,0.0015625,18.2407913322,18.2 +3990,3154,22,0.0015625,18.2407913322,18.2 +3954,2871,22,0.0015625,18.2407913322,18.2 +3973,3215,22,0.0015625,18.2407913322,18.2 +3981,2965,22,0.0015625,18.2407913322,18.2 +3937,3061,22,0.0015625,18.2407913322,18.2 +3990,3159,22,0.0015625,18.2407913322,18.2 +,,,,, +3659,1757,22,0.02,14.562719427,14.6 +3579,1649,22,0.02,14.562719427,14.6 +3660,1829,22,0.02,14.562719427,14.6 +3635,1553,22,0.02,14.562719427,14.6 +3573,1757,22,0.02,14.562719427,14.6 +3666,1741,22,0.02,14.562719427,14.6 +3573,1595,22,0.02,14.562719427,14.6 +3633,1795,22,0.02,14.562719427,14.6 +3641,1566,22,0.02,14.562719427,14.6 +3546,1617,22,0.02,14.562719427,14.6 +3652,1677,22,0.02,14.562719427,14.6 +3559,1487,22,0.02,14.562719427,14.6 +3589,1789,22,0.02,14.562719427,14.6 +3629,1594,22,0.02,14.562719427,14.6 +270,34,8,15,2.0931094044,2.1 +270,33,8,15,2.0931094044,2.1 +274,25,8,15,2.0931094044,2.1 +275,31,8,15,2.0931094044,2.1 +274,32,8,15,2.0931094044,2.1 +274,35,8,15,2.0931094044,2.1 +271,34,8,15,2.0931094044,2.1 +273,33,8,15,2.0931094044,2.1 +271,33,8,15,2.0931094044,2.1 +274,34,8,15,2.0931094044,2.1 +271,32,8,15,2.0931094044,2.1 +273,33,8,15,2.0931094044,2.1 +273,31,8,15,2.0931094044,2.1 +274,32,8,15,2.0931094044,2.1 +272,32,8,15,2.0931094044,2.1 +,,,,, +314,37,8,5,3.6780719051,3.7 +315,36,8,5,3.6780719051,3.7 +317,37,8,5,3.6780719051,3.7 +319,37,8,5,3.6780719051,3.7 +316,37,8,5,3.6780719051,3.7 +317,36,8,5,3.6780719051,3.7 +317,37,8,5,3.6780719051,3.7 +319,37,8,5,3.6780719051,3.7 +318,38,8,5,3.6780719051,3.7 +320,37,8,5,3.6780719051,3.7 +320,38,8,5,3.6780719051,3.7 +317,38,8,5,3.6780719051,3.7 +,,,,, +302,35,5.6,2.85,3.4598917351,3.5 +301,36,5.6,2.85,3.4598917351,3.5 +300,34,5.6,2.85,3.4598917351,3.5 +298,36,5.6,2.85,3.4598917351,3.5 +295,37,5.6,2.85,3.4598917351,3.5 +294,36,5.6,2.85,3.4598917351,3.5 +296,36,5.6,2.85,3.4598917351,3.5 +295,36,5.6,2.85,3.4598917351,3.5 +291,38,5.6,2.85,3.4598917351,3.5 +293,35,5.6,2.85,3.4598917351,3.5 +292,36,5.6,2.85,3.4598917351,3.5 +292,34,5.6,2.85,3.4598917351,3.5 +,,,,, +398,47,5.6,1,4.9708536543,5 +401,49,5.6,1,4.9708536543,5 +399,46,5.6,1,4.9708536543,5 +401,47,5.6,1,4.9708536543,5 +400,45,5.6,1,4.9708536543,5 +399,46,5.6,1,4.9708536543,5 +401,47,5.6,1,4.9708536543,5 +399,47,5.6,1,4.9708536543,5 +401,47,5.6,1,4.9708536543,5 +400,46,5.6,1,4.9708536543,5 +400,46,5.6,1,4.9708536543,5 +400,46,5.6,1,4.9708536543,5 +401,47,5.6,1,4.9708536543,5 +400,46,5.6,1,4.9708536543,5 diff --git a/calibration/20180123_prototype_calibration.csv b/calibration/20180123_prototype_calibration.csv new file mode 100644 index 0000000..42c3845 --- /dev/null +++ b/calibration/20180123_prototype_calibration.csv @@ -0,0 +1,248 @@ +low,bright,Aperature(at iso 100),shutter time,EV,EV Norm +793,101,5.6,0.25,6.9708536543,7 +794,100,5.6,0.25,6.9708536543,7 +797,99,5.6,0.25,6.9708536543,7 +790,97,5.6,0.25,6.9708536543,7 +799,98,5.6,0.25,6.9708536543,7 +794,99,5.6,0.25,6.9708536543,7 +793,99,5.6,0.25,6.9708536543,7 +797,97,5.6,0.25,6.9708536543,7 +791,98,5.6,0.25,6.9708536543,7 +797,99,5.6,0.25,6.9708536543,7 +796,97,5.6,0.25,6.9708536543,7 +793,99,5.6,0.25,6.9708536543,7 +800,100,5.6,0.25,6.9708536543,7 +793,101,5.6,0.25,6.9708536543,7 +,,,,, +791,98,5.6,0.25,6.9708536543,7 +791,97,5.6,0.25,6.9708536543,7 +793,98,5.6,0.25,6.9708536543,7 +792,99,5.6,0.25,6.9708536543,7 +792,98,5.6,0.25,6.9708536543,7 +794,99,5.6,0.25,6.9708536543,7 +794,101,5.6,0.25,6.9708536543,7 +793,99,5.6,0.25,6.9708536543,7 +792,99,5.6,0.25,6.9708536543,7 +791,97,5.6,0.25,6.9708536543,7 +794,99,5.6,0.25,6.9708536543,7 +792,98,5.6,0.25,6.9708536543,7 +,,,,, +525,63,5.6,8,1.9708536543,2 +527,63,5.6,8,1.9708536543,2 +525,61,5.6,8,1.9708536543,2 +524,62,5.6,8,1.9708536543,2 +526,62,5.6,8,1.9708536543,2 +527,61,5.6,8,1.9708536543,2 +523,64,5.6,8,1.9708536543,2 +524,60,5.6,8,1.9708536543,2 +525,62,5.6,8,1.9708536543,2 +811,102,5.6,0.2,7.2927817492,7.3 +812,100,5.6,0.2,7.2927817492,7.3 +811,100,5.6,0.2,7.2927817492,7.3 +812,100,5.6,0.2,7.2927817492,7.3 +812,99,5.6,0.2,7.2927817492,7.3 +811,101,5.6,0.2,7.2927817492,7.3 +812,103,5.6,0.2,7.2927817492,7.3 +810,100,5.6,0.2,7.2927817492,7.3 +811,100,5.6,0.2,7.2927817492,7.3 +2194,413,5.6,0.02,10.6147098441,10.6 +2193,413,5.6,0.02,10.6147098441,10.6 +2195,413,5.6,0.02,10.6147098441,10.6 +2190,410,5.6,0.02,10.6147098441,10.6 +2195,411,5.6,0.02,10.6147098441,10.6 +2193,409,5.6,0.02,10.6147098441,10.6 +2193,413,5.6,0.02,10.6147098441,10.6 +2199,414,5.6,0.02,10.6147098441,10.6 +2201,412,5.6,0.02,10.6147098441,10.6 +2205,413,5.6,0.02,10.6147098441,10.6 +2202,412,5.6,0.02,10.6147098441,10.6 +2203,412,5.6,0.02,10.6147098441,10.6 +2194,413,5.6,0.008,11.936637939,11.9 +2193,413,5.6,0.008,11.936637939,11.9 +2195,413,5.6,0.008,11.936637939,11.9 +2190,410,5.6,0.008,11.936637939,11.9 +2195,411,5.6,0.008,11.936637939,11.9 +2193,409,5.6,0.008,11.936637939,11.9 +2193,413,5.6,0.008,11.936637939,11.9 +2199,414,5.6,0.008,11.936637939,11.9 +2201,412,5.6,0.008,11.936637939,11.9 +2205,413,5.6,0.008,11.936637939,11.9 +2202,412,5.6,0.008,11.936637939,11.9 +2203,412,5.6,0.008,11.936637939,11.9 +,,,,, +3445,1297,5.6,0.0025,13.6147098441,13.6 +3342,1216,5.6,0.0025,13.6147098441,13.6 +3444,1354,5.6,0.0025,13.6147098441,13.6 +3402,1176,5.6,0.0025,13.6147098441,13.6 +3396,1335,5.6,0.0025,13.6147098441,13.6 +3401,1163,5.6,0.0025,13.6147098441,13.6 +3341,1329,5.6,0.0025,13.6147098441,13.6 +3429,1223,5.6,0.0025,13.6147098441,13.6 +3313,1295,5.6,0.0025,13.6147098441,13.6 +3462,1306,5.6,0.0025,13.6147098441,13.6 +3326,1217,5.6,0.0025,13.6147098441,13.6 +3447,1334,5.6,0.0025,13.6147098441,13.6 +3367,1185,5.6,0.0025,13.6147098441,13.6 +3423,1383,5.6,0.0025,13.6147098441,13.6 +3093,853,5.6,0.005,12.6147098441,12.6 +3077,984,5.6,0.005,12.6147098441,12.6 +3145,911,5.6,0.005,12.6147098441,12.6 +3055,959,5.6,0.005,12.6147098441,12.6 +3189,969,5.6,0.005,12.6147098441,12.6 +3056,877,5.6,0.005,12.6147098441,12.6 +3139,981,5.6,0.005,12.6147098441,12.6 +3106,856,5.6,0.005,12.6147098441,12.6 +3062,969,5.6,0.005,12.6147098441,12.6 +3136,893,5.6,0.005,12.6147098441,12.6 +2996,896,5.6,0.005,12.6147098441,12.6 +3147,938,5.6,0.005,12.6147098441,12.6 +3038,856,5.6,0.005,12.6147098441,12.6 +3191,1109,5.6,0.0035087719,13.1256717634,13.1 +3326,1133,5.6,0.0035087719,13.1256717634,13.1 +3216,1033,5.6,0.0035087719,13.1256717634,13.1 +3300,1169,5.6,0.0035087719,13.1256717634,13.1 +3280,1019,5.6,0.0035087719,13.1256717634,13.1 +3227,1156,5.6,0.0035087719,13.1256717634,13.1 +3310,1082,5.6,0.0035087719,13.1256717634,13.1 +3182,1082,5.6,0.0035087719,13.1256717634,13.1 +3319,1133,5.6,0.0035087719,13.1256717634,13.1 +3215,1019,5.6,0.0035087719,13.1256717634,13.1 +3283,1162,5.6,0.0035087719,13.1256717634,13.1 +3274,1013,5.6,0.0035087719,13.1256717634,13.1 +3215,1142,5.6,0.0035087719,13.1256717634,13.1 +3309,1079,5.6,0.0035087719,13.1256717634,13.1 +3705,1788,5.6,0.00125,14.6147098441,14.6 +3652,1916,5.6,0.00125,14.6147098441,14.6 +3737,1941,5.6,0.00125,14.6147098441,14.6 +3653,1797,5.6,0.00125,14.6147098441,14.6 +3722,2028,5.6,0.00125,14.6147098441,14.6 +3714,1761,5.6,0.00125,14.6147098441,14.6 +3689,2021,5.6,0.00125,14.6147098441,14.6 +3737,1903,5.6,0.00125,14.6147098441,14.6 +3645,1874,5.6,0.00125,14.6147098441,14.6 +3745,1982,5.6,0.00125,14.6147098441,14.6 +3685,1770,5.6,0.00125,14.6147098441,14.6 +3721,2021,5.6,0.00125,14.6147098441,14.6 +3715,1783,5.6,0.00125,14.6147098441,14.6 +3837,2612,16,0.0025,16.6438561898,16.6 +3889,2503,16,0.0025,16.6438561898,16.6 +3804,2367,16,0.0025,16.6438561898,16.6 +3887,2609,16,0.0025,16.6438561898,16.6 +3865,2239,16,0.0025,16.6438561898,16.6 +3836,2611,16,0.0025,16.6438561898,16.6 +3888,2500,16,0.0025,16.6438561898,16.6 +3808,2353,16,0.0025,16.6438561898,16.6 +3886,2619,16,0.0025,16.6438561898,16.6 +3868,2246,16,0.0025,16.6438561898,16.6 +3834,2601,16,0.0025,16.6438561898,16.6 +3891,2507,16,0.0025,16.6438561898,16.6 +3806,2354,16,0.0025,16.6438561898,16.6 +3887,2617,16,0.0025,16.6438561898,16.6 +3866,2244,16,0.0025,16.6438561898,16.6 +3834,2596,16,0.0025,16.6438561898,16.6 +3889,2518,16,0.0025,16.6438561898,16.6 +3810,2357,16,0.0025,16.6438561898,16.6 +3885,2623,16,0.0025,16.6438561898,16.6 +3869,2276,16,0.0025,16.6438561898,16.6 +3829,2586,16,0.0025,16.6438561898,16.6 +3893,2524,16,0.0025,16.6438561898,16.6 +3815,2346,16,0.0025,16.6438561898,16.6 +3881,2623,16,0.0025,16.6438561898,16.6 +3873,2301,16,0.0025,16.6438561898,16.6 +3828,2551,16,0.0025,16.6438561898,16.6 +3892,2538,16,0.0025,16.6438561898,16.6 +3825,2320,16,0.0025,16.6438561898,16.6 +3873,2631,16,0.0025,16.6438561898,16.6 +3873,2337,16,0.0025,16.6438561898,16.6 +3824,2527,16,0.0025,16.6438561898,16.6 +3937,2935,22,0.0015625,18.2407913322,18.2 +3983,3207,22,0.0015625,18.2407913322,18.2 +3980,2920,22,0.0015625,18.2407913322,18.2 +3943,3114,22,0.0015625,18.2407913322,18.2 +3992,3136,22,0.0015625,18.2407913322,18.2 +3950,2891,22,0.0015625,18.2407913322,18.2 +3976,3212,22,0.0015625,18.2407913322,18.2 +3981,2947,22,0.0015625,18.2407913322,18.2 +3941,3099,22,0.0015625,18.2407913322,18.2 +3990,3155,22,0.0015625,18.2407913322,18.2 +3954,2877,22,0.0015625,18.2407913322,18.2 +3972,3215,22,0.0015625,18.2407913322,18.2 +3983,2961,22,0.0015625,18.2407913322,18.2 +3940,3076,22,0.0015625,18.2407913322,18.2 +3990,3154,22,0.0015625,18.2407913322,18.2 +3954,2871,22,0.0015625,18.2407913322,18.2 +3973,3215,22,0.0015625,18.2407913322,18.2 +3981,2965,22,0.0015625,18.2407913322,18.2 +3937,3061,22,0.0015625,18.2407913322,18.2 +3990,3159,22,0.0015625,18.2407913322,18.2 +,,,,, +3659,1757,22,0.02,14.562719427,14.6 +3579,1649,22,0.02,14.562719427,14.6 +3660,1829,22,0.02,14.562719427,14.6 +3635,1553,22,0.02,14.562719427,14.6 +3573,1757,22,0.02,14.562719427,14.6 +3666,1741,22,0.02,14.562719427,14.6 +3573,1595,22,0.02,14.562719427,14.6 +3633,1795,22,0.02,14.562719427,14.6 +3641,1566,22,0.02,14.562719427,14.6 +3546,1617,22,0.02,14.562719427,14.6 +3652,1677,22,0.02,14.562719427,14.6 +3559,1487,22,0.02,14.562719427,14.6 +3589,1789,22,0.02,14.562719427,14.6 +3629,1594,22,0.02,14.562719427,14.6 +270,34,8,15,2.0931094044,2.1 +270,33,8,15,2.0931094044,2.1 +274,25,8,15,2.0931094044,2.1 +275,31,8,15,2.0931094044,2.1 +274,32,8,15,2.0931094044,2.1 +274,35,8,15,2.0931094044,2.1 +271,34,8,15,2.0931094044,2.1 +273,33,8,15,2.0931094044,2.1 +271,33,8,15,2.0931094044,2.1 +274,34,8,15,2.0931094044,2.1 +271,32,8,15,2.0931094044,2.1 +273,33,8,15,2.0931094044,2.1 +273,31,8,15,2.0931094044,2.1 +274,32,8,15,2.0931094044,2.1 +272,32,8,15,2.0931094044,2.1 +,,,,, +314,37,8,5,3.6780719051,3.7 +315,36,8,5,3.6780719051,3.7 +317,37,8,5,3.6780719051,3.7 +319,37,8,5,3.6780719051,3.7 +316,37,8,5,3.6780719051,3.7 +317,36,8,5,3.6780719051,3.7 +317,37,8,5,3.6780719051,3.7 +319,37,8,5,3.6780719051,3.7 +318,38,8,5,3.6780719051,3.7 +320,37,8,5,3.6780719051,3.7 +320,38,8,5,3.6780719051,3.7 +317,38,8,5,3.6780719051,3.7 +,,,,, +302,35,5.6,2.85,3.4598917351,3.5 +301,36,5.6,2.85,3.4598917351,3.5 +300,34,5.6,2.85,3.4598917351,3.5 +298,36,5.6,2.85,3.4598917351,3.5 +295,37,5.6,2.85,3.4598917351,3.5 +294,36,5.6,2.85,3.4598917351,3.5 +296,36,5.6,2.85,3.4598917351,3.5 +295,36,5.6,2.85,3.4598917351,3.5 +291,38,5.6,2.85,3.4598917351,3.5 +293,35,5.6,2.85,3.4598917351,3.5 +292,36,5.6,2.85,3.4598917351,3.5 +292,34,5.6,2.85,3.4598917351,3.5 +,,,,, +398,47,5.6,1,4.9708536543,5 +401,49,5.6,1,4.9708536543,5 +399,46,5.6,1,4.9708536543,5 +401,47,5.6,1,4.9708536543,5 +400,45,5.6,1,4.9708536543,5 +399,46,5.6,1,4.9708536543,5 +401,47,5.6,1,4.9708536543,5 +399,47,5.6,1,4.9708536543,5 +401,47,5.6,1,4.9708536543,5 +400,46,5.6,1,4.9708536543,5 +400,46,5.6,1,4.9708536543,5 +400,46,5.6,1,4.9708536543,5 +401,47,5.6,1,4.9708536543,5 +400,46,5.6,1,4.9708536543,5 diff --git a/calibration/20180123_prototype_calibration_bright_3_ab12.5.png b/calibration/20180123_prototype_calibration_bright_3_ab12.5.png new file mode 100644 index 0000000000000000000000000000000000000000..5210ff13a5931cfe251b609d901aba8a4d2ac416 GIT binary patch literal 18997 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 OLf=xone)#>zyA#@+vHpT literal 0 HcmV?d00001 diff --git a/calibration/20180123_prototype_calibration_low_3.png b/calibration/20180123_prototype_calibration_low_3.png new file mode 100644 index 0000000000000000000000000000000000000000..c3a85749dab45587d9771738791415ef093c709b GIT binary patch literal 20151 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

qaGGy!%Z5Y6?V>|JttFz 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 literal 0 HcmV?d00001 diff --git a/calibration/20180123_prototype_valuesTest.csv b/calibration/20180123_prototype_valuesTest.csv new file mode 100644 index 0000000..378e005 --- /dev/null +++ b/calibration/20180123_prototype_valuesTest.csv @@ -0,0 +1,154 @@ +low,bright +768,95 +761,96 +769,93 +759,93 +766,96 +766,93 +758,94 +769,97 +765,93 +765,95 +770,93 +759,94 +773,95 +762,93 +462,53 +457,54 +453,53 +453,52 +447,52 +444,53 +441,53 +441,51 +440,52 +439,50 +437,50 +434,52 +434,51 +431,51 +431,50 +431,49 +488,57 +490,54 +490,56 +489,57 +488,59 +488,59 +489,59 +487,58 +490,57 +491,58 + +434,52 +434,52 +433,49 +432,49 +431,50 +430,51 +431,52 +430,51 +431,51 +430,50 +429,50 +429,50 +427,49 +428,51 +428,49 +560,67 +561,67 +562,67 +565,66 +568,67 +569,70 +569,67 +569,70 +571,67 +571,67 +573,68 +574,69 +576,71 +573,68 +575,69 +1581,241 +1583,238 +1581,239 +1582,239 +1582,239 +1583,237 +1584,238 +1580,243 +1581,239 +1581,241 +1583,237 + +3292,1128 +3293,1133 +3294,1134 +3295,1133 +3295,1132 +3293,1137 +3294,1134 +3296,1133 +3297,1134 +3296,1133 +3297,1135 +3293,1135 +3298,1135 +3297,1137 + +3589,1619 +3589,1618 +3589,1620 +3589,1619 +3589,1618 +3589,1618 +3588,1619 +3588,1619 +3588,1619 +3589,1618 +3588,1619 +3634,1730 +3635,1728 +3634,1727 +3637,1731 +3635,1728 +3634,1726 +3637,1727 +3635,1726 +3636,1728 +3636,1726 +3635,1726 +3635,1727 +4087,4031 +4087,4031 +4087,4031 +4088,4033 +4087,4031 +4088,4031 +4087,4031 +4087,4029 +4087,4033 +4082,3992 +4085,3989 +4082,3991 +4082,3990 +4083,3977 +4081,3965 +4083,3988 +4081,3976 +4082,3996 +4084,3992 +4084,3991 +4049,3628 +4048,3653 +4049,3659 +4046,3609 +4038,3581 +4041,3592 +4043,3605 +4047,3616 +4040,3613 +4046,3662 +4048,3688 +4054,3668 \ No newline at end of file diff --git a/calibration/calibration.py b/calibration/calibration.py new file mode 100644 index 0000000..24816ee --- /dev/null +++ b/calibration/calibration.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +import numpy as np +import csv +import matplotlib.pyplot as plt + +xcolumn=1 #column with readings +ycolumn=4 #column with calibration data +ncoefs=3 #number of coefficients + +xvalues=[] +yvalues=[] + +with open('20180123_prototype_calibration.csv', 'r') as csvfile: + csvreader = csv.reader(csvfile, delimiter=',') + firstrow=True + for row in csvreader: + xvalue=row[xcolumn] + yvalue=row[ycolumn] + if len(xvalue)>0 and len(yvalue)>0 and not firstrow: + xvalue=float(xvalue) + yvalue=float(yvalue) + if yvalue>12.5: + #print(""+str(xvalue)+" - "+str(yvalue)) + xvalues.append(xvalue) + yvalues.append(yvalue) + firstrow=False + + coefs=np.polyfit(xvalues,yvalues,ncoefs) #fit polynomial curve + print(coefs) #coef 0 is the one with highest polynomial + + xtest=np.arange(max(xvalues)) #x values for test visualization + ytest=np.polyval(coefs, xtest) #calculate y values with polynomial function + #ytest=[coefs[3]+coefs[2]*pow(x,1)+coefs[1]*pow(x,2)+coefs[0]*pow(x,3) for x in xtest] + + plt.scatter(xvalues,yvalues,s=0.25,c='g') #plot sample data + plt.plot(xtest,ytest,c='r') #plot approximated curve + plt.xlabel('LDR Value') + plt.ylabel('Ev') + plt.show() diff --git a/lightmeter.ino b/lightmeter.ino new file mode 100644 index 0000000..7ce6ad4 --- /dev/null +++ b/lightmeter.ino @@ -0,0 +1,854 @@ +//STM32F103C, 64k flash +//upload method: serial (A9 to RX, A10 to TX) +//To upload set Boot0 jumper to 1 (the one further away from reset btn) and press reset (stm will boot from flash wich contains uart to flash uploader) +//upload via arduino IDE +//To boot program after restart set Boot0 jumper to 0 + +//Letters 5x7 at Size 1 + + +//#include +#include +#include +#include // http://www.instructables.com/id/Monochrome-096-i2c-OLED-display-with-arduino-SSD13/ +//128 x 64 px + +#include //from: https://github.com/mysensors/MySensorsArduinoExamples/tree/master/libraries/BH1750 +BH1750 lightMeter; + +#define PIN_LDR 0 //A0 +#define PIN_BRIGHTMODE 1 //A1 +#define PIN_VBAT 2 //A2 + +#define PIN_TRIGGER PB8 +#define PIN_BTNLEFT PA15 +#define PIN_BTNCENTER PB4 +#define PIN_BTNRIGHT PB5 + +#define PIN_ON PB9 +#define TIME_AUTOPOWEROFF 120000 +#define LDRDELAY 50 //minimum delay between ldr readings. Transistor for lower value pulldown resistor switches in between +#define DEBOUNCETIME 50 //time to not check for inputs after key press +#define BUTTONTIMEHOLD 1000 //time for button hold + +#define voltage_warn 3.4 //voltage per cell //TODO implement warning + +//float shuttertimes1[]={1,1.0/2, 1.0/4, 1.0/8, 1.0/15, 1.0/30, 1.0/60, 1.0/125, 1.0/250, 1.0/500, 1.0/1000, 1.0/2000, 1.0/4000, 1.0/8000}; +float shuttertimes1[]={64,32,16,8,4,2,1,1.0/2, 1.0/4, 1.0/8, 1.0/15, 1.0/30, 1.0/60, 1.0/125, 1.0/250, 1.0/500, 1.0/1000, 1.0/2000, 1.0/4000, 1.0/8000}; +String settingsnameShutterSelectionMode[]={"Analog"}; //names for tables +#define MAXIMUM_SHUTTERSELECTIONMODES 1 + +float aperaturesFull[]={1,1.4, 2, 2.8, 4, 5.6, 8, 11, 16, 22, 32}; +float aperaturesHalf[]={1, 1.2, 1.4, 1.7, 2, 2.4, 2.8, 3.4, 4, 4.8, 5.6, 6.7, 8, 9.5, 11, 13, 16, 19, 22}; +float aperaturesThird[]={1, 1.1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.5, 2.8, 3.2, 3.5, 4, 4.5, 5.0, 5.6, 6.3, 7.1, 8, 9, 10, 11, 13, 14, 16, 18, 20, 22, 25, 29, 32, 36, 40, 45}; +String settingsnameAperatureSelectionMode[]={"Full","Half","Third"}; //names for tables +#define MAXIMUM_APERATURESELECTIONMODES 3 + +float isoFull[]={12,25,50,100,200,400,800,1600,3200,6400,12500,25600}; +float isoThird[]={12,16,20,25,32,40,50,64,80,100,125,160,200,250,320,400,500,640,800,1000,1250,1600,2000,2500,3200,4000,5000,6400,8000,10000,12500,16000,20000,25600}; + + + +long loopmillis=0; //only use one millis reading each loop +long last_ldrReading=0; +long millis_lastchange=0; +long millis_lastinput=0; + +long timebuttonpressed_trigger; +long timebuttonpressed_left; +long timebuttonpressed_center; +long timebuttonpressed_right; + +//Short press (true when button short pressed, on release) +boolean button_trigger=false; +boolean button_left=false; +boolean button_center=false; +boolean button_right=false; + +//long press (true when button is held down for BUTTONTIMEHOLD, on time elapsed) +boolean button_hold_trigger=false; +boolean button_hold_left=false; +boolean button_hold_center=false; +boolean button_hold_right=false; + +float vbat=0; + +struct Settings { + uint8_t minimumAperatureIndex; //see corresponding aperatures table + uint8_t aperatureSelectionMode; //1=Full, 2=Half, 3=Third + uint8_t shutterSelectionMode; //index for which shuttertimes table to use + uint8_t ISOSelectionMode; //1=Full, 2=Thirds +}; + +Settings userSettings= {1,1, 1,2}; + + + + +#define OLED_RESET 4 +Adafruit_SSD1306 display(OLED_RESET); + +uint16_t analog_low=0; //better for low light +uint16_t analog_high=0; //better for bright light (higher pulldown resistor for ldr) +float ev=0; //calculated EV from LDR readings (reflected) or from Luxmeter (incident) + +float ev_min=6,ev_max=12,ev_last=8; + +float showAperature=0; +float showShutter=0; + +//Usersettings +float setAperature=8; //set to use aperature. 0 for auto +float setShutter=0; //set to use shutter time, 0 for auto +uint16_t setISO=100; //set to ISO + +enum displaymode { + lightmeter, + settings +}; +displaymode displaymode=lightmeter; +uint8_t settings_selectedItem=0; //in settings display +String settingStrings[]={"ISO:","F-Stops:","Timetable:","Turn Off"}; +#define SETTINGS_SELECTEDITEM_MAX 3 //inclusive. 2 means 3 items available +boolean settings_itemActive=false; //item in settings selected to change value + + +char tempstring[16]; //for dtostrf //dtostrf(modefactor,1,3,tempstring); + +#if (SSD1306_LCDHEIGHT != 64) +#error("Height incorrect, please fix Adafruit_SSD1306.h!"); +#endif + +void setup() { + Serial.begin(9600); + Serial.println("Started"); + + + display.begin(SSD1306_SWITCHCAPVCC, 0x3C); + display.clearDisplay(); + display.display(); + + lightMeter.begin(BH1750_CONTINUOUS_HIGH_RES_MODE_2); + //set measurement time (for higher resolution) http://www.raspberry-pi-geek.de/Magazin/2015/04/Digital-Light-Sensor-BH1750-am-Raspberry-Pi + //lightMeter.write8(71); //01000111 //high bit: 01000xxx bits 7,6,5 + //lightMeter.write8(126); //01111110 //log bit: 011xxxxx bits 4,3,2,1,0 + + pinMode(PIN_LDR, INPUT_ANALOG); + pinMode(PIN_VBAT, INPUT_ANALOG); + pinMode(PIN_TRIGGER, INPUT_PULLUP); + pinMode(PIN_BTNLEFT, INPUT_PULLUP); + pinMode(PIN_BTNCENTER, INPUT_PULLUP); + pinMode(PIN_BTNRIGHT, INPUT_PULLUP); + pinMode(PIN_BRIGHTMODE, OUTPUT); + digitalWrite(PIN_BRIGHTMODE, LOW); + pinMode(PIN_ON, OUTPUT); + digitalWrite(PIN_ON, HIGH); + millis_lastchange=millis(); + + + Serial.println("Initialized"); + + + //display.drawPixel(10, 10, WHITE); + +} + + +void loop() { + loopmillis=millis(); //read millis for this cycle + + + + uint16_t lux = lightMeter.readLightLevel(); + + + handleInputs(); + + calculateEV(); + + updateDisplay(); + + + +} + + +void handleInputs() +{ + //Short press (true when button short pressed, on release) + button_trigger=false; + button_left=false; + button_center=false; + button_right=false; + + //long press (true when button is held down for BUTTONTIMEHOLD, on time elapsed) + button_hold_trigger=false; + button_hold_left=false; + button_hold_center=false; + button_hold_right=false; + + if (millis()-millis_lastinput>DEBOUNCETIME) //Button debouncing + { + //Trigger + if (timebuttonpressed_trigger == 0 && !digitalRead(PIN_TRIGGER)){ //first time pressed down. (low when pressed) + timebuttonpressed_trigger=loopmillis; //set time of button press + }else if(timebuttonpressed_trigger != 0 && digitalRead(PIN_TRIGGER)){ //button released (was pressed) + if (loopmillis-timebuttonpressed_trigger < BUTTONTIMEHOLD){ //short press + button_trigger=true; + } + timebuttonpressed_trigger=0; //re-enable after short press and release from hold + }else if(loopmillis-timebuttonpressed_trigger >= BUTTONTIMEHOLD && timebuttonpressed_trigger>0){ //held down long enough and not already hold triggered + button_hold_trigger=true; + timebuttonpressed_trigger=-1; //-1 as flag for hold triggered + } + + //Left + if (timebuttonpressed_left == 0 && !digitalRead(PIN_BTNLEFT)){ //first time pressed down. (low when pressed) + timebuttonpressed_left=loopmillis; //set time of button press + }else if(timebuttonpressed_left != 0 && digitalRead(PIN_BTNLEFT)){ //button released (was pressed) + if (loopmillis-timebuttonpressed_left < BUTTONTIMEHOLD){ //short press + button_left=true; + } + timebuttonpressed_left=0; //re-enable after short press and release from hold + }else if(loopmillis-timebuttonpressed_left >= BUTTONTIMEHOLD && timebuttonpressed_left>0){ //held down long enough and not already hold triggered + button_hold_left=true; + timebuttonpressed_left=-1; //-1 as flag for hold triggered + } + + //Center + if (timebuttonpressed_center == 0 && !digitalRead(PIN_BTNCENTER)){ //first time pressed down. (low when pressed) + timebuttonpressed_center=loopmillis; //set time of button press + }else if(timebuttonpressed_center != 0 && digitalRead(PIN_BTNCENTER)){ //button released (was pressed) + if (loopmillis-timebuttonpressed_center < BUTTONTIMEHOLD){ //short press + button_center=true; + } + timebuttonpressed_center=0; //re-enable after short press and release from hold + }else if(loopmillis-timebuttonpressed_center >= BUTTONTIMEHOLD && timebuttonpressed_center>0){ //held down long enough and not already hold triggered + button_hold_center=true; + timebuttonpressed_center=-1; //-1 as flag for hold triggered + } + + //Right + if (timebuttonpressed_right == 0 && !digitalRead(PIN_BTNRIGHT)){ //first time pressed down. (low when pressed) + timebuttonpressed_right=loopmillis; //set time of button press + }else if(timebuttonpressed_right != 0 && digitalRead(PIN_BTNRIGHT)){ //button released (was pressed) + if (loopmillis-timebuttonpressed_right < BUTTONTIMEHOLD){ //short press + button_right=true; + } + timebuttonpressed_right=0; //re-enable after short press and release from hold + }else if(loopmillis-timebuttonpressed_right >= BUTTONTIMEHOLD && timebuttonpressed_right>0){ //held down long enough and not already hold triggered + button_hold_right=true; + timebuttonpressed_right=-1; //-1 as flag for hold triggered + } + } + + /* + if (button_trigger || button_left || button_center || button_right){ + Serial.println("Buttons short:"); + Serial.print(button_trigger); + Serial.print(button_left); + Serial.print(button_center); + Serial.println(button_right); + } + if (button_hold_trigger || button_hold_left || button_hold_center || button_hold_right){ + Serial.println("Buttons long:"); + Serial.print(button_hold_trigger); + Serial.print(button_hold_left); + Serial.print(button_hold_center); + Serial.println(button_hold_right); + } + */ + + //Voltage + vbat=map(analogRead(PIN_VBAT), 0,3910,0,8400)/1000.0; //180k and 300k voltage divider. 8,4V -> 3,15V=3910 + + if ( loopmillis-last_ldrReading>LDRDELAY ) + { + if (!digitalRead(PIN_BRIGHTMODE)){ + analog_low=analogRead(PIN_LDR); + }else{ + analog_high=analogRead(PIN_LDR); + } + digitalWrite(PIN_BRIGHTMODE, !digitalRead(PIN_BRIGHTMODE)); //switch modes + last_ldrReading=loopmillis; + } + + + //Test asdf + /* + if ( !digitalRead(PIN_TRIGGER) ) { + Serial.println("roundAperature"); + for (float i=0.1;i<30;i+=0.5){ + Serial.print(i); + Serial.print(" -> "); + Serial.println(roundAperature(i,1)); + } + Serial.println("roundShutter"); + for (float i=1.0/8000;i<32;i*=2){ + Serial.print(i,6); + Serial.print(" -> "); + Serial.print(roundShutter(i,1),6); + Serial.print(" -- "); + Serial.println(reciprocFloat(roundShutter(i,1))); + } + + + Serial.println("calculateShutter at iso 100 f8"); + for (int8_t i=-2;i<18;i++){ + Serial.print(i); + Serial.print(" -> "); + Serial.println(calculateShutter(i, (uint16_t)100, 8.0),6); + } + + Serial.println("calculateAperature at iso 100 1/125s"); + for (int8_t i=-2;i<18;i++){ + Serial.print(i); + Serial.print(" -> "); + Serial.println(calculateAperature(i, (uint16_t)100, 1.0/125),6); + } + + } + */ + + + switch(displaymode){ + case lightmeter: + handleInputs_Lightmeter(); + break; + case settings: + handleInputs_Settings(); + break; + } + + + + if (millis()-millis_lastchange>TIME_AUTOPOWEROFF){ + digitalWrite(PIN_ON, LOW); + } + + if ( button_trigger || button_left || button_center || button_right ) { + millis_lastchange=millis(); //for auto poweroff + millis_lastinput=millis(); //for debouncing + } + +} + +void handleInputs_Lightmeter() +{ + if ( button_hold_center ) { //Go to Settings + displaymode=settings; + } + + if (setShutter==0 && setAperature==0){ //Auto + //Value Change + if ( button_left ) { + + } + if ( button_right ) { + + } + //Change Mode + if ( button_hold_left ){ //Auto -> T + setShutter=showShutter; + setAperature=0; + } + if ( button_hold_right ){ //Auto -> Av + setAperature=showAperature; + setShutter=0; + } + }else if(setShutter==0){ //Aperature Priority + //Value Change + if ( button_left ) { + changeAperature(1); //Decrement Aperature + } + if ( button_right ) { + changeAperature(-1); //Increment Aperature + } + //Change Mode + if ( button_hold_left ){ //change from Aperature Priority to Auto, Av -> Auto + setAperature=0; + setShutter=0; + } + if ( button_hold_right ){ //Av -> T + setShutter=showShutter; + setAperature=0; + } + }else if (setAperature==0){ //Shutter Priority + //Value Change + if ( button_left ) { + changeShutter(1); //Decrement Aperature + } + if ( button_right ) { + changeShutter(-1); //Increment Aperature + } + //Change Mode + if ( button_hold_left ){ //T -> Av + setAperature=showAperature; + setShutter=0; + } + if ( button_hold_right ){ //T -> Auto + setAperature=0; + setShutter=0; + } + } + + +} + + +void handleInputs_Settings() +{ + if ( button_hold_center ) { //Go to Lightmeter + displaymode=lightmeter; + } + + + + if (!settings_itemActive){ //select items + if ( button_left ) { + if (settings_selectedItem>0){ //not first item + settings_selectedItem-=1; + } + } + if ( button_right ) { + if (settings_selectedItem1){ + userSettings.aperatureSelectionMode-=1; + } + } + if ( button_right ) { + if (userSettings.aperatureSelectionMode1){ + userSettings.shutterSelectionMode-=1; + } + } + if ( button_right ) { + if (userSettings.shutterSelectionMode14){ + ev=highev; + }else if(lowev<12.5){ + ev=lowev; + }else{ //mix of both + float mix=min(1.0, max(0.0,(lowev-12.5)/(14-12.5))); //0 to 1, 0-> use only lowev, 1-> use only highev + ev=lowev*(1-mix)+highev*mix; + } + + if (setAperature>0){ //Aperature Priority + showAperature=setAperature; //use user set Aperature + showShutter=calculateShutter(ev,setISO, setAperature); + }else if(setShutter>0){ //Shutter Priority + showShutter=setShutter; //use user set Shutter + showAperature=calculateAperature(ev, setISO, setShutter); + }else{ //Auto + //TODO + showAperature=42; + showShutter=42; + } + +} + +float calculateShutter(float pEv, uint16_t pIso, uint16_t pAperature) //returns calculated Shutter speed given Ev, ISO and Aperature +{ + //EV = log2 ( 100* Aperature^2 / (ISO * Time )) + //100* Aperature^2 / (2^EV * ISO) = Time + return (100.0 * pow( pAperature,2) ) / (pow(2,pEv)*pIso); +} +float calculateAperature(float pEv, uint16_t pIso, float pShutter) //returns mathematical aperature in x1 +{ + //EV = log2 ( 100* Aperature^2 / (ISO * Time )) + // sqrt( 2^EV *(ISO * Time ) /100 ) = Aperature + return sqrt( pow(2,pEv) * pIso * pShutter / 100.0 ) ; +} +float roundShutter(float pShutter, uint8_t pMethod) //round shutter to typical values +{ + uint8_t _index=findShutterIndex(pShutter,pMethod); + + //use closest shutter value + switch(pMethod){ + case 1: // + return shuttertimes1[_index]; + break; + } +} + +float roundAperature(float pAperature, uint8_t pMethod) //round Aperature (x1) to typical values. method=0 -> leave, 1=full stops, 2=half stops, 3=third stops +{ + if (pMethod==0){ + return pAperature; + } + + uint8_t closest_index=findAperatureIndex(pAperature,pMethod); + + //use closest aperature value + switch(pMethod){ + case 1: //full stops + return aperaturesFull[closest_index]; + break; + case 2: //half stops + //return float ( pow(sqrt(sqrt(2)), _index-2) ); + return aperaturesHalf[closest_index]; + break; + case 3: //third stops + return aperaturesThird[closest_index]; + //return float ( pow(cbrt(sqrt(2)), _index-2) ); + break; + } +} + +void changeAperature(int8_t pchange){ //pchange>0 means more light exposure (brighter image) + uint8_t _newAperatureIndex=findAperatureIndex(setAperature,userSettings.aperatureSelectionMode); + + uint8_t _maximumAperatureIndex=0; + switch(userSettings.aperatureSelectionMode){ //check max + case 1: //full stops + _maximumAperatureIndex=sizeof(aperaturesFull)/sizeof(float); + break; + case 2: //half stops + _maximumAperatureIndex=sizeof(aperaturesHalf)/sizeof(float); + break; + case 3: //third stops + _maximumAperatureIndex=sizeof(aperaturesThird)/sizeof(float); + break; + } + _newAperatureIndex-=pchange; //change aperature + _newAperatureIndex=min(_newAperatureIndex,_maximumAperatureIndex-1); //maximum limit + _newAperatureIndex=max(_newAperatureIndex,userSettings.minimumAperatureIndex); //minimum limit + + switch(userSettings.aperatureSelectionMode){ + case 1: //full stops + setAperature=aperaturesFull[_newAperatureIndex]; + break; + case 2: //half stops + setAperature=aperaturesHalf[_newAperatureIndex]; + break; + case 3: //third stops + setAperature=aperaturesThird[_newAperatureIndex]; + break; + } +} +uint8_t findAperatureIndex(float pAperature,uint8_t pMethod) //find index of closest aperature from given aperature tables (pMethod +{ + float _minDistance=90000; + float _lastminDistance=100000; + uint8_t _index=userSettings.minimumAperatureIndex; + + while (_lastminDistance>_minDistance) //until distance increases + { + _lastminDistance=_minDistance; + + switch(pMethod){ + case 1: //full stops + _minDistance=abs( pAperature - aperaturesFull[_index] ); + break; + case 2: //half stops + _minDistance=abs( pAperature - aperaturesHalf[_index] ); + break; + case 3: //third stops + _minDistance=abs( pAperature - aperaturesThird[_index] ); + break; + } + _index++; //next + } + return _index-2; +} + + +void changeShutter(int8_t pchange){ //pchange>0 means more light exposure (brighter image) + + + uint8_t _newShutterIndex=findShutterIndex(setShutter,userSettings.shutterSelectionMode); + + uint8_t _maximumShutterIndex=0; + switch(userSettings.shutterSelectionMode){ //get max index from array + case 1: + _maximumShutterIndex=sizeof(shuttertimes1)/sizeof(float); + break; + } + + if (!( -pchange<0 && _newShutterIndex==0)){ //changed value would not yield negative index + _newShutterIndex-=pchange; //change aperature + _newShutterIndex=min(_newShutterIndex,_maximumShutterIndex-1); //maximum limit from array + //_newShutterIndex=min(_newShutterIndex,maximumShutterIndex); //maximum limit from user settings + } + + switch(userSettings.shutterSelectionMode){ + case 1: // + setShutter=shuttertimes1[_newShutterIndex]; + break; + } +} +uint8_t findShutterIndex(float pShutter,uint8_t pMethod) //find index of closest aperature from given aperature tables (pMethod +{ + float _minDistance=abs(pShutter-shuttertimes1[0]); + float _lastminDistance=_minDistance; + uint8_t _index=0; + + + while (_lastminDistance>=_minDistance) //until distance increases + { + _lastminDistance=_minDistance; + + switch(pMethod){ + case 1: + _minDistance=abs(pShutter - shuttertimes1[_index]); + break; + } + _index++; //next + } + return _index-2; +} + +void changeISO(int8_t pchange){ //pchange>0 means more light exposure (brighter image), higher iso + + + uint8_t _newISOIndex=findISOIndex(setISO,userSettings.ISOSelectionMode); + + uint8_t _maximumISOIndex=0; + switch(userSettings.ISOSelectionMode){ //get max index from array + case 1: + _maximumISOIndex=sizeof(isoFull)/sizeof(float); + break; + case 2: + _maximumISOIndex=sizeof(isoThird)/sizeof(float); + break; + } + if (!( pchange<0 && _newISOIndex==0)){ //changed value would not yield negative index + _newISOIndex+=pchange; //change iso + _newISOIndex=min(_newISOIndex,_maximumISOIndex-1); //maximum limit from array + //_newISOIndex=min(_newISOIndex,maximumISOIndex); //maximum limit from user settings + } + + switch(userSettings.ISOSelectionMode){ + case 1: // + setISO=isoFull[_newISOIndex]; + break; + case 2: // + setISO=isoThird[_newISOIndex]; + break; + } +} + +uint8_t findISOIndex(float pISO,uint8_t pMethod) //find index of closest iso from given iso table (pMethod) +{ + float _minDistance=abs(pISO-isoFull[0]); + float _lastminDistance=_minDistance; + uint8_t _index=0; + + + while (_lastminDistance>=_minDistance) //until distance increases + { + _lastminDistance=_minDistance; + + switch(pMethod){ + case 1: + _minDistance=abs(pISO - isoFull[_index]); + break; + case 2: + _minDistance=abs(pISO - isoThird[_index]); + break; + } + _index++; //next + } + return _index-2; +} + +void updateDisplay() +{ + switch(displaymode){ + case lightmeter: + updateDisplay_Lightmeter(); + break; + case settings: + updateDisplay_Settings(); + break; + } + + + display.display(); +} + +void updateDisplay_Lightmeter() //Lightmeter display +{ + #define xpos_aperature 2 + #define ypos_aperature 29 + #define xpos_shutter 60 + #define ypos_shutter 29 + + #define xpos_debug 0 + #define ypos_debug 63-7 + + #define xpos_iso 2 + #define ypos_iso 63-7-9 + + display.clearDisplay(); + display.setTextColor(WHITE); + + //Aperature + float _showAperature=roundAperature(showAperature,userSettings.aperatureSelectionMode); + display.setTextSize(1); + display.setCursor(xpos_aperature,ypos_aperature); display.print("F"); + display.setTextSize(2); + display.setCursor(display.getCursorX(),display.getCursorY()); display.print(int(_showAperature)); + if ( int( (_showAperature-int(_showAperature) )*10 ) !=0){ //has a decimal + display.setTextSize(1); + display.setCursor(display.getCursorX()-2,display.getCursorY()+7); display.print("."); display.setCursor(display.getCursorX()+1,display.getCursorY()-7); + display.setTextSize(2); + display.setCursor(display.getCursorX()-2,display.getCursorY()); + display.print( (int)round( (_showAperature-int(_showAperature) )*10)); + } + //Aperature border + if (setAperature>0){ //Aperature Priority Mode + display.drawRect(xpos_aperature-2, ypos_aperature-2, 40, 18, WHITE); + } + + + //Shutter + display.setCursor(xpos_shutter,ypos_shutter); + float _showShutter=roundShutter(showShutter,userSettings.shutterSelectionMode); + //Serial.print("rounded Shutter from "); Serial.print(showShutter); Serial.print(" to "); Serial.println(_showShutter); //asdf + if (_showShutter>=1) //check time + { //show full seconds + display.print(int(_showShutter)); + if (_showShutter-int(_showShutter)>0){ //has decimals + display.setTextSize(1); + display.setCursor(display.getCursorX()-2,display.getCursorY()+7); display.print("."); display.setCursor(display.getCursorX()+1,display.getCursorY()-7); + display.setTextSize(2); + display.setCursor(display.getCursorX()-2,display.getCursorY()); + display.print( (int)round( (_showShutter-int(_showShutter))*10)); //show one decimal + } + display.setTextSize(1); display.setCursor(display.getCursorX(),display.getCursorY()+7); + display.print("s"); + }else{ //show fraction of a second + display.setTextSize(1); display.print("1"); + display.drawLine(display.getCursorX()+1,display.getCursorY(), display.getCursorX()-1, display.getCursorY()+9, WHITE); + display.setTextSize(2); display.setCursor(display.getCursorX()+2,display.getCursorY()); + int _frac_showShutter = (int) ( (1.0f/( (int)(_showShutter*1000000) ) )*1000000 ); + display.print( _frac_showShutter ); + display.setTextSize(1); display.setCursor(display.getCursorX(),display.getCursorY()+7); + display.print("s"); + } + //Shutter border + if (setShutter>0){ //Shutter Priority Mode + display.drawRect(xpos_shutter-2, ypos_shutter-2, 40, 18, WHITE); + } + + //ISO + display.setCursor(xpos_iso,ypos_iso); display.setTextSize(1); display.print("ISO "); display.print(setISO); + + //DEBUG Message + display.setTextSize(1); + display.setCursor(xpos_debug,ypos_debug); + display.print(vbat); + display.print("V "); + display.print("Ev="); + display.print(ev); +} + +void updateDisplay_Settings() +{ + display.clearDisplay(); + display.setTextColor(WHITE); + display.setTextSize(1); + #define SETTINGS_YPOS_INCREMENT 9 + #define SETTINGS_XPOS_OFFSET 1 + + + + display.setCursor(SETTINGS_XPOS_OFFSET,0); //absolute position for first item + + for (uint8_t _currentItemIndex=0;_currentItemIndex<=SETTINGS_SELECTEDITEM_MAX;_currentItemIndex++) + { + if (settings_selectedItem==_currentItemIndex){ + if (settings_itemActive){ + display.drawRect(0, display.getCursorY()-2, 126 , 11, WHITE); + }else{ + display.fillCircle(2, display.getCursorY()+3,2, WHITE); //x,y,r,color + } + display.setCursor(display.getCursorX()+5,display.getCursorY()); //move text to the right + } + display.print(settingStrings[_currentItemIndex]); + switch(_currentItemIndex){ //if values need to be shown + case 0: display.print(setISO); + break; + case 1: display.print(settingsnameAperatureSelectionMode[userSettings.aperatureSelectionMode-1]); + break; + case 2: display.print(settingsnameShutterSelectionMode[userSettings.shutterSelectionMode-1]); + break; + } + + display.setCursor(SETTINGS_XPOS_OFFSET,display.getCursorY()+SETTINGS_YPOS_INCREMENT); //move cursor to next entry + } + + + + /* + if (settings_selectedItem==1){ + if (settings_itemActive){ + display.drawRect(display.getCursorX()-2, display.getCursorY()-2, 126 , 11, WHITE); + }else{ + display.drawCircle(0, display.getCursorY()+4,2, display.getCursorY()+6); + } + } + display.print("TestTest");*/ + +} +