LDR fotoresistencia

En Arduino como puedo hacer que me saque el valor de la intensidad de la luz si lo que me entra es el valor de un voltaje entre 0 a 5 V

olá
Verifique esta hoja de datos y vea si ayuda.

1 Like

En base al voltaje leído puedes calcular el valor de la resistencia de la LDR.
Teniendo este valor, y basado en la hoja de datos que te ha linkeado @ruilviana puedes encontrar el valor aproximado de intensidad (fijate que está graficado en lux e, indirectamente, en lúmenes).
A primera vista parece simple, es una recta con pendiente negativa por lo que aplicando la ecuación de la recta resultaría sencillo, pero si te fijas ambos ejes tienen escala logarítmica, y eso lo complica.
Ya estoy mayorcito y no recuerdo la ecuación pero si investigas un poco seguro vas a hallar la solución.

Saludos

1 Like

Ola,
probar este código.

// Calc lux over LDR
float lux = 0.000000;
float ftc = 0.000000;
float calc = 0.000000;
float value = 0.000000;
float factor = 0.000000;
float vOverLDR = 0.000000;
float refVolt = 5.000000;
float valueADC = 1023.000000;
float curOverRX_LDR = 0.000000;
float rX = 10.000000;  // (10K)
//-----------------------------------------
void setup() {
  Serial.begin(115200);
  factor = refVolt / valueADC;
  luxCalc();
}
//-----------------------------------------
void loop() {
}
//----------------------------------------------------------
void luxCalc()
{
  value = analogRead(A0);
  calc =  value * factor;
  Serial.print("rdrVoltage: "); Serial.println(calc);
  vOverLDR =  refVolt - calc;
  Serial.print("vOverLDR: "); Serial.println(vOverLDR);
  curOverRX_LDR = calc / rX;
  Serial.print("curOverRX_LDR: "); Serial.println(curOverRX_LDR);
  ftc = vOverLDR / curOverRX_LDR;
  Serial.print("ftc: "); Serial.println(ftc);
  lux = ftc * 10.764000;
  Serial.print("lux: "); Serial.println(lux);
}

ldr-circuit

1 Like

Muchas gracias. Creo que funciona perfecto ahora lo que tengo es que arreglarlo para el caso del que el voltaje que me entre sea de 0V porque en ese caso me daria infinito y me deberia devolver un valor

Tengo una duda en cuanto al código por qué se divide entre 10 que es la rx la parte de curOverRX_LDR=calc/rx. Eso tiene que ver con la figura 3 del datasheet del LDR???
Con esa figura como encuentro la relacion entre la resistencia y la luz???

Coloca en lugar de 5.000 5.001 y listo, jamás te dará infinito porque la diferencia de

vOverLDR =  refVolt - calc;

no será 0 sino 0.001

Todavia no he logrado entender por qué se divide entre 10???

curOverRX_LDR = calc / rX;

Calcula la corriente que circula por la LDR y rX (por ley de Ohm, I = V / R), entonces calc es la tensión leída respecto a masa (obviamente) y rX es la resistencia conectada a masa expresada en Kohms, en este caso 10.
O sea, no se divide por 10, se divide por el valor de rX en Kohms, si rX fuese de 4K7 (4700 ohms o 4.7 Kohms) se dividiría por 4.7, si fuese de 100K se dividiría por 100.

Saludos

1 Like

Mi LDR está conectada en un puente de Wheatstone, con una bateria de 5 V. Todas las R son de 500 Ohms, es decir que mi puente estaría balanceado cuando la R del LDR sea de 500 Ohm y variaria a medida que cambia la intensidad del foco de luz. La corriente que circula por la LDR variaria según el valor de resistencia que tenga en ese momento. Los valores de R del LDR varian entre 500 Ohm y 1M. Para calcular la corriente que circula por la LDR con que valores lo haria??? Entonces para calcular rx seria con esa I de la LDR pero con qué voltaje???
Saludos y disculpe mis preguntas. Es que esto lo estoy viendo por primera vez.

Lo de la I por ahora te lo debo pero tengo dudas si ese código es adecuado para una configuración Wheatstone.

Tengo una duda aquí haber si puedes ayudarme. Según esta grafica como puedo calcular el valor de la luz sabiendo la resistencia


Así está conectado mi circuito

Te expliqué en #3 pero no me pidas la fórmula porque no la sé.


Definitivamente el código de #4 no sirve para esa configuración.

Y como seria el codigo entonces. Lo que debo mostrar en pantalla es el valor de la intensidad de la luz y lo que le entra al arduino es el voltaje de salida del amplificador que está entre 0 y 5 V

Es que para hacer el código hay que saber que cálculos aplicar y yo no los se.
De lo que si estoy seguro es que el código de #4 es para una configuración como la de #4.

Si te basaste en el circuito de algún site para hacer el tuyo, seguramente tenga el código también o al menos los cálculos.
Más no puedo aportar.

Saludos

1 Like

Muchas gracias de todas formas. Ya veré como lo resuelvo

Y si para calcular el valor de la luz al principio uso la relacion lux=500/R. Con eso ya podria hacer el codigo??

¿Y cómo calcularías el valor de R?
Cambia los términos

500 = lux * R

Tienes 2 incógnitas ¿Cómo lo resuelves?

¿Y las otras 2 resistencias del puente, las olvidas?

Respondo al post#12

Ecuación de la recta es siempre la misma pero en este caso es con escalas logarítimicas en ambos ejes.
La ecuacioón de la recta que pasa por dos puntos es y será siempre
y - y1 = (y2-y1)/(x2-x1) *x

Cuando los ejes cartesianos son escalas logarítmicas, aplicas a x e y justamente el Log10 en este caso. Logaritmo decimal, también podría ser logaritmo en base e o sea neperiano.

Log10 (y) = [log10(y2)-log10(y1)]/[log10(x2)-log10(x1)]*log10(x) + b

Por propiedades de logaritmos

[log10(y2)-log10(y1)] =log10(y2/y1)
entonces
m = log10(y2/y1)/log10(x2/x1)

log10(y) = m*log10(x) + b

de ver el gráfico he sacado usando Excel además estos valores

log10 (X) log10(y)
0,1 50
1 10
10 2
100 0,4

Con ellos obtuve este m = -0,698970004 que me dió constante porque jugué un poco con los valores. toleren que sea una buena aproximación

La ecuación resultante será
m = -0,698970004
log10(y) = mlog10(x) + b
Para el primero punto si
x = 1 => y = 10
b = log10(10) - m
log10(1) = 1

Ecuación final log10(y) = m*log10(x)+1
Y ahora me doy cuenta que lo hago al revés y queremos saber x asi que no importa
Despejo X
log10(x) = (log10(y)-1)/m quito el log10 a x
x = pow(10, (log10(y)-1)/m)

El divisisor LDR y R de 10K
Llamaré LDR a la R de la LDR en todo momento
ADC es lo que analogRead(Ax) me devuelve en la configuración indicada mas arriba.
Lo máximo sera 1023
Lo minimo 0 (no alcanzado)
ADC = 10 / (LDR+10)*1023
Los valores estan en K pero no interesa, todo se simplifica
Ahora tu código aprovechando la grafica

#include <math.h>

// mucho mas abajo en el loop
double m = -0,698970004;

// 
double resistenciaLDR = 10/analogRead(A0*1023-10;
double x = pow(10, (log10(resistenciaLDR )-1)/m);

A ver que tal se comporta.