
Esquema Rápido
Sensores de bricolaje para la Automatización del hogar
Esta publicación es parte de un tutorial sobre cómo construir sensores de automatización del hogar de bajo costo. Si ha aterrizado en esta página directamente, le sugiero que consulte primero Sensores de automatización del hogar de bajo costo. En esta parte del tutorial, creará la puerta de enlace. La puerta de enlace manejará las comunicaciones para todos los nodos de su red.
Lista de materiales
Unidades | Descripción |
1 | NRF24L01 + RF inalámbrico de 2,4 GHz |
1 | Arduino Nano V3 |
1 | Cables de salto |
1 | Sensor de temperatura y humedad DHT22 |
Construye el circuito
Para este sensor en particular, estoy usando un Arduino Nano. Tiene un tamaño muy pequeño y funciona muy bien para los nodos que planea tener conectados a una toma de corriente.
Cuando compre el sensor DHT22, es posible que reciba uno que se ve ligeramente diferente al del diagrama. Si obtiene algo que se parece a este, no se preocupe. Es el mismo sensor pero algunos fabricantes lo envían integrado en un PCB solo con los 3 pines que son relevantes. Solo tienes que conectar Out a D3 y los otros 2 a VCC y GND.
Instalar bibliotecas adicionales
El código para Arduino que tiene a continuación requiere 2 bibliotecas, MySensors y DHT22.
MySensors
- Descargue la última RC de la biblioteca MySensors desde este enlace.
2. Agregue el archivo zip como una nueva biblioteca.
DHT22
Cuando escribí este tutorial inicialmente, estaba usando la biblioteca descargada directamente del administrador de la biblioteca en el IDE de Arduino. Gracias a los comentarios de Nucutza (en los comentarios) llegué a saber que la biblioteca se ha actualizado y el código ya no se compila. Según su sugerencia, estoy agregando el enlace a las bibliotecas externas de MySensor. Entre otras cosas, contiene una versión modificada de la biblioteca para interactuar con los sensores DHT11 y DHT22.
Sube el boceto al Arduino
Puede encontrar un enlace sobre cómo cargar bocetos en Arduino si aún no está familiarizado con la plataforma.
#include <DHT.h> #define MY_DEBUG#define MY_RADIO_NRF24#define MY_NODE_ID 1 #define CHILD_ID_TEMP 0#define CHILD_ID_HUM 1#define DHT_DATA_PIN 3#define SENSOR_TEMP_OFFSET 0 #include <MySensors.h> /**************************************************//****************** CONSTANTS *********************//**************************************************/ static const uint64_t UPDATE_INTERVAL = 10000;static const uint8_t FORCE_UPDATE_N_READS = 10; /**************************************************//****************** VARIABLES *********************//**************************************************/float lastTemp;float lastHum;float temperature;float humidity;uint8_t nNoUpdatesTemp;uint8_t nNoUpdatesHum; /**************************************************//****************** MESSAGES **********************//**************************************************/ MyMessage msgHum(CHILD_ID_HUM, V_HUM);MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); DHT dht; void presentation() { present(CHILD_ID_HUM, S_HUM);present(CHILD_ID_TEMP, S_TEMP);} void setup(){delay(2000); //Wait 2 seconds before starting sequence if (UPDATE_INTERVAL <= dht.getMinimumSamplingPeriod()) {Serial.println(«Warning: UPDATE_INTERVAL is smaller than supported by the sensor!»);} sleep(dht.getMinimumSamplingPeriod()); dht.setup(DHT_DATA_PIN);} void loop() { sendTemperatureHumiditySensor(); wait(UPDATE_INTERVAL);} /**************************************************//**************** AUX. FUNCTIONS ******************//**************************************************/ void sendTemperatureHumiditySensor(){dht.readSensor(true);temperature = dht.getTemperature();humidity = dht.getHumidity(); if (isnan(temperature)) {Serial.println(«Failed reading temperature from DHT!»);} else if (temperature != lastTemp || nNoUpdatesTemp == FORCE_UPDATE_N_READS) {lastTemp = temperature;nNoUpdatesTemp = 0;temperature += SENSOR_TEMP_OFFSET;send(msgTemp.set(temperature, 1)); #ifdef MY_DEBUGSerial.print(«T: «);Serial.println(temperature);#endif} else {nNoUpdatesTemp++;} if (isnan(humidity)) {Serial.println(«Failed reading humidity from DHT»);} else if (humidity != lastHum || nNoUpdatesHum == FORCE_UPDATE_N_READS){lastHum = humidity;nNoUpdatesHum = 0;send(msgHum.set(humidity, 1)); #ifdef MY_DEBUGSerial.print(«H: «);Serial.println(humidity);#endif} else {nNoUpdatesHum++;} } |
Agregar nuevos elementos a OpenHab
El boceto de Arduino que acaba de cargar publicará valores en los siguientes temas.Temperatura -> mygateway1-out / 1/0/1/0/0Humedad -> mygateway1-out / 1/1/1/0/1La definición del tema anterior dependerá de los parámetros definidos en su boceto, principalmente el identificador de nodo y las identificaciones que identifican a cada uno de los sensores.
123 | #define MY_NODE_ID 1#define CHILD_ID_TEMP 0#define CHILD_ID_HUM 1 |
Si cambia los parámetros en el boceto, asegúrese de modificar los temas en consecuencia.Temperatura -> mygateway1-out / MY_NODE_ID / CHILD_ID_TEMP / 1/0/0Humedad -> mygateway1-out / MY_NODE_ID / CHILD_ID_HUM / 1/0/1Si está utilizando OpenHab, asegúrese de echar un vistazo al tutorial de MQTT y OpenHab .Como referencia, aquí tienes la definición de los elementos del croquis de arriba.
12 | Number mqtt_bedroom_temperature «Temperature [%.1f]» {mqtt=»<[mosquitto:mygateway1-out/1/0/1/0/0:state:default]»}Number mqtt_bedroom_humidity «Humidity [%.1f]» {mqtt=»<[mosquitto:mygateway1-out/1/1/1/0/1:state:default]»} |
Si desea obtener más información sobre el protocolo de comunicación de la biblioteca MySensor, consulte el Protocolo de comunicación de MySensors .
Espero que les haya gustado el tutorial, si tiene preguntas o sugerencias por favor publique algunos comentarios.