Uploaded by Raul Alfaro

Sensor de radiación ultravioleta con Arduino y UVM30A

advertisement
29 MAR 2016
Sensor de radiación ultravioleta con Arduino
! por Víctor Ventura | " publicado en: Portada |
58
Radiación ultravioleta (UV)
Además de la radiación electromagnética que los humanos somos capaces de ver, existen rangos con
longitudes de onda más larga, infrarrojo, y más corta, ultravioleta. Una parte de esta radiación, la de
longitud más corta, tiene efectos ionizantes, es decir, es capaz de desplazar electrones de los átomos
modificando su estado.
Mientras que la zona visible se encuentra aproximadamente en el rango comprendido entre los 400 nm y los
700 nm, la ultravioleta comienza en los 10 nm (ultravioleta extremo) y termina en los 400 nm (UVA, onda
larga) donde comienza la parte visible del espectro.
Búsqueda
Buscar
Entradas
recientes
Qué es la Internet de las Cosas
(IoT)
Librería Hardware I/O para
Processing
Instalar GNU/Linux en un SBC para
monitorización y control
electrónico
Comunicaciones Bluetooth con
Processing para Android y la
librería Ketai
Programación para Android con
Processing
Comunicaciones serie con
Processing
Processing
La radiación ultravioleta se utiliza para diversos fines prácticos, desde matar bacterias hasta revelar las
placas de los circuitos impresos que fabricas en casa pero además de útil puede ser también peligrosa para
la salud.
La capa de ozono que rodea la tierra nos defiende de buena parte de la radiación ultravioleta más ionizante
de la que nos llega desde el sol: la de longitud de onda más corta, los «rayos UVC», que se encuentran entre
los 100 nm y 280 nm. Pero aún queda la UVB, entre 280 nm y 315 nm, también en parte ionizante y la UVB,
entre 315 nm y 400 nm, que es menos agresiva.
Precisamente es la radiación ultravioleta la que produce la capa de ozono en la estratosfera al disociar las
moléculas de oxígeno O2 en dos átomos O, muy reactivos, que forman el ozono O3 al reaccionar cada uno con
otra molécula de O2.
Índice UV (ultravioleta)
El índice UV es un sistema estándar sencillo para medir la radiación ultravioleta que llega desde el sol a la
tierra que sirve como orientación para determinar el riesgo potencial para la salud. La Organización Mundial
de la Salud publica una guía práctica sobre el índice UV en la que explica los riesgos para la salud de la
radiación ultravioleta y propone algunas medidas de protección en función de su intensidad.
Conexión Bluetooth con un módulo
HC-06
MAX30100 sensor de latido de
corazón y oxímetro de pulso con
comunicaciones I2C para wearables
de salud
Programar un módulo wifi ESP8266
desde el IDE de Arduino
Programar el SoC wifi ESP8266
Librería para el envío de correo
electrónico desde Arduino con un
módulo Wifi ESP8266
Operaciones básicas sobre un
módulo wifi ESP8266 desde Arduino
Librería de codificación Base64
con Arduino
MLX90614. Termómetro sin
contacto por infrarrojos con
comunicaciones SMBus.
MAX6675. Conversor analógicodigital para sondas de termopar K
con compensación de unión fría y
comunicaciones SPI.
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 1 de 22
Sensor de temperatura I2C LM75
Medida electrónica de la
temperatura
Sensor de color TCS3472 con
conexión I2C
MAX7219 y MAX7221,
controladores SPI de pantallas LED
de 8 dígitos de 7 segmentos
Ajustar la hora de un RTC (reloj
en tiempo real) con Arduino
ESP8266 ¿Qué módulo elegir?
Sensor de color I2C TCS3414
MCP23S17 Expansor de 16 bits de
puertos GPIO de entrada y salida y
conexión SPI
Sensor ultravioleta I2C VEML6070
Gráficas de estado de sensores
conectados a la Internet de las
cosas IoT
Esta guía práctica sobre el Índice Solar Mundial es una recomendación conjunta de la Organización Mundial
de la Salud, la Organización Meteorológica Mundial, el Programa de las Naciones Unidas para el Medio Ambiente
y la Comisión Internacional de Protección contra la Radiación no Ionizante.
Para hacer su uso más sencillo establece un código de colores que asocia a los diferentes niveles: verde
para el nivel bajo (índices 1 y 2), amarillo para el moderado (índices del 3 al 5), naranja para el alto (índices 6
y 7), rojo para el nivel muy alto (índices del 8 al 10) y morado para el nivel extremadamente alto (índices 11
en adelante) En función de estos índices y del fototipo de cada persona recomienda unos tiempos máximos
de exposición y unas recomendaciones preventivas.
Medida de la radiación ultravioleta y cálculo del índice UV
Para medir con precisión la radiación ultravioleta, no solo la que llega del sol, también la que producen
ciertos equipos, como las lámparas o LED con este tipo de luz, se utilizan espectrorradiómetros. Calibrados
con los anteriores dispositivos, se pueden usar otros más sencillos (y económicos) como fotodiodos, que
suelen ser de tipo Schottky. El «truco» consiste en medir la luz de cierta longitud de onda (del entorno de
los UVA, normalmente) y presumir que corresponde, más o menos proporcionalmente, con la irradiancia
ultravioleta; puede parecer poco preciso, pero es razonablemente funcional como para estimar el UVi.
Existen componentes que incorporan sólo la función de medida de la radiación ultravioleta o, más
exactamente la del índice UV, como el GUVA-S12SD, que incorporan amplificación, como el ML8511, ambos
analógicos, o digitales, como el VEML6070, que comunican por I²C el resultado de la medición. También están
presentes como una función secundaria en algunos sensores de iluminación y proximidad, como el Si1145, que
también utiliza el protocolo I²C.
Ninguno de los anteriores componentes es especialmente caro ni adquirido en series pequeñas y existen
versiones de todos ellos en módulos que se pueden usar para prototipar o para realizar pruebas.
Para usarlo como ejemplo en este artículo he elegido el GUVA-S12SD que es muy popular (seguramente
tienes uno en tu insoladora ultravioleta de circuitos) y que se puede encontrar en módulos UVM30A que
pueden usarse fácilmente con Arduino. El rango de longitudes de onda que mide el GUVA-S12SD se sitúa
entre los 240 nm y los (aproximadamente) 380 nm, muy adecuado para determinar la radiación ultravioleta
más peligrosa.
Definir con CSS el aspecto de la
web de gráficos de sensores en la
IoT
Dibujar con SVG los gráficos de
datos de sensores conectados a la
Internet de las cosas (IoT)
Generar y modificar con
JavaScript los gráficos SVG de
datos de sensores conectados a la
IoT
Sensor de color TCS3200
BH1750. Sensor de luz ambiental
con bus I2C.
LDR: medir la luz con una
fotorresistencia
PCF8591 Conversor AD-DA de 8
bits I2C
PCF8574. Expansor I2C de 8 bits
de puertos GPIO digitales de
entrada y salida.
Sensor de radiación ultravioleta
con Arduino
Gestionar fecha y hora con el
módulo RTC DS3231 y Arduino
Medir distancias con ultrasonidos
Formato JSON
Acceder a la base de datos desde
el lenguaje de programación PHP
Preparar la base de datos MySQL o
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 2 de 22
MariaDB
Almacenar datos en un servidor
web IoT usando peticiones HTTP
POST
Cómo almacenar los datos
obtenidos por los dispositivos de
la Internet de las cosas (IoT)
Comparando Arduino y el módulo
WiFi ESP8266
Medida de temperaturas en
Arduino con DS18B20 1-Wire
Asignar un nombre fijo al puerto
serie USB de Arduino
Modelos 2D y 3D y montaje del
vehículo de ayuda a la
rehabilitación del DCA
Como la fórmula para calcular el índice UV, que puede consultarse en la guía práctica sobre el índice UV es
muy compleja como para actualizar el resultado frecuentemente con un microcontrolador, el fabricante del
módulo proporciona una tabla con los valores de salida con los que se alcanzan los diferentes niveles del
índice UV.
Software del vehículo de ayuda a
la rehabilitación del DCA
Componentes del vehículo de ayuda
a la rehabilitación del DCA
Vehículo a control remoto para
rehabilitación de personas con
daño cerebral adquirido
Librería para manejar Arduino con
un mando a distancia por
infrarrojos
Librería Arduino para controlar un
display LED de dígitos de 7
segmentos con TM1637
TM1637 driver para display LED de
6 dígitos de 7 segmentos y teclado
de 16 pulsadores
Librería Arduino para
monitorización de la frecuencia
cardíaca con oxímetro de pulso
Principio de funcionamiento del
oxímetro para monitorización del
pulso
Librería de Arduino para consultar
fecha y temperatura del integrado
DS3231 por I2C
Según puede verse en la gráfica anterior, especialmente para radiaciones bajas, el comportamiento no es
completamente lineal aunque a efectos de establecer el índice UV, con unos márgenes relativamente
grandes, no se cometería un gran error al considerarlo como lineal para ahorrar unos bytes de memoria o
simplificar la programación. En cualquier caso, en los programas de ejemplo para Arduino que he desarrollado
como ejemplo se usa la tabla de valores del fabricante.
Usar el fotodiodo Schottky GUVA-S12SD del módulo UVM30A con Arduino
Usar el módulo UVM30A no puede ser más sencillo, basta con alimentarlo y leer el voltaje con el que
representa el nivel de radiación ultravioleta que detecta. Puede alimentarse con tensiones entre 3 V y 5 V
y puede entregar a la salida entre 0 y 1200 mV (aunque de hecho no supere el voltio). Como por encima de
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
Reloj en tiempo real DS3231 con
comunicaciones I2C
Almacenamiento de datos en una
tarjeta SD conectada a Arduino
por SPI
Conexión de una tarjeta SD por
SPI a Arduino
Monitorización desde un ordenador
de sensores conectados a una
placa Arduino
Configuración de las
17/11/20 9=04
Página 3 de 22
1100 mV de salida corresponde a un índice UV extremadamente alto (un índice mayor que 10) se puede usar
la referencia interna de 1100 mV para distribuir mejor la sensibilidad aunque renunciando a la posibilidad de
determinar cuánto se supera el índice 10, sólo estimando que se alcanzado el 11, pero ahorrando un divisor
de tensión para usar como referencia de entrada analógica en Arduino.
comunicaciones serie entre
Arduino y Python
Instalación de herramientas de
desarrollo para comunicaciones
serie en Python
Adquisición de datos y
administración desde ordenador de
dispositivos microcontrolados
Sincronización horaria con un
módulo ESP8266
Librería para hacer consultas HTTP
con un módulo WiFi ESP8266 y
Arduino
Conexión WiFi con un módulo
ESP8266
Usar componentes de superficie
en montajes de inserción
Conexión Ethernet TCP con
Arduino
Conexión Ethernet con el
integrado ENC28J60 de Microchip
Gestión del reloj watchdog (perro
guardián) en Arduino
Para trabajar con la referencia interna de 1100 mV en las placas Arduino basadas en el microcontrolador
ATmega168 o en el ATmega328 (como Arduino Uno) se usa analogReference(INTERNAL) y se usa
analogReference(INTERNAL1V1) para las placas Arduino Mega.
Programación ISP de Arduino (en
sistema)
El tiempo de lectura del GUVA-S12SD es bastante rápido y la respuesta razonablemente estable. En los
montajes de prueba, la lectura analógica que se realiza del módulo UVM30A desde Arduino, seguramente por
la disposición de los cables, no es tan buena como la que da el osciloscopio, aunque resulta más que
aceptable para medir el índice UV y es de esperar que en un prototipo montado en un circuito impreso
incluso mejore. En cualquier caso, para tratar de eliminar las desviaciones de posibles interferencias, el
programa realiza varias mediciones, tantas como sea posible en cierto periodo de tiempo, y las promedia
para establecer un valor que compara con los de la tabla del fabricante para calcular el índice UV.
Puesto que la lectura analógica con analogRead() tiene una resolución de 10 bits (excepto en Arduino
Due y en Arduino Zero, en los que puede configurarse a 12 bits) para obtener la tensión entregada por el
módulo UVM30A hay que convertir el rango de 0 a 1023, que devuelve la función, al rango que va de 0 a
1100, que son los milivoltios que se han establecido como referencia con analogReference() . Para
realizar la conversión hay que multiplicar por 1100 y dividir por 1023. En el primer programa de ejemplo se
usa como una constante para hacerlo en una única operación y facilitar la lectura.
El siguiente programa de ejemplo lee el sensor de radiación ultravioleta GUVA-S12SD del módulo UVM30A
cada cierto intervalo ESPERA_ENTRE_LECTURAS y va calculando la media de las lecturas que muestra cada
cierto tiempo ESPERA_ENTRE_PRESENTACIONES junto con el valor correspondiente en mV
1
2
3
#define PIN_GUVAS12SD A0 // Pin al que se conecta el módulo con el UVM30A
#define ESPERA_ENTRE_LECTURAS 100 // Leer cada 100 ms. Necesita unos 100 µs para cada lectura analógica
#define ESPERA_ENTRE_PRESENTACIONES 60000 // Mostrar la lectura cada minuto
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 4 de 22
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#define COEFICIENTE_VOLTAJE 1.07526881720430107527 // 1100/1023 1.07526881720430107527 La lectura máxima es de 1023 que corresponde a 1100 mV
unsigned int lectura_sensor;
unsigned int contador_lecturas=1;
float total_lecturas=0.0;
float media_lecturas;
long cronometro_lecturas;
long cronometro_presentaciones;
long tiempo_transcurrido;
void setup()
{
analogReference(INTERNAL); // Referencia interna de 1100 mV El GUVA-S12SD mide de 0 a 1170 mV que corresponde con el índice UV 11
//pinMode(PIN_GUVAS12SD,INPUT); // La lectura analógica no necesita inicialización
Serial.begin(9600);
#if defined (__AVR_ATmega32U4__)
while(!Serial);// Esperar a Arduino Leonardo
#endif
lectura_sensor=analogRead(PIN_GUVAS12SD); // La primera lectura es incorrecta (normalmente cero) y necesita unos 100 µs para cada lectura analógica
cronometro_lecturas=millis(); // Esperar un ciclo de lectura para estabilizar el sensor y la entrada analógica
cronometro_presentaciones=millis();
}
void loop()
{
tiempo_transcurrido=millis()-cronometro_lecturas;
if(tiempo_transcurrido>ESPERA_ENTRE_LECTURAS)
{
cronometro_lecturas=millis();
lectura_sensor=analogRead(PIN_GUVAS12SD);
total_lecturas+=lectura_sensor;
media_lecturas=total_lecturas/contador_lecturas++;
}
tiempo_transcurrido=millis()-cronometro_presentaciones;
if(tiempo_transcurrido>ESPERA_ENTRE_PRESENTACIONES)
{
cronometro_presentaciones=millis();
Serial.print("Lectura sensor: "+String(media_lecturas,DEC));
Serial.print(" (media de "+String(contador_lecturas,DEC)+")");
Serial.print(" Tensión (mV): "+String(media_lecturas*COEFICIENTE_VOLTAJE,DEC)+"\n\n");
contador_lecturas=1;
total_lecturas=0.0;
}
}
Del mismo modo, para ahorrar un poco de proceso se pueden calcular los valores compensados para la tabla
de índices. En lugar de comparar la lectura analógica con el valor de la hoja de datos del UVM30A se puede
crear un vector que contenga los datos convertidos al rango de 0 a 1023 realizando la operación inversa a
la descrita antes. Ya no será necesario calcular la tensión a cada lectura puesto que la tabla de índices
está modificada.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#define
#define
#define
#define
PIN_GUVAS12SD A0 // Pin al que se conecta el módulo con el UVM30A
ESPERA_ENTRE_LECTURAS 100 // Leer cada 100 ms
ESPERA_ENTRE_PRESENTACIONES 30000 // Mostrar el índice cada 30 s
CANTIDAD_INDICES_UV 11
unsigned int lectura_sensor;
unsigned int contador_lecturas=1;
float total_lecturas=0.0;
float media_lecturas;
int valor_indice_uv[CANTIDAD_INDICES_UV]={210,295,378,467,563,646,738,818,907,1003,1022}; // De 1 a 11
byte indice;
boolean buscando_indice_uv;
long cronometro_lecturas;
long cronometro_presentaciones;
long tiempo_transcurrido;
void setup()
{
analogReference(INTERNAL); // Referencia interna de 1100 mV El GUVA-S12SD mide de 0 a 1170 mV que corresponde con el índice UV 11
//pinMode(PIN_GUVAS12SD,INPUT); // La lectura analógica no necesita inicialización
Serial.begin(9600);
#if defined (__AVR_ATmega32U4__)
while(!Serial);// Esperar a Arduino Leonardo
#endif
lectura_sensor=analogRead(PIN_GUVAS12SD); // La primera lectura es incorrecta (normalmente cero)
cronometro_lecturas=millis(); // Esperar un ciclo de lectura para estabilizar el sensor y la entrada analógica
cronometro_presentaciones=millis();
}
void loop()
{
tiempo_transcurrido=millis()-cronometro_lecturas;
if(tiempo_transcurrido>ESPERA_ENTRE_LECTURAS)
{
cronometro_lecturas=millis();
lectura_sensor=analogRead(PIN_GUVAS12SD);
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 5 de 22
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 }
total_lecturas+=lectura_sensor;
media_lecturas=total_lecturas/contador_lecturas++;
}
tiempo_transcurrido=millis()-cronometro_presentaciones;
if(tiempo_transcurrido>ESPERA_ENTRE_PRESENTACIONES)
{
cronometro_presentaciones=millis();
buscando_indice_uv=true;
indice=CANTIDAD_INDICES_UV;
while(buscando_indice_uv&&indice>0)
{
indice--;
if(media_lecturas>valor_indice_uv[indice])
{
buscando_indice_uv=false;
}
}
Serial.print("Lectura sensor: "+String(media_lecturas,DEC));
Serial.print(" (media de "+String(contador_lecturas,DEC)+")");
Serial.print(" Índice UV: "+String(indice,DEC));
contador_lecturas=1;
total_lecturas=0.0;
}
Implementar el método en un semáforo de índice UV
Utilizando el código de colores que publica la Organización Mundial de la Salud en la guía práctica sobre el
índice UV se puede construir un sencillo montaje basado en Arduino (que puede ser muy portátil si se usa
una placa Arduino Mini, Arduino Micro, Arduino Nano…) que encienda el LED del color correspondiente al índice
UV detectado por el GUVA-S12SD de un módulo UVM30A.
En el diagrama se muestra la conexión usada para el código del ejemplo del «solmáforo». El valor de las resistencias, rotulado como 220 Ω en el
esquema, se sustituirá por el que corresponda a la tensión a la que deban trabajar los LED (dependiendo del propio LED y de la relación entre
luminosidad y vida útil deseada, seguramente entre 100 Ω y 330 Ω). No es especialmente importante utilizar ni la misma entrada analógica A0 ni las
mismas salidas digitales, pero hay que recordar sustituirlas en el programa.
1
2
3
4
5
6
7
8
9
10
11
12
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
PIN_VERDE 2
PIN_AMARILLO 4
PIN_NARANJA 7
PIN_ROJO 8
PIN_MORADO 12
PIN_GUVAS12SD A0 // Pin al que se conecta el módulo con el UVM30A
ESPERA_ENTRE_LECTURAS 100 // Tomar una lectura del sensor de ultravioleta cada 100 ms
ESPERA_ENTRE_PRESENTACIONES 10000 // Cambiar el color del semáforo cada 10 segundos
CANTIDAD_INDICES_UV 11
CANTIDAD_COLORES_UV 5
unsigned int lectura_sensor;
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 6 de 22
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
unsigned int contador_lecturas=1;
float total_lecturas=0.0;
float media_lecturas;
int valor_indice_uv[CANTIDAD_INDICES_UV]={210,295,378,467,563,646,738,818,907,1003,1022}; // De 1 a 11
byte color[CANTIDAD_INDICES_UV+1]={PIN_VERDE,PIN_VERDE,PIN_VERDE,PIN_AMARILLO,PIN_AMARILLO,PIN_AMARILLO,PIN_NARANJA
byte pin_color[CANTIDAD_COLORES_UV]={PIN_VERDE,PIN_AMARILLO,PIN_NARANJA,PIN_ROJO,PIN_MORADO};
byte indice;
byte indice_anterior=0;
boolean buscando_indice_uv;
long cronometro_lecturas;
long cronometro_presentaciones;
long tiempo_transcurrido;
void setup()
{
analogReference(INTERNAL); // Referencia interna de 1100 mV El GUVA-S12SD mide de 0 a 1170 mV que corresponde con el índice UV 11
//pinMode(PIN_GUVAS12SD,INPUT); // La lectura analógica no necesita inicialización
for(indice=0;indice<CANTIDAD_COLORES_UV;indice++)
{
pinMode(pin_color[indice],OUTPUT);
digitalWrite(pin_color[indice],LOW);
}
digitalWrite(pin_color[0],HIGH);
lectura_sensor=analogRead(PIN_GUVAS12SD); // La primera lectura es incorrecta (normalmente cero)
cronometro_lecturas=millis(); // Esperar un ciclo de lectura para estabilizar el sensor y la entrada analógica
cronometro_presentaciones=millis();
}
void loop()
{
tiempo_transcurrido=millis()-cronometro_lecturas;
if(tiempo_transcurrido>ESPERA_ENTRE_LECTURAS)
{
cronometro_lecturas=millis();
lectura_sensor=analogRead(PIN_GUVAS12SD);
total_lecturas+=lectura_sensor;
media_lecturas=total_lecturas/contador_lecturas++;
}
tiempo_transcurrido=millis()-cronometro_presentaciones;
if(tiempo_transcurrido>ESPERA_ENTRE_PRESENTACIONES)
{
cronometro_presentaciones=millis();
buscando_indice_uv=true;
indice=CANTIDAD_INDICES_UV;
while(buscando_indice_uv&&indice>0)
{
indice--;
if(media_lecturas>valor_indice_uv[indice])
{
buscando_indice_uv=false;
}
}
if(indice_anterior!=indice)
{
digitalWrite(color[indice_anterior],LOW);
digitalWrite(color[indice],HIGH);
indice_anterior=indice;
}
contador_lecturas=1;
total_lecturas=0.0;
}
}
Para la versión portátil se puede usar una batería LiPo y un cargador para USB (el módulo más a la derecha
de la imagen). Yo he utilizado dos interruptores, uno para cargar la batería y otro para encender el
dispositivo, pero es posible hacerlo solamente con uno y hacer una u otra operación en función de la
posición en la que conmute; será necesario usar conmutadores, no interruptores, claro.
Además de poner el sensor a 90° o mejor en el lado contrario a los LED (el semáforo sirve para el exterior
y se puede usar en condiciones de mucha luz) puede ser útil añadir a la caja un resalte que haga de visera
para distinguir mejor el color.
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 7 de 22
Si usas una placa Arduino Uno se puede alimentar con una pila de 9 V (recuerda que la tensión de salida de
Arduino determinará el cálculo de las resistencias de los LED). Otra alternativa es usar un único LED RGB
que establezca el color en función del índice UV. Seguro que habrá ocasión de tratar estas alternativas en
próximos artículos ¡no te los pierdas!
Arduino, GUVA-S12SD, Índice UV, Módulo, Ultravioleta, UV, UVM-30A, UVM30A
Sobre el Autor
Últimas entradas
Víctor Ventura
Programador multimedia y web + IoT. Mejor con software libre.
Desarrollando aplicaciones para la web conocí el potencial de internet de las cosas, encontré la excusa
perfecta para satisfacer la inquietud de aprender electrónica que había tenido desde siempre. Ahora
puedo darme el gusto de programar las cosas que yo mismo diseño y fabrico.
58 Respuestas
Jose Luis Viamonte Alonso
6 mayo, 2016 | Reply
Gracias por la información, llevaba tiempo intentando encontrar información de como fabricar un
medidor de UV.
Víctor Ventura
6 mayo, 2016 | Reply
Hola, Jose Luis.
Gracias a ti por visitar polaridades. Me alegro de que el artículo te haya resultado útil. Si el
tema te interesa, sigue el blog, que en unos días voy a publicar algo más sobre sensores UV y
el índice UVi.
¡Hasta pronto!
juan
8 julio, 2016 | Reply
muy pero muy buena la informacion un favor no se si se le puede agregar una adquisicion de datos
cada 4 minutos para bajarlos a un usb o algo asi todo lo que se esta midiendo.. gracias
Víctor Ventura
8 julio, 2016 | Reply
Hola, Juan.
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 8 de 22
Parece fácil, por ejemplo, grabarlo en una tarjeta SD. En cuanto tenga un rato lo añado al
artículo (y te aviso por correo).
Gracias a ti por participar en polaridad.es
Víctor Ventura
9 julio, 2016 | Reply
Hola otra vez, Juan.
He preparado un sencillo programa que graba cada 4 minutos los valores que se han ido
promediando al leer el sensor de ultravioleta.
Además del lector SD utiliza un conmutador que cambia entre GND y nivel alto (3 V o 5 V,
según qué placa uses) para activar y desactivar la grabación (y así no tener errores al
crear-cerrar el documento) y un LED para indicar que se están grabando datos. Lógicamente,
debes usar los números de pin de los #define para las conexiones o cambiarlos según tu
hardware.
Una posible mejora incluiría un reloj en tiempo real, como el RTC DS3231. Puedes encontrar
algún artículo en el blog sobre cómo gestionar el DS3231 desde Arduino usando las
comunicaciones I2C, así como una librería para manejar la fecha y la hora usando un RTC
DS3231 con Arduino.
Como el código está muy comentado, no te aburro con más charla. Espero que te sirva.
¡Vuelve pronto por polaridad.es!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#define MODO_PRUEBAS // Borrar esta definición para que no se envíen a la consola datos de informe en modo prueba
#define PREFIJO_ARCHIVO "UVI" // Los nombres de los documentos tienen el formato UVIn.CSV siendo n el número (correlativo) de archivo
#define EXTENSION_ARCHIVO ".CSV" // Se usa el formato CSV, valores expresados como texto y separados por comas (también puede usarse punto y co
#define SEPARADOR_CSV "," // El separador usado para el formato CSV
#define
#define
#define
#define
#define
PIN_GUVAS12SD A0 // Pin al que se conecta el módulo con el UVM30A
PIN_CS_SD 4 // Pin usado para activar (CS/SS) la tarjeta
PIN_CS_CONVENCIONAL 10 // Pin usado normalmente para activar dispositivos SPI
PIN_INFORME_ACTIVO 8 // LED que indica que la tarjeta SD está preparada para grabar datos
PIN_CONMUTADOR_SD 9 // Pin que le indica al programa que debe preparar la tarjeta SD y grabar datos (nivel alto) o que debe vaciar el b
#define ESPERA_REINTENTO_ERROR 3000 // Esperar unos segundos antes de reintentar después de detectar un error
#define ESPERA_MUESTREO_UVI 240000 // Intervalo entre grabaciones del valor del UVi (4 minutos a petición de Juan 4*60*1000 ms)
#define COEFICIENTE_VOLTAJE 1.07526881720430107527 // 1100/1023 1.07526881720430107527 La lectura máxima es de 1023 que corresponde a 1100 mV
#include <SD.h> // La librería SD estándar de Arduino
File informe_uvi;
char nombre_archivo[13]; // buffer para el nombre del documento con el informe UVi
char buffer_numero_archivo[4]; // buffer con el número (sufijo) del documento
unsigned int numero_archivo=0; // Número de archivo que se busca para, si no existe, usarlo como sufijo del nombre
boolean informe_activo=false; // No se están grabando datos en la tarjeta SD
boolean nuevo_estado_informe; // Lectura actual del conmutador de la tarjeta SD
unsigned long cronometro; // Tiempo entre grabaciones del índice UVi en la tarjeta SD
unsigned long contador_lecturas; // Número de lecturas tomadas entre grabaciones (para calcular el valor intermedio)
unsigned int lectura_sensor; // Valor entregado por el sensor GUVAS12SD
float total_lecturas=0.0; // Suma de los valores muestreados en una sesión
float media_lecturas; // Valor intermedio de los valores muestreados entre grabaciones
String registro_csv; // Datos que se graban en una línea del documento CSV (milisegundos (desde encendido) ,valor calculado, lecturas promediad
void setup()
{
#ifdef MODO_PRUEBAS
Serial.begin(9600); // Preparar el puerto serie
#ifdef __AVR_ATmega32U4__
while(!Serial);// Esperar a Arduino Leonardo
#endif
#endif
analogReference(INTERNAL); // Referencia interna de 1100 mV El GUVA-S12SD mide de 0 a 1170 mV que corresponde con el índice UV 11
lectura_sensor=analogRead(PIN_GUVAS12SD); // La primera lectura es incorrecta (normalmente cero)
pinMode(PIN_CS_SD,OUTPUT); // El pin al que realmente se conecta la tarjeta SD debe ser de salida para activarla (nivel bajo) o desactivarla
digitalWrite(PIN_CS_SD,HIGH); // Desactivar la tarjeta SD
pinMode(PIN_CS_CONVENCIONAL,OUTPUT); // Puede que sea necesario usar como salida (o simplemente reservar) el pin que normalmente se utiliza p
digitalWrite(PIN_CS_SD,HIGH); // Desactivar el dispositivo en el bus SPI habitual
while(!SD.begin(PIN_CS_SD)) // Reintentar hasta activar el lector de tarjetas SD (si no se consigue, no hay razón para seguir el programa)
{
#ifdef MODO_PRUEBAS
Serial.print("Error al inicializar el lector de tarjetas SD. Se reintenta en ");
Serial.print(ESPERA_REINTENTO_ERROR);
Serial.println(" ms.");
#endif
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 9 de 22
54
delay(ESPERA_REINTENTO_ERROR); // Esperar antes de reintentar
55
}
56
#ifdef MODO_PRUEBAS
57
Serial.println("Lector de tarjetas SD inicializado");
58
#endif
59
pinMode(PIN_INFORME_ACTIVO,OUTPUT); // Pin del LED de aviso de SD activada
60
digitalWrite(PIN_INFORME_ACTIVO,LOW); // Apagar el LED que informa de que se pueden estar grabando datos en la tarjeta
61
pinMode(PIN_CONMUTADOR_SD,INPUT);
62 }
63
64 void loop()
65 {
66
nuevo_estado_informe=digitalRead(PIN_CONMUTADOR_SD);
67
if(nuevo_estado_informe!=informe_activo) // Si ha cambiado el estado (ha cambiado la posición del conmutador)
68
{
69
if(nuevo_estado_informe) // Si el conmutador está en modo grabar (y antes no lo estaba)
70
{
71
do
72
{
73
itoa(numero_archivo++,buffer_numero_archivo,10);
74
strcpy(nombre_archivo,PREFIJO_ARCHIVO);
75
strcat(nombre_archivo,buffer_numero_archivo);
76
strcat(nombre_archivo,EXTENSION_ARCHIVO);
77
#ifdef MODO_PRUEBAS
78
Serial.println("Probando a usar el documento "+String(nombre_archivo));
79
#endif
80
}
81
while(SD.exists(nombre_archivo));
82
informe_uvi=SD.open(nombre_archivo,FILE_WRITE);
83
if(informe_uvi) // Si se ha conseguido preparar el documento…
84
{
85
informe_activo=true; // …cambiar el estado a activo
86
digitalWrite(PIN_INFORME_ACTIVO,HIGH); // Encender el LED para informar de que se pueden estar grabando datos en la tarjeta SD
87
contador_lecturas=0; // Empezar a contar lecturas entre grabaciones (para calcular el valor intermedio)
88
#ifdef MODO_PRUEBAS
89
Serial.println("Informe UVi activo");
90
#endif
91
cronometro=millis(); // (re)Iniciar el cronómetro para saber si ha pasado el tiempo entre grabaciones
92
}
93
else
94
{
95
#ifdef MODO_PRUEBAS
96
Serial.println("Se ha producido un error al tratar de crear el documento.");
97
Serial.print("Se reintentará dentro de ");
98
Serial.print(ESPERA_REINTENTO_ERROR);
99
Serial.println(" ms.");
100
#endif
101
delay(ESPERA_REINTENTO_ERROR); // Esperar antes de reintentar
102
}
103
}
104
else // Si el conmutador está en modo NO grabar (y antes no lo estaba)
105
{
106
informe_uvi.flush(); // Vaciar el buffer
107
informe_uvi.close(); // Cerrar el archivo
108
informe_activo=false; // Cambiar el estado a inactivo (no se graban datos en la tarjeta SD)
109
digitalWrite(PIN_INFORME_ACTIVO,LOW); // Apagar el LED que informa de grabación activa
110
#ifdef MODO_PRUEBAS
111
Serial.println("Informe UVi desactivado");
112
#endif
113
}
114
}
115
if(informe_activo) // Si la grabación está activa
116
{
117
if((unsigned long)(millis()-cronometro)>ESPERA_MUESTREO_UVI) // Si la grabación está activa y ha pasado el tiempo entre grabaciones sucesiv
118
{
119
cronometro=millis(); // (re)Iniciar el cronómetro para saber si ha pasado el tiempo entre grabaciones
120
media_lecturas*=COEFICIENTE_VOLTAJE; // Corregir los valores tomados para que trabaje con el voltaje (más o menos coincide con un UVi dec
121
#ifdef MODO_PRUEBAS
122
Serial.print("Guardado el valor ");
123
Serial.print(media_lecturas);
124
Serial.print(" en ");
125
Serial.print(cronometro);
126
Serial.print(" ms (");
127
Serial.print(contador_lecturas);
128
Serial.println(" muestras)");
129
#endif
130
registro_csv=String(cronometro,DEC); // Componer la línea CSV (registro) con el tiempo,
131
registro_csv+=String(SEPARADOR_CSV); // un separador,
132
registro_csv+=String(media_lecturas,DEC); // Valor intermedio de las lecturas hasta el momento,
133
registro_csv+=String(SEPARADOR_CSV); // otro separador
134
registro_csv+=String(contador_lecturas,DEC); // y el número de muestras tomadas para calcular el valor intermedio (más de
135
informe_uvi.println(registro_csv); // Grabar la línea CSV (el registro)
136
contador_lecturas=0; // Empezar a contar lecturas entre grabaciones (para calcular el nuevo valor intermedio)
137
}
138
else // Si no toca grabar, tomar una medida y actualizar el cálculo del valor intermedio
139
{
140
lectura_sensor=analogRead(PIN_GUVAS12SD); // leer el sensor
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 10 de 22
141
contador_lecturas++; // incrementar el número de lecturas realizadas
142
total_lecturas+=lectura_sensor;
143
media_lecturas=total_lecturas/contador_lecturas;
144
}
145
}
146 }
juan
3 agosto, 2016 | Reply
hola soy juan de nuevo me encanta pero me gustaría saber cuales son los materiales que voy a
necesitar para la implementacion de este proyecto aparte del sensor,el arduino uno,un led,el reloj de
tiempo real hay algo mas que tengo que comprar ??
Víctor Ventura
4 agosto, 2016 | Reply
Hola, Juan.
Si quieres hacer el montaje del artículo, básicamente necesitas los componentes de la foto,
un lector de tarjetas SD para el programa del ejemplo y un reloj en tiempo real para la
«mejora» (almacenar la fecha y la hora de la medida)
El sensor de ultravioleta. Mejor un módulo, que incluye junto al sensor otros compoentes
pasivos que puedas necesitar.
Una placa (compatible) Arduino. Mejor pequeña.
5 LED de los colores correspondientes (mejor todos teñidos o todos transparentes, pero
con luz de color)
5 resistencias que correspondan a la tensión y corriente de salida de la placa Arduino
elegida y de la intensidad de luz deseada (alta, que es para exteriores)
Entre 100 Ω y 330 Ω y un cuarto de vatio. Menor tensión menor resistencia, mayor
iluminación menor resistencia
Una batería. Te recomiendo una de las de teléfono móvil que entregan 3,7 V (seguro que
tienes alguna muerta de risa en un cajón)
Un cargador de batería. Dependiendo de la alimentación de la placa Arduino, puedes
necesitar también aumentar la tensión entregada por la batería, en tal caso te
recomiendo que uses un módulo de los que incluyen ambas cosas (y además protegen la
batería) que cuesta igual (más o menos) y minimiza el montaje.
Te recomiendo un par de interruptores o conmutadores para el encendido y la carga,
aunque puedes hacerlo con un conmutador de dos posiciones (tres terminales, uno común
que el conmutador conecta con uno u otro de los restantes según cambie su posición)
Si quieres hacer el montaje del ejemplo del comentario necesitas añadir un módulo lector
de tarjetas SD para Arduino (mejor MicroSD) y la correspondiente tarjeta. Si optas por un
módulo (es mi consejo para ti) incluirá los componentes que necesite para conectar
directamente a la placa Arduino (debes buscar que la alimentación de uno y otro sean
compatibles). Por si necesitas más información que la del ejemplo, en el blog hay un
artículo que explica cómo almacenar datos desde Arduino hasta una tarjeta SD
Si quieres añadir un RTC, necesitarás el módulo correspondiente. Te recomiendo el reloj en
tiempo real DS3231, que suele incluir espacio para su propia batería que durará más que la
del montaje. En el blog hay varios artículos sobre cómo controlar desde Arduino el RTC
DS3231
Si no te ves muy suelto con esto, te aconsejo que pidas ayuda en una tienda de electrónica
cercana. No sé en tu país, mi experiencia en España es que están muy preparados y
encantados de ayudar; suele ser una ocasión para aprender un montón. Son pocos
componentes, pedirlos fuera te va a ahorrar poco y un pedido al extranjero en agosto
(siempre refiriéndome a España) puede significar que llegue a final de septiembre.
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 11 de 22
CAMEN
20 agosto, 2016 | Reply
ESTIMADO VICTOR:
MUCHAS GRACIAS POR LA INFORMACIÓN TAN CLARA QUE PRESENTAS A TRAVÉS DE TU PAGINA, ME HA SIDO DE
GRAN AYUDA PARA EL TRABAJO QUE TENIA QUE PRESENTAR MI HIJO EN EL COLEGIO EN UNA FERIA DE
CIENCIAS SOBRE LOS SEMÁFOROS DE RADIACIÓN UV Y PREVIO A ELLO TENIA QUE INVESTIGAR SOBE LOS RAYOS
ULTRAVIOLETA Y COMO SE ELABORAN ESTOS EQUIPOS , LA VERDAD YO NO COMPRENDO MUCHO SOBRE ESTOS
TEMAS PERO ME PARECIÓ MUY INTERESANTE.
ESTEREMOS AL PENDIENTE DE TUS SIGUIENTES PUBLICACIONES. BENDICIONES!!!
Víctor Ventura
20 agosto, 2016 | Reply
Pues muchas gracias, me alegra ser de utilidad; espero que lo próximo que publique también te
guste
¡Hasta pronto!
Jorge
1 septiembre, 2016 | Reply
Muchas gracias por tu respuesta, está muy bien explicado el uso de este sensor. Yo estoy trabajando
en una monografía donde en una de sus partes tengo que construir un solmáforo y la información
que brindas es justo lo que andaba buscando para este sensor. Un saludo desde Nicaragua
Víctor Ventura
1 septiembre, 2016 | Reply
Hola, Jorge.
Me alegro mucho de que te sirva el artículo.
¡Otro saludo de vuelta para Nicaragua! ¡Te espero pronto en polaridad.es!
Paul
24 septiembre, 2016 | Reply
Hola Victor, deseo usar el sensor uvm30a permanentemente a la intemperie, utilize varios vidrios o
lentes o cristales transparentes para poder protegerlo del polvo y lluvia pero veo que el indice uv
medido baja en comparación sin lente.
Asi que opte por ponerlo sobre la base y cubrirlo con silicona transparente para protegelo dejando el
sensor(guva-s12d color blanco) solo al aire ya que necesito entregarlo.
Por favor como podría proteger al sensor uvm30a para usarlo permanente a la intemperie o hay un
cristal vidrio o lente? O esta bien mi solución?
Víctor Ventura
24 septiembre, 2016 | Reply
Hola, Paul.
Los sensores de luz se fabrican pensando en que es muy probable que queden detrás de un
cristal que los proteja (puedes leer en muchas hojas de datos cosas como que se «comportan
bien» detrás de un cristal)
El problema no es tanto que el índice se reduzca (¿Es que se te reduce muchísimo? Danos
datos, por favor), el problema serio es que el índice no se reduzca de manera proporcional
detrás del cristal. Si se reduce de manera predecible es cuestión de corregir el programa,
para reflejarlo, haciendo pruebas con y sin cristal (si nos das datos concretos a lo mejor
puedo ayudarte con eso). Por desgracia, los valores menores se recortarán pero en el caso
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 12 de 22
de la radiación ultravioleta no es un problema muy importante ya que esos valores son los
que se miden con menor precisión y suelen ser los que menos importan en las aplicaciones
finales.
Mi principal problema con todos los sensores a la intemperie, especialmente si les da el sol
directamente (los que necesitan los de luz), es que se terminan por destruir. Es decir, hay
que contar que el propio sensor es un componente fungible y preparar el montaje para
sustituirlo cada cierto tiempo (al segundo año es razonable).
Considerado el sensor como un consumible, yo optaría por dejarlo al aire sin protección.
Lógicamente el resto de los componentes sí necesitarán protección. Lo de la silicona (que
también se destruirá) me parece una solución aceptable, la mejor si es una producción muy
pequeña, un dispositivo único ad hoc o un prototipo.
Gracias por participar en polaridad.es, contar tu experiencia nos ayuda a aprender
Matias
5 enero, 2019 | Reply
Paul, Victor, han podido determinar cual es la mejor forma de trabjar con estos sensores a
la intemperie? he probado con algunos cristales y acrilicos pero sucede lo que ya han
comentado. He visto estos sensores que ya vienen protegidos
(https://www.digikey.com/es/datasheets/vishay-semiconductor-opto-division/vishaysemiconductor-opto-division-veml6075).
He notado que tambien varia mucho la medicion segun la inclinacion del sol respecto al sensor,
han experimentado alguna solucion para esto?
aldair
14 octubre, 2016 | Reply
hola victor.
deseo utilizar un LCD para la salida reemplazando a los leds y asi que me de la medicion uv como puedo
reemplazar la programacion para implementar al arduino. Por favor es mi proyecto de mediciones
Gracias.
Víctor Ventura
14 octubre, 2016 | Reply
Hola, Aldair.
No es difícil encontrar información sobre cómo utilizar una LCD desde Arduino pero yo
todavía no he publicado nada al respecto
Todo llegará.
Por si te sirve para tu proyecto, sí que he publicado información sobre cómo usar pantallas
con números de LED de 7 segmentos desde Arduino, por ejemplo, el MAX7219 y el MAX7221
(controladores SPI de pantallas LED de 8 dígitos de 7 segmentos) o el TM1637 (controlador de
un display LED de hasta 6 dígitos de 7 segmentos).
¡Suerte con tu proyecto y gracias por participar en polaridad.es!
Patrick
25 noviembre, 2016 | Reply
Hola Victor.
Muchas gracias por la informacion, por favor si podria implementar al programa para la comunicacion
via ethernet y asi tener los valores en una pagina web.
Víctor Ventura
25 noviembre, 2016 | Reply
Hola, Patrick.
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 13 de 22
Los tres componentes que planteas ( lectura del sensor ultravioleta VEML6070 o del
sensor ultravioleta GUVA-S12SD (el del módulo UVM30A),
la conexión Ethernet TCP con
Arduino (incluyendo la conexión del ENC28J60) y
la construcción de un servidor web para la
IoT o incluso cómo hacer gráficos web de los sensores conectados a la IoT) están explicados
en los artículos que te enlazo, así que, si quieres ponerte manos a la obra ahí tienes algunas
pistas para empezar. De todas formas, parece que es un tema que tiene su público, por lo que
no descarto hacer algún ejemplo cuando tenga un rato así que ¡vuelve pronto por
polaridad.es!
¡Hasta pronto!
Ibrahin
25 noviembre, 2016 | Reply
Estimado Victor:
exelente informacion si podria realizar el programa para enlazarlo via ethernet seria de mucha ayuda
gracias por su respuesta
Víctor Ventura
25 noviembre, 2016 | Reply
Como parece que hay muchos lectores interesados, os he preparado un ejemplo de cómo se podría
mostrar el índice UV usando un servidor web basado en Arduino con una conexión Ethernet.
Después conectar todo y alimentarlo (mostrar también la consola serie es de ayuda para monitorizar
el funcionamiento), hay que usar un navegador web en un PC que esté en la misma red que la conexión
Ethernet de Arduino y escribir en la barra de direcciones 192.168.1.252
Si la red no es la del ejemplo ( 192.168.1.X ) habrá que cambiar el valor de la variable ip .
Espero que os dé una idea para hacer vuestro proyecto ¡Suerte!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#define PIN_GUVAS12SD A0 // Pin al que se conecta el módulo con el UVM30A
#define CANTIDAD_INDICES_UV 11
String color[CANTIDAD_INDICES_UV+1]={"1C0","1C0","1C0","FE0","FE0","FE0","FA0","FA0","F11","F11","F11","E1B"
#include <SPI.h>
#include <Ethernet.h>
byte mac[]={0x12,0x34,0x56,0x78,0x9A,0xBC}; // Dirección MAC inventada
IPAddress ip(192,168,1,252); // Dirección IP arbitraria en el rango 192.168.1.
EthernetServer servidor_web(80); // El puerto por defecto del HTTP es el 80
EthernetClient cliente_web;
char lectura_ethernet;
char lectura_anterior;
byte indice;
void setup()
{
Serial.begin(115200);
while(!Serial);
Ethernet.begin(mac,ip);
servidor_web.begin();
Serial.println(F("Servidor web iniciado"));
analogReference(INTERNAL); // Referencia interna de 1100 mV El GUVA-S12SD mide de 0 a 1170 mV que corresponde con el índice UV 11
analogRead(PIN_GUVAS12SD); // La primera lectura es incorrecta (normalmente cero)
}
void loop()
{
cliente_web=servidor_web.available();
if(cliente_web)
{
lectura_anterior=0; // Cualquier carácter que no sea \n para evitar malinterpretar el final del texto
Serial.println(F("Se ha conectado un cliente")); // Monitorizar que el cuando se conecta el cliente (el navegador web)
Serial.println(F("Datos enviados por el cliente:\n")); // Monitorizar la información que envía el cliente (el navegador web)
while(cliente_web.connected()) // Cuando el cliente (el navegador web) se conecte
{
indice=indice_uv(); // Leer el sensor
if(cliente_web.available()) // Si llegan datos desde el cliente (el navegador web)
{
lectura_ethernet=cliente_web.read(); // Leer una letra del texto enviado por el cliente
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 14 de 22
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
Serial.print(lectura_ethernet); // Mostrar la letra recibida del cliente para monitorizar el funcionamiento
if(lectura_ethernet=='\r'&&lectura_anterior=='\n') // Si llega CR y antes había llegado LF se interpreta como una línea en blanco
{
cliente_web.flush(); // Como la línea en blanco marca el final de la petición HTTP ignorar el resto del texto que mande el cliente
cliente_web.println(F("HTTP/1.1 200 OK")); // Cabecera de petición aceptada correctamente
cliente_web.println(F("Content-Type: text/html")); // Cabecera de tipo de respuesta enviada (texto en formato HTML)
cliente_web.println(F("Connection: close")); // Al terminar, cerrar la conexión para liberar al servidor lo antes posible
cliente_web.println(); // Una línea en blanco para indicar el final de las cabeceras y el comienzo del código HMTML
cliente_web.print(F("<DOCTYPE html>")); // Es un documento HTML
cliente_web.print(F("<html lang=\"es\">")); // El texto del HTML está en español
cliente_web.print(F("<head>"));
cliente_web.print(F("<meta charset=\"utf-8\">")); // La codificación del texto es UTF-8 (importante para los caracteres no-ASCII como las t
cliente_web.print(F("<meta name=\"viewport\" content=\"width=device-width,height=device-height,initial-scale=1.0,user-scalable=no,minimum-s
cliente_web.print(F("<title>Índice UV</title>")); // Título de la página (para la ventana del navegador)
cliente_web.print(F("</head>"));
cliente_web.print(F("<body style=\""));
cliente_web.print(F("background-color:#")); // Color de fondo de la página (el que corresponde con el índice UV)
cliente_web.print(color[indice]);
cliente_web.print(F(";\">"));
cliente_web.print(F("<div style=\""));
cliente_web.print(F("display:table;"));
cliente_web.print(F("width:100%;"));
cliente_web.print(F("height:100%;"));
cliente_web.print(F("\">"));
cliente_web.print(F("<div style=\""));
cliente_web.print(F("display:table-cell;"));
cliente_web.print(F("vertical-align:middle;"));
cliente_web.print(F("text-align:center;")); // Centrar el texto
cliente_web.print(F("font-size:24px;"));
cliente_web.print(F("\">"));
cliente_web.print(F("El índice UV es "));
cliente_web.print(indice); // Valor numérico del índice UV
cliente_web.print(F("</div>"));
cliente_web.print(F("</div>"));
cliente_web.print(F("</body>"));
cliente_web.print(F("</html>"));
cliente_web.stop(); // Cerrar la conexión para liberar al servidor
}
lectura_anterior=lectura_ethernet; // Recordar la lectura anterior para detectar una línea en blanco y saber cuándo termina la petición HTTP
}
}
Serial.println(F("\nEl cliente se ha desconectado")); // Avisar de que se ha cerrado la conexión para monitorizarla
}
}
byte indice_uv()
{
static const int valor_indice_uv[CANTIDAD_INDICES_UV]={210,295,378,467,563,646,738,818,907,1003,1022};
unsigned int lectura_sensor=analogRead(PIN_GUVAS12SD);
boolean buscando_indice_uv=true;
byte indice=CANTIDAD_INDICES_UV;
while(buscando_indice_uv&&indice>0)
{
indice--;
if(lectura_sensor>valor_indice_uv[indice])
{
buscando_indice_uv=false;
}
}
return indice;
}
Arist
26 noviembre, 2016 | Reply
¿Por qué puede ser que en mi smartphone se ve muy chico y en mi laptop se ve normal?
Gracias por el programa.
Víctor Ventura
26 noviembre, 2016 | Reply
Porque tu teléfono tiene mucha resolución
Es por el viewport . He cambiado el código (línea 53) para que se vea en un
dispositivo móvil a un tamaño equiparable al de un PC (para que considere que la
resolución de la pantalla de un teléfono es mucho mayor, los píxeles son mucho más
pequeños) y para que se centre en vertical (en lugar de dejar cierto margen) De
todas formas, puedes modificar la línea 69 y sustituir «24px» por un tamaño mayor,
si lo necesitas.
Gracias por participar en polaridad.es
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 15 de 22
Cesar Augusto Tapia
7 marzo, 2017 | Reply
Muy buena explicacion
excelente pagina
Víctor Ventura
7 marzo, 2017 | Reply
¡Gracias!
EDISON
24 marzo, 2017 | Reply
Buena pagina e informacion
Tengo varias consultas que enviare
Gracias por compartir tu conocimiento
Edison
Jeftd
24 mayo, 2017 | Reply
Habrá una diferencia si solo uso el guva-s12sd, esque se me dificulta obtener el UVM 30a
Víctor Ventura
24 mayo, 2017 | Reply
Poca cosa. El UVM30A es uno de los módulos que incorporan el sensor GUVA-S12SD y un
mínimo de electrónica pero para el software con que podrías manejarlo te sirve lo que se
dice en el artículo.
Un saludo y gracias por visitar polaridad.es
Jeftd
24 mayo, 2017 | Reply
Entonces el solmaforo podría funcionar solamente con el guva-s12sd?
Raul
25 mayo, 2017 | Reply
Estimados me pueden indicar como puedo sensar y mostrar un arreglo de lamparas cuando falla una de
ellas, si cada una de ellas tiene un interruptor que cuando esta encendida esta cerrado.
Clemente
1 junio, 2017 | Reply
Hola,
Primero de todo, gracias por el manual, me ha ayudado mucho a hacer lo que quería, pero usando una
pantalla LCD conectada por i2c.
Yo también había pensado en ponerle una batería, ¿Podrías indicar que batería y regulador has elegido
tú?
Muchas gracias
Víctor Ventura
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
2 junio, 2017 | Reply
17/11/20 9=04
Página 16 de 22
Hola, Clemente.
He hecho varios montajes de este tipo con diferentes baterías. El que hice para las pruebas
del artículo utilizaba una batería de litio de 3V7 reciclada de otro equipo, creo recordar que
perteneció a un receptor de GPS pero puedes encontrarla en infinidad de dispositivos, es el
tipo más habitual. En este casó no utilicé regulador y jugué con la tolerancia del MCU.
Para hacer algo pequeño, con el mínimo de LED, puedes usar un AMS1117-5 o un AMS1117-3.3
(dependiendo del MCU, el resto es más flexible) o los correspondientes LM1117.
Gracias por participar en polaridad.es
indira
9 junio, 2017 | Reply
Hola, si deseo ocupar un sensor ML8511, ¿como seria su programación? ¿cambia mucho?
Víctor Ventura
9 junio, 2017 | Reply
Hola, Indira.
La idea general según la cual se usa el ML8511 es la misma que la que explico en este artículo.
La diferencia entre el uso de uno y otro es que el sensor GUVA-S12SD tiene una respuesta
entre 0 y algo más un voltio mientras que el ML8511 tiene una respuesta entre cero y algo
más dos voltios y medio, así que tendrás que cambiar la tabla de valores consultando las
especificaciones (en la datasheet) del ML8511.
El ML8511 se está empezando a ser tan popular como lo fue en su momento el GUVA-S12SD (o
más) así que estoy pensando publicar algún código adaptado a este sensor de radiación UV,
pero no será pronto, que ando regular de tiempo
¡Suerte con tu proyecto y gracias por participar en polaridad.es!
Antonio
20 julio, 2017 | Reply
Hola Victor:
Excelente artículo.
Serías tan amable de decirme si conoces algún sensor que mida por encima de los 380 mn.
Muchas gracias por todo.
Víctor Ventura
20 julio, 2017 | Reply
Hola, Antonio.
Los sensores de luz ultravioleta que conozco empiezan a filtrar desde los 350 nm y se
supone que son insensibles entorno a los 400 nm.
Se me ocurre que podrías complementar la toma de datos con algún sensor de luz ambiental
aunque, al contrario, lo habitual es que empiecen a ser sensibles entorno a los 400 nm, por lo
que te quedará una pequeña ventana fuera de rango.
Espero que eso te ayude un poco.
Gracias por visitar polaridad.es
Carlos Alejandro
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
29 agosto, 2017 | Reply
17/11/20 9=04
Página 17 de 22
Buenas noches, me gusto mucho la idea, pero me ha resultado un poco difícil el conectar los sensores.
¿Como seria el diagrama completo usando el lector de tarjetas?
José María
21 octubre, 2017 | Reply
Hola Víctor;
En primer lugar quiero agradecerte tu proyecto ya que hay muy poco en Español! Todo está muy claro
y tus respuestas son muy precisas.
He realizado el montaje y ya he hecho las mediciones y se me presentan algunas dudas.
Utilicé el mismo sensor en un arduino uno pero el código que utilicé es uno básico y leo del serial
plotter la salida de los mv.
El tema es que he medido ya unas cinco veces a mediodía y sin nubes y el valor en mv no supera los
250 mv, el tema es que el servicio meteorológico da un valor de índice 7. Entonces según lo que
interpreté yo estoy midiendo 250 que asumo será un valor entre 1 y 2 pero el servicio meteorológico
les da 7 a 8.
No se si estoy midiendo mal (el sensor siempre lo pongo perpendicular al sol) o si los 250 mv que
devuelve el sensor hay que interpretarlos diferente. Te dejo el código sencillo que utilizo ya que
podría estar mal el código también.
Un abrazo y nuevamente profundamente agradecido
José María desde Argentina
/*
# This Sample code is for testing the UV Sensor .
#Connection:
VCC-5V
GND-GND
OUT-Analog pin 0
*/
void setup()
{
Serial.begin(9600);// open serial port, set the baud rate to 9600 bps
}
void loop()
{
int sensorValue;
sensorValue = analogRead(0);//connect UV sensors to Analog 0
Serial.println(sensorValue);//print the value to serial
delay(200);
}
Marcos P Sosa
24 noviembre, 2017 | Reply
hola gracias por tu aporte esta super, una pregunta para el sistema del solmaforo la salida es un
cero o 5 volt. tengo mis dudas, me gustaria que solo me bote 5 volt para hacerfuncionar en paralelo
otros relay y hacer funciones … porfa si pudieras ayudarme
Rodrigo
27 noviembre, 2017 | Reply
Hola, muy buena informacion, yo estoy trabajando con otro modulo uv-sens pero no se si podrias
ayudarme con la formula, lo que deseo es hacer la medicion pero en nanometros (nm), es para medir la
radiacion de un fluorescente uv, ando algo perdido con esto… agradeceria tu apoyo.
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 18 de 22
Jordan
23 enero, 2018 | Reply
Amigo Buenos Días
Es un excelente proyecto el que hiciste para el solmaforo
pero tengo una complicación hay alguna manera de implementar un led rbg
para hacer mas llamativo el proyecto.
Gracias de antemano.
Saludos desde Ecuador
Daniel
3 mayo, 2018 | Reply
Me pueden ayudar con el costo de un sensor de irradiacion por favor. El proyecto en el cual quiero
implementar dicho sensor de de baja potencia.
De ante mano muchas gracias.
Saludos
Alejandro
11 mayo, 2018 | Reply
Quisiera comprender este mismo proyecto con un sensor UV ML1185
Arturo
28 mayo, 2018 | Reply
Buenos días Victor,
podrías orientarme sobre alguna empresa o entidad que realice mediciones de UV.
Necesitamos saber el grado de protección que proporcionan ciertos tejidos y que además una empresa
lo certifique.
Muchas gracias,
un cordial saludo
Víctor Ventura
28 mayo, 2018 | Reply
Hola, Arturo.
Lo siento, no puedo recomendarte ninguna empresa para lo que necesitas.
Gracias por visitar el blog.
sergio muñoz
10 junio, 2018 | Reply
Hola, vengo siguiendo tu página ya que me ayuda en un proyecto de investigación, estoy siguiendo los
pasos y esto pero quisiera saber cómo es que se convierte esta intensidad UV al índice UV, o sea que
fórmula o que instrumentos son los que miden o convierten, agradecería la respuesta y muy buena tu
información.
Freddy
20 junio, 2018 | Reply
Buenos tardes,
estoy realizando un proyecto de WSN para medir radiación solar.
como podria conectarlo a travez de WIFI a una RASPBERRY PI?
Gracias
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 19 de 22
cristina
22 junio, 2018 | Reply
Hola, muy bueno tu articulo, estoy implemententado este proyecto pero a la salida que active 5 reles
para que enciendan luces a 110v, a parte tengo una pantalla y un sensor de temperatura, intente
poner los reles para cada salida de medidor UV y no hace nada, pdrias ayudame por favor
felipe
10 julio, 2018 | Reply
la intensidad UV como se convierte a indice UV ?
CLAUDIA
7 septiembre, 2018 | Reply
BUENAS NOCHES ESQUE QUIERO HACER UN BRAZALETE MEDIDOR ULTRAVIOLETA QUIERO SABER COMO SERIA LA
PROGRAMACION SI NECESITO UN DISPLAY OLED 128X32
Adriana
11 septiembre, 2018 | Reply
Hola Victor!! Muy buenos tus articulos. Me gustaria saber si publicarás alguno referente al Sensor UV
UV ML1185.
Víctor Ventura
11 septiembre, 2018 | Reply
Gracias, Adriana.
Desde luego que entra en mis planes, incluso compré algunos kit para probarlo en distintas
plataformas. Pero, si te refieres a si lo publicaré próximamente, me temo que no porque no
creo que tenga ni un rato libre hasta casi fin de año
En cualquier caso, la idea del blog es que cualquiera pudiera solicitar o aportar información; no
solo yo. Imagínate el tiempo que llevaría contestar (como merece) cada comentario o correo
que me llega. Te propongo que preguntes lo que necesites o escribas lo que conoces de este
sensor (o de lo que quieras), a ver si otros lectores también se animan y te ayudan o
aprovechan lo que tú sepas
¡Hasta pronto!
hector galindo
6 octubre, 2018 | Reply
guau que buena informacion gracias me interesa controlar una medicion de luz ultravioleta por medio
de aplicar unaperaje de un lado y ver cuanta cantidad de luz uv llega de el otro lado como un
amperimetro y medir si el polarizado reduced la cantidad de rayos uv
Héctor
26 noviembre, 2018 | Reply
Me gustaría saber cómo sería el programa si se usa el ml8511
Cesar Torres
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
4 diciembre, 2018 | Reply
17/11/20 9=04
Página 20 de 22
Hola primero que nada muchas gracias por compartir y hacer público todo esto :), quería preguntarle,
¿cree que se presente algún problema si sólo se utiliza el sensor Guva-s12sd pero un módulo
diferente al uvm30a?
Rodrigo Ojeda
17 enero, 2019 | Reply
Hola, muy buesn post…
Me gustaría saber si el módulo UvM30A necesita ser orientado al sol dependiendo de la hora….
Gracias.
Víctor Ventura
18 enero, 2019 | Reply
Hola, Rodrigo.
Normalmente se utiliza para saber la cantidad de radiación que incide en un sitio en cada
momento del día. En tal caso, como es lógico, no es necesario moverlo.
Sería necesario (re) orientarlo si la medida que quieres tomar es más global (para estimar la
de una zona amplia, por ejemplo)
En cualquier caso, considera que la medida dependerá siempre del lugar y del momento. No
podrás, por ejemplo, evitar la variación que producirá una nube que puede no «hacer sombra»
en otro sitio relativamente cercano.
Un saludo y gracias por visitar el blog
eder valencia
12 abril, 2019 | Reply
que tal victor, antes que nada deseo felicitarte por tu proyecto y la manera en la que lo explicas ya
que esta de 10,tengo una duda haber si me pudieras ayudar, si no quisiera usar leds como semaforo y
en su lugar quisiera usar una pantalla tipo nextion para desplegar los datos, seria muy complicado??
un fuerte abrazo desde mexico y saludos!!
gustavo
15 mayo, 2020 | Reply
Hola . he encontrado tu proyecto y me es muy pero muy util . estoy haciendo con el ULm30A un
detector obvio de UV pero mi interes es que pueda disernir segun los milivolt que da como resultado
que frecuencia en nanometros estoy midiendo, es posible esto . podrias ayudarme ? desde ya muchas
gracias ejemplo 50mv son 390nm y 1000 mv supongo que 240nm y puedo disernir entre UVa UVB y
UVC
Deja un comentario
Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
17/11/20 9=04
Página 21 de 22
Comentario
Nombre *
Correo electrónico *
Web
Publicar comentario
Por favor confirma que eres humano antes de comentar
En 2018 Víctor Ventura
administra el blog polaridad.es
desde Granada, España.
Suscripción RSS
Seguir con Feedly
http://polaridad.es/sensor-radiacion-ultravioleta-arduino-indice-uv-uvm30a-guva-s12sd/
Contenido con licencia
Creative Commons
CC BY-SA 3.0 ES
Reconocer al autor y
compartir el contenido igual
17/11/20 9=04
Página 22 de 22
Download