EN CONSTRUCCIÓN…. Este artículo se está actualizando y es posible que aun falte información vuelve en unas horas más ;-)
Este módulo que combina los siguientes 3 sensores en un módulo fácil de usar, todos los sensores son I2C, por lo que se requieren conexiones mínimas del módulo a su arduino
El HTU21D es un sensor digital de humedad y temperatura de bajo costo, fácil de usar y altamente preciso.
El BMP180 es el nuevo sensor digital de presión barométrica de Bosch Sensortec.
BH1750FVI es un IC de sensor de luz ambiental digital para interfaz de bus I2C.
Tal vez pueda interesarte proyectos en arduino, pic, robótica, telecomunicaciones, suscribete en http://www.youtube.com/user/carlosvolt?sub_confirmation=1 mucho videos con código fuentes completos y diagramas
Puedes comprar este producto en ICStation http://www.icstation.com/htu21dbmp180bh1750fvi-temperature-humidity-pressure-light-sensor-triad-module-p-8862.html
Parámetro del producto:
1. Voltaje de la fuente de alimentación: 1.5V — 3.6V
2. Rango de prueba de humedad: 0—100% RH
3. Rango de prueba de temperatura: -40 —105 ℃
4. Consumo máximo de energía: 2.7UW
5. Modo de comunicación: I2C
6. Rango de precisión de humedad (10% RH a 95% RH): HTU21D ± 2% RH
7. Retardo de humedad: ± 1% RH
8. Tiempo de prueba: 50ms
9. Cantidad de deriva anual: -0.5% RH / año
10. Tiempo de respuesta: 5 s
Características:
1.Adopt ROHM original BH1750FVI chip
2. Fuente de alimentación: 3-5v
3.Light Intensity Range: 0-65535 lx
4.Sensor está equipado con un conversor de
16bitAD 5.Directamente salida digital, ahorra cálculos complejos y calibración
6. No diferenciar la fuente de luz ambiental
7. Cerca de las características espectrales de la sensibilidad visual
8.Capaz de realizar pruebas de alta precisión lx a gran brillo
9. Estándar NXP IIC protocolo de comunicación
10. Dentro del módulo incluye conversión de nivel de comunicación, se puede conectar directamente con 5v SCM io
Código simples de ejemplos
Ejemplo HTU21D
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <Wire.h> #include <SHT2x.h> void setup() { Wire.begin(); Serial.begin(9600); } void loop() { Serial.print("Humidity(%RH): "); Serial.print(SHT2x.GetHumidity()); Serial.print(" Temperature(C): "); Serial.println(SHT2x.GetTemperature()); delay(1000); } |
Ejemplo BH1750FVI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <Wire.h> #include <BH1750.h> BH1750 lightMeter; void setup(){ Serial.begin(9600); lightMeter.begin(); Serial.println("Running..."); } void loop() { uint16_t lux = lightMeter.readLightLevel(); Serial.print("Light: "); Serial.print(lux); Serial.println(" lx"); delay(1000); } |
Ejemplo BMP180
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 |
#include <Wire.h> #include <Adafruit_BMP085.h> Adafruit_BMP085 bmp; void setup() { Serial.begin(9600); if (!bmp.begin()) { Serial.println("Could not find a valid BMP085 sensor, check wiring!"); while (1) {} } } void loop() { Serial.print("Temperature = "); Serial.print(bmp.readTemperature()); Serial.println(" *C"); Serial.print("Pressure = "); Serial.print(bmp.readPressure()); Serial.println(" Pa"); Serial.print("Altitude = "); Serial.print(bmp.readAltitude()); Serial.println(" meters"); Serial.print("Pressure at sealevel (calculated) = "); Serial.print(bmp.readSealevelPressure()); Serial.println(" Pa"); Serial.print("Real altitude = "); Serial.print(bmp.readAltitude(101500)); Serial.println(" meters"); Serial.println(); delay(500); } |
Código de ejemplo para Ubidots
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 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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
/**************************************** * Incluir librerias ****************************************/ #include <WiFi.h> #include <PubSubClient.h> #include <Wire.h> #include <Adafruit_BMP085.h> #include <BH1750FVI.h> #include "SparkFunHTU21D.h" #define WIFISSID "Mi_red_wifi" // Cambiar por el nombre de tu red wifi #define PASSWORD "Mi_clave_wifi" // Cambia por la contraseña de tu red wifi #define TOKEN "Mi_token_de_ubidots" // Token asignado por Ubidots #define MQTT_CLIENT_NAME "Mi_nombre_MQTT" // Nombre del cliente MQTT, ingrese su propia cadena ASCII de 8 a 12 caracteres alfanuméricos; // debe ser una cadena ascii aleatoria y única y diferente de todos los demás dispositivos Adafruit_BMP085 bmp; // Crea la instancia de Lightsensor. BH1750FVI LightSensor(BH1750FVI::k_DevModeContLowRes); //Crear una instancia del objeto myHumidity HTU21D myHumidity; /**************************************** * Definimos etiquetas ****************************************/ #define VARIABLE_LABEL_1 "temperatura" // Asigna una etiqueta de variable única para enviar los datos de temperatura #define VARIABLE_LABEL_2 "presion" // Asigna una etiqueta de variable única para enviar los datos de la presión atmosférica #define VARIABLE_LABEL_3 "altitud" // Asigna una etiqueta de variable única para enviar los datos de altitud #define VARIABLE_LABEL_4 "luz" // Asigna una etiqueta de variable única para enviar los datos de intensidad de luz #define VARIABLE_LABEL_5 "humedad" // Asigna una etiqueta de variable única para enviar los datos de la humedad #define DEVICE_LABEL "Esp32-T" // Asigna la etiqueta del dispositivo char mqttBroker[] = "industrial.api.ubidots.com"; char dato1[100]; char dato2[100]; char dato3[100]; char dato4[100]; char dato5[100]; char var1[150]; char var2[150]; char var3[150]; char var4[150]; char var5[150]; // Espacio para almacenar valores a enviar. char sensor1[10]; char sensor2[10]; char sensor3[10]; char sensor4[10]; char sensor5[10]; /**************************************** * Funciones auxiliares ****************************************/ WiFiClient ubidots; PubSubClient client(ubidots); void callback(char* var, byte* dato, unsigned int length) { char p[length + 1]; memcpy(p, dato, length); p[length] = NULL; String message(p); } /**************************************** * Funciones principales ****************************************/ void setup() { Serial.begin(115200);//Puerto serial a 115200 WiFi.begin(WIFISSID, PASSWORD);//Inicializamos la red wifi con los datos nuestra red wifi Serial.println(); Serial.print("Esperando conexion WiFi..."); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); Serial.println(""); Serial.println("WiFi Connectado"); Serial.println("Direccion: "); Serial.println(WiFi.localIP()); client.setServer(mqttBroker, 1883); client.setCallback(callback); if (!bmp.begin()) { Serial.println("No se pudo encontrar un sensor BMP085 válido, verifique el cableado!"); while (1) {} } LightSensor.begin(); myHumidity.begin(); } } void loop() { if (!client.connected()) { reconectar(); } sprintf(var1, "%s%s", "/v1.6/devices/", DEVICE_LABEL); sprintf(var2, "%s%s", "/v1.6/devices/", DEVICE_LABEL); sprintf(var3, "%s%s", "/v1.6/devices/", DEVICE_LABEL); sprintf(var4, "%s%s", "/v1.6/devices/", DEVICE_LABEL); sprintf(var5, "%s%s", "/v1.6/devices/", DEVICE_LABEL); sprintf(dato1, "%s", ""); // Borra dato1 sprintf(dato2, "%s", ""); // Borra dato2 sprintf(dato3, "%s", ""); // Borra dato3 sprintf(dato4, "%s", ""); // Borra dato4 sprintf(dato5, "%s", ""); // Borra dato5 sprintf(dato1, "{\"%s\":", VARIABLE_LABEL_1); sprintf(dato2, "{\"%s\":", VARIABLE_LABEL_2); sprintf(dato3, "{\"%s\":", VARIABLE_LABEL_3); sprintf(dato4, "{\"%s\":", VARIABLE_LABEL_4); sprintf(dato5, "{\"%s\":", VARIABLE_LABEL_5); /**************************************** * Leemos el valor de cada uno de los sensores y lo asignamos a sus respectivas variables ****************************************/ float temperatura = bmp.readTemperature(); float presion = bmp.readPressure(); float altitud = bmp.readAltitude(); uint16_t lux = LightSensor.GetLightIntensity(); float humedad = myHumidity.readHumidity(); /**************************************** * Imprimimos en el terminal serial los datos obtenidos ****************************************/ Serial.print("Temperatura = "); Serial.print(temperatura); Serial.println(" *C"); Serial.print("Presion = "); Serial.print(presion); Serial.println(" Pa"); Serial.print("Altitud = "); Serial.print(altitud); Serial.println(" metros"); Serial.print("Luz: "); Serial.println(lux); Serial.print("Humedad: "); Serial.print(humedad, 1); Serial.println("%"); /* 4 es el ancho mínimo, 2 es la precisión; el valor flotante se copia en las variables sensor*/ dtostrf(temperatura, 4, 2, sensor1); dtostrf(presion, 4, 2, sensor2); dtostrf(altitud, 4, 2, sensor3); dtostrf(lux, 4, 2, sensor4); dtostrf(humedad, 4, 2, sensor5); sprintf(dato1, "%s {\"value\": %s}}", dato1, sensor1); // Agrega el valor sprintf(dato2, "%s {\"value\": %s}}", dato2, sensor2); // Agrega el valor sprintf(dato3, "%s {\"value\": %s}}", dato3, sensor3); // Agrega el valor sprintf(dato4, "%s {\"value\": %s}}", dato4, sensor4); // Agrega el valor sprintf(dato5, "%s {\"value\": %s}}", dato5, sensor5); // Agrega el valor Serial.println("Publicación de datos en nube de Ubidots"); /**************************************** * Publicamos los datos en los servidores de ubidots ****************************************/ client.publish(var1, dato1); client.publish(var2, dato2); client.publish(var3, dato3); client.publish(var4, dato4); client.publish(var5, dato5); client.loop(); delay(1000); } /**************************************** * Función reconectar ****************************************/ void reconectar() { // Bucle hasta que nos reconectemos while (!client.connected()) { Serial.println("Intentando la conexión MQTT..."); // Attemp to connect if (client.connect(MQTT_CLIENT_NAME, TOKEN, "")) { Serial.println("Connectado"); } else { Serial.print("Fallo!"); Serial.print(client.state()); Serial.println(" Nuevo intento en 2 segundos"); // Esperar 2 segundos antes de volver a intentarlo. delay(2000); } } } |
Al ingresar a ubidots, les recomiendo ir a dispositivos.
Hacemos click en crear dispositivo.
Y nos llevará a un link donde encontraremos ayuda, códigos fuentes, en el que nos basaremos para este proyecto.
Antes de cargar el sketch, revisaremos la configuración.
A continuación subimos el código. Recordemos apretar la tecla «key» en el ESP32, si no, nos dará un error.
Reseteamos el módulo. Y observamos en el terminal serial, que se están subiendo los datos a ubidots.
Una vez que hemos subido nuestor código y arrancado nuestro módulo ESP32.
Actualizaremos la página de dispositivos y aparecerá, el dispositivo con el nombre que le pusimos en el código, automáticamente.
Si hacemos click en el mismo, veremos las 5 variables, declaradas en el código.
Iremos a tableros.
Agregaremos un widget del tipo LineChart.
El comportamiento del mismo será «Static»
Haremos click en agregar variables, y dentro del dispositivo buscaremos la variable temperatura.
En «Span» elegiremos «Last Values» y colocamos 30.
En nombre ponemos un nombre descriptivo. El resto lo dejamos como está.
Dimensionamos el widget para una mejor visualización
Si queremos podemos agregar otro tipo de widget, del tipo termómetro para la temperatura.
Nos va a quedar como se ve en la siguiente imagen. Repetimos los mismos pasas para el resto de los widget.
Podemos testear la temperatura, y la humedad aplicando aire caliente con un secador de pelo, debería subir la temperatura y bajar la humedad.
Si aplicamos luz al sensor veremos que las métricas del sensor se disparan muy alto.
SUSCRIBETE A NUESTROS BOLETINES, RECIBE EN TU CORREO LAS NOTICIAS MÁS DESTACADAS, SÓLO INGRESANDO TU CORREO ELECTRÓNICO
VIDEOS RECOMENDADO