Simple pour commencer

Le module "Air Humidity Sensor - DHT" est une très bonne base pour faire le premier capteur. Beaucoup de déconvenues se sont passées au niveau de l'alimentation et sa gestion. Pour optimiser la consommation il faut jouer sur la veille profonde et puis quelque menu modification pour éviter de réaliser des actions trop souvent ou pas nécessaires.

la platine

La fonction de base est un capteur de température DHT22 avec sa résistance de tirage. Un pont diviseur pour mesurer le voltage de la pile au travers de A0 et l'utilisation de la référence de voltage interne. Bien sur le module NRF24 pour la transmission des informations.

Afin de rendre la carte du circuit imprimé plus universelle, j'ai mis en place des plots ou connecteurs pour pouvoir étendre les fonctionnalités de la carte par l'ajout de résistances ou connecteurs.

temp_platine

Miam

Pour alimenter j'ai opté pour un accu 18650, comme l'alim varie de 4.2V à 3V, j'ai fait le pari que l'entrée Vin/Raw fera l'affaire. L'avenir me la dit... la carte de mesure de température est fonctionnelle jusqu’à un niveau de pile de 3.3V, ce qui était quasi sur pour le module NRF24 mais moins pour l'arduino , bien plus sensible à une alimentation faible. Je dois recharger les accus a peu près tout les 3 mois, sauf si la transmission est délicate ou en bout de portée, alors la carte va consommer bien plus.

Schema électronique

temp_schema

Circuit imprimé

Forcement le plus petit possible, en double face et cms. Envoyé chez jlcpcb parce qu'une belle carte c'est quand même "vachement plus mieux et joli". temp_ci

The code

Là il y a un peu plus à dire. Je suis parti du code de Henrik Ekblad.

  • L'option #define MY_DEBUG que l'on commente ou pas pour avoir les messages supplémentaire dans la console.
  • Le choix de la bonne radio.
  • Ajout de la définition du numéro de la "node", au début de mon bricolage j'ai eu des id de noeud identique ce qui a bien sur posé des problèmes donc le faire à la main est plus contraignant mais bien plus sûr.
  • La papatte de donnée du DHT ( 3).
  • La papatte du check de l'alimentation (A0).
  • Le SLEEP_TIME = 300000 ce qui donne un envoi de données toute les 5 min.
  • CountPower >= 72 pour ajuster l'intervalle de mesure de l'alim en lien avec SLEEP_TIME donc 72 x 5min = 6H
  • Et pour finir, sendSketchInfo("Capteur template", "1"); Voilà pour les variables à ajuster. Le Principe, mesure de la température et de l’humidité, mais pour économiser l’énergie ce sera toutes les 5 min (SLEEP_TIME), ce qui permet d'avoir une très bonne réactivité lors de la phase de chauffe des radiateurs. Pour optimiser encore l’énergie, il n'y aura transmission que si la température à changée depuis la dernière mesure. Enfin la mesure de la batterie sera effectué que sur un laps de temps long.
/**
 * The MySensors Arduino library handles the wireless radio link and protocol
 * between your home built sensors/actuators and HA controller of choice.
 * The sensors forms a self healing radio network with optional repeaters. Each
 * repeater and gateway builds a routing tables in EEPROM which keeps track of the
 * network topology allowing messages to be routed to nodes.
 *
 * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
 * Copyright (C) 2013-2015 Sensnology AB
 * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
 *
 * Documentation: http://www.mysensors.org
 * Support Forum: http://forum.mysensors.org
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * version 2 as published by the Free Software Foundation.
 *
 *******************************
 *
 * REVISION HISTORY
 * Version 1.0: Henrik EKblad
 * Version 1.1 - 2016-07-20: Converted to MySensors v2.0 and added various improvements - Torben Woltjen (mozzbozz)
 * Version 2.0 - 2024-01-15: Added a counter to measure the battery value every 6 hours. Sends temperature only if it changes every 5 min. - tedesco nicolas
 * 
 * DESCRIPTION
 * This sketch provides an example of how to implement a humidity/temperature
 * sensor using a DHT11/DHT-22.
 *  
 * For more information, please visit:
 * http://www.mysensors.org/build/humidity
 * 
 */

// Enable debug prints
//#define MY_DEBUG

// Enable and select radio type attached 
#define MY_RADIO_RF24
//#define MY_RADIO_RFM69
//#define MY_RS485

//Force node ID
#define MY_NODE_ID 99

#include <MySensors.h>  
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

// DHT def
// Set this to the pin you connected the DHT's data pin to
#define DHTPIN 3
// Uncomment the type of sensor in use:
//#define DHTTYPE           DHT11     // DHT 11 
#define DHTTYPE             DHT22     // DHT 22 (AM2302)
//#define DHTTYPE           DHT21     // DHT 21 (AM2301)

DHT_Unified dht(DHTPIN, DHTTYPE);

// Set this offset if the sensor has a permanent small offset to the real temperatures
#define SENSOR_TEMP_OFFSET 0

#define CHILD_ID_HUM 0
#define CHILD_ID_TEMP 1

//batterie check
int BATTERY_SENSE_PIN = A0;  // select the input pin for the battery sense point

float T;
// old temp
float Told;
float H;

bool metric = true;

MyMessage msgHum(CHILD_ID_HUM, V_HUM);
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);

uint32_t SLEEP_TIME = 300000;  // sleep time between reads (seconds * 1000 milliseconds)
int oldBatteryPcnt = 0;

