dunque, i sensori (nessuno di quelli postati) NON restituiscono il valore direttamente in LUX, ma nei datasheet trovi i dati necessari per fare la conversione...
quelli che ti hanno fornito sono semplicemente il valore minimo e massimo leggibile.
allora prima di tutto la spettro visibile va dai 380 nm ai 750 nm (fonte:
http://en.wikipedia.org/wiki/Visible_spectrum)
il sensore n°1 e n°2 emettono un'onda quadra, più breve è l'onda (bassa frequenza) più piccolo è il valore letto. Per avere dei valori precisi devi usare gli interrupt, argomento non facilissimo, ma fino a 2 sensori puoi usare le funzioni precotte di arduino che semplificano un sacco la vita

il sensore n°3 invece emette un segnale analogico, che quindi si può leggere con un'analogRead()
Per ovviare al problema dell'ombra/luce diretta la soluzione secondo me è di mettere il sensore sempre in ombra: per esempio lo metti all'estremo di un tubo, e l'altro estremo lo tieni un pò inclinato verso il basso (se il pavimento non riflette) o orizzontale.
Per ovviare al problema dei valori ballerini, come hai detto tu basta una media; per esempio ogni volta che leggi un valore, lo sommi agli X precedenti e poi dividi per X+1.
Se fai qualche esperimento, noterai che nel grafico risultante, anziché avere dei picchi avrà una funzione molto più "arrotondata", a seconda di quanto è grande la X. Piccolo problema:
X piccola = reazione veloce ma sensibile al rumore (letture errate)
X grande = reazione lenta ma poco sensibile al rumore