//Adjust power value
int AdjValue = 50 ; 
//Init counter for mesure voltage
int CountPower = 0;

uint32_t delayMS;

void presentation()  
{ 
  // Send the sketch version information to the gateway
  sendSketchInfo("Capteur template", "1");

  // Register all sensors to gw (they will be created as child devices)
  present(CHILD_ID_HUM, S_HUM);
  present(CHILD_ID_TEMP, S_TEMP);

  metric = getControllerConfig().isMetric;
}

void setup()
{
 //init DHT sensor
  dht.begin();
  //Serial.println("DHTxx Unified Sensor");
  // Print temperature sensor details.
  sensor_t sensor;
  dht.temperature().getSensor(&sensor);
 #ifdef MY_DEBUG
   Serial.println("------------------------------------");
   Serial.println("Temperature");
   Serial.print  ("Sensor:       "); Serial.println(sensor.name);
   Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
   Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
   Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println(" *C");
   Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println(" *C");
   Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println(" *C");  
   Serial.println("------------------------------------");
 #endif
  // Print humidity sensor details.
  dht.humidity().getSensor(&sensor);
 #ifdef MY_DEBUG
   Serial.println("------------------------------------");
   Serial.println("Humidity");
   Serial.print  ("Sensor:       "); Serial.println(sensor.name);
   Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
   Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
   Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println("%");
   Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println("%");
   Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println("%");  
   Serial.println("------------------------------------");
 #endif
  // Set delay between sensor readings based on sensor details.
  delayMS = sensor.min_delay / 1000;

  //batt_check
      // use the 1.1 V internal reference
  #if defined(__AVR_ATmega2560__)
    analogReference(INTERNAL1V1);
  #else
    analogReference(INTERNAL);
  #endif
}

void loop()      
{  
  delay(delayMS);
  // Get temperature event
  sensors_event_t event;  
  dht.temperature().getEvent(&event);
  float temperature = event.temperature;
  // arrondi au dixieme
  T=floor(10*temperature+0.5)/10;
  if (isnan(T)) {
    Serial.println("Failed reading temperature from DHT!");
  } else {
    if (!metric) {
      // ° * 9/5 +32 =F
      T = T*9/5+32;
    }
    #ifdef MY_DEBUG
    Serial.print("Temperature: ");
    Serial.println(T);
    Serial.print("Temperature OLD: ");
    Serial.println(Told);
    #endif
    if (T != Told) {
      T += SENSOR_TEMP_OFFSET;
      send(msgTemp.set(T, 1));
      // new temp to Told
      Told = T;

      #ifdef MY_DEBUG
      Serial.print("Send Temperature =>");
      Serial.println(T);
      #endif
    }
  }

  // Get humidity event and print its value.
  dht.humidity().getEvent(&event);
  float humidity = event.relative_humidity;
  // arrondi a l'unité
  H=floor(humidity);
  if (isnan(event.relative_humidity)) {
    Serial.println("Failed reading humidity from DHT");
  } else {
    // ne transmet que si la temperature change
    if (T != Told) {
      send(msgHum.set(H, 1));

      #ifdef MY_DEBUG
      Serial.print("Send Humidity =>");
      Serial.println(H);
      #endif
    }
  }

  // get the battery Voltage
  // counter mesure si >= 72 ( 72*5min = 6H )
  #ifdef MY_DEBUG
  Serial.println(CountPower);
  #endif
  if ( CountPower >= 72 ) {
    // reinit counter
    CountPower=0;
    int sensorValue = analogRead(BATTERY_SENSE_PIN);
    #ifdef MY_DEBUG
    Serial.print("Voltage numeric read: ");
    Serial.println(sensorValue);
    #endif

    // 1M, 352K divider across battery and using internal ADC ref of 1.1V
    // Sense point is bypassed with 0.1 uF cap to reduce noise at that point
    // ((1e6+352e3)/352e3)*1.1 = Vmax = 4.225 Volts
    // 4.225/1023 = Volts per bit = 0.00413000977517
    /* 
    * 4.22 = 100%  3,3V = 78%     
    */

    int batteryPcnt = ( sensorValue-AdjValue ) / 10;

    #ifdef MY_DEBUG
    float batteryV  = (sensorValue-AdjValue) * 0.00413000977517;
    Serial.print("Battery Voltage: ");+
    Serial.print(batteryV);
    Serial.println(" V");
    Serial.print("Battery percent: ");
    Serial.print(batteryPcnt);
    Serial.println(" %");
    #endif

    if (oldBatteryPcnt != batteryPcnt) {
      // Power up radio after sleep
      sendBatteryLevel(batteryPcnt);
      oldBatteryPcnt = batteryPcnt;
    }

  }
  ++CountPower;
  sleep(SLEEP_TIME);

}

coucou jeedom i'm alive

Après une inclusion depuis le menu plugin Mysensors, notre capteur est présenté, quelques petits réglages tel que le parent, la catégorie, l'activer bien sur puis tout les autres champs seront les bien venus, notre capteur est fin prêts.

capteur_1

Dans l'onglet commande on va vérifier la presence de nos deux point de mesure température et humidité avec leur unités et leur types. Sur chaque capteur et depuis la roue crantée en fin de ligne, on va affecter un autre visuel dans l'onglet affichage.

capteur_2

Pour mon installation j'ai importé des custom temp et hydro

capteur_3

Voilà le résultat

capteur_4

Fichiers

Fichier Arduino => promini_template.ino
Fichier Fritzing => nano_pro_temp_lab.fzz

ENJOY !

Next Post Previous Post