Cas d’usage : Arduino et chauffage

Voici un cas concret d’utilisation d’une carte Arduino.

Le contexte est le suivant : la copropriété dans laquelle j’habite envisage de mettre en place la répartition des frais de chauffage. Excellente initiative pour faire en sorte que chacun se responsabilise vis à vis de sa consommation. Mais voilà … quelle est la situation de mon logement ? L’utilisation de mes radiateurs est-elle correcte ? Est-il possible d’avoir une estimation de l’activité de mon chauffage et donc de ce que ça me coûtera à termes ? Enfin, y a t’il un intérêt à changer mes têtes thermostatiques manuelles par des têtes thermostatiques programmées voire pilotées ?

Beaucoup de questions … pour un chauffagiste … mais quelles informations peut-on collecter pour avoir une première idée ?

Et bien, avec très peu de chose, une carte Arduino et un peu de matériel il sera possible de récolter pas mal d’informations. Pour se faire, on s’intéressera à l’équipement suivant :

  • 1x carte Arduino MKR1000 (ou équivalent)
  • 2x sondes de température DS18B20

Pourquoi la MKR1000 ? Tout simplement parce que cette carte embarque un microcontrôleur (µC) et une puce Wifi. Cela permettra – si on le souhaite – de centraliser les données sur un serveur (en local ou sur le net). Si vous n’avez pas de MKR1000 ou si vous souhaitez que vos données restent localisées chez vous, il suffira d’opter pour une solution de stockage sur carte SD (via un shield Arduino par exemple ou une carte compatible) ou de laisser votre carte connecté au port série pour collecter les données.

Pourquoi 2 sondes de T° ? Tout simplement pour capturer la T° ambiante et la T° de surface du radiateur que l’on souhaite analyser. En effet, les compteurs de thermies se servent de ces 2 mesures pour établir leurs calculs (on le verra dans la partie suivante).

Note : de mon coté, j’ai déjà une installation domotique qui relève les T° et l’hygrométrie de l’ensemble de l’appartement. D’où les courbes supplémentaires (hygro ambiante et température extérieure) sur les graphiques de cet article.

Comment fonctionne les compteurs de thermies ?

Trouver des informations précises sur le fonctionnement de ces compteurs n’est pas facile mais avec un peu de patience on trouve toujours ce que l’on cherche … La copropriété envisage de s’orienter sur une solution ISTA (leader du marché) avec des compteurs de thermies de type Doprimo III.

De façon rapide, on peut dire que les compteurs de thermies se déclenchent dès que la t° de surface du radiateur atteint les 23°C et que l’incrément des thermies consommées se fait dès que le delta entre la t° ambiante et la t° de surface est > à 4,5°C.

Ces informations sont issues du document officiel (consultable ici) du compteur Doprimo III de la société ISTA.

Et maintenant ?

Et bien maintenant, on va faire notre propre « compteur de thermies ». Pour rester simple, on se contentera de relever les t° et la partie calcul / analyse sera externalisée. Le but n’é
Le circuit est des plus simple : on connecte les 2 sondes de T° sur un bus 1-Wire et on fait en sorte de lire la T° ambiante et la T° de surface du radiateur tout les minutes.
On exploite ensuite ces 2 données via les infos précédentes.

Le montage est le suivant :

Note : Pour l’instant, Fritzing ne dispose pas de la carte MKR1000 … j’ai donc mit une Arduino Nano à la place mais le principe est le même pour ce qui est de la connectique. Bien sur la Nano ne dispose pas de connectivité Wifi.

Le code est le suivant :

/*
 * This programm is done to send DS18B20 data to a PHP script (via HTTP POST).
 * Wifi connection is tested each time before we want to send data.
 * No standby mode is used in this version.
 */

#include <SPI.h>
#include <WiFi101.h>
#include <OneWire.h>
#include <DallasTemperature.h>



//===============================================================================
// Define sensors Informations
#define SENSOR_ID   2
#define SENSOR_TYPE "TEMP"

// Define informations relative to temp sensors
#define ONE_WIRE_PIN 6
#define DS18B20_RESOLUTION 11  // (0,25°)
#define NB_TEMP 1


//===============================================================================
// Global vars
// Wifi network informations
//char ssid[] = "YOUR_SSID";            // wireless network name
//char password[] = "YOUR_PWD";           // wireless password

int status = WL_IDLE_STATUS;
WiFiClient client;

// OneWire variables
OneWire oneWire(ONE_WIRE_PIN);        // Initialize oneWire
DallasTemperature sensors(&oneWire);  // Define a DS18B20 object pool

// Temperatures storage 
float temp[NB_TEMP];

// Server information
char server[] = "www.yourdomain.com"; 

// This is the data that will be passed into your POST and matches your mysql column
String strBufferData;

//--------------------------------------------------------------------------------------
void setup() 
{
  Serial.begin(115200);

  // Initialize DS18B20 sensors
  sensors.begin();
  sensors.setResolution(DS18B20_RESOLUTION);

  // Connect to wifi infra
  connectWifi();

  // You're connected now, so print out the status
  printWifiStatus();
}


//--------------------------------------------------------------------------------------
void loop() 
{
  // Get all temperatures infos 
  sensors.requestTemperatures();
  for (int i=0;i<NB_TEMP;i++)
    temp[i] = sensors.getTempCByIndex(i);


  // Check wifi connection before try to send data
  status = WiFi.status();
  if (status != WL_CONNECTED)
  {
    Serial.println("(re)connect to wifi");
    connectWifi();
  }
  else
  {
    Serial.println("post data");
    postData();
  }

  delay(60*1000);         // Wait 60s. You can apply the timing you want.
}


//--------------------------------------------------------------------------------------
void connectWifi() 
{
  // Attempt to connect to wifi network
  while ( status != WL_CONNECTED) 
  {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, password);
    // Wait 10 seconds for connection
    delay(10000);
  }
}


//--------------------------------------------------------------------------------------
void printWifiStatus() 
{
  // Print the SSID of the network you're attached to
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // Print your WiFi shield's IP address
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // Print the received signal strength
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

//--------------------------------------------------------------------------------------
// This method makes a HTTP connection to the server and POSTs data
void postData() 
{
  // Prepare the buffer for the POST request  
  strBufferData = "id=" + String(SENSOR_ID);
  String strValues="";
  for (int i=0;i<NB_TEMP;i++)
  {
    strValues = strValues + SENSOR_TYPE + "=" + String(temp[i]);
    if (i<NB_TEMP-1)
      strValues = strValues + ",";
  }
  
  strBufferData = strBufferData + "&values=" + strValues;
  
  Serial.println(strBufferData); 

  // If there's a successful connection, send the HTTP POST request
  if (client.connect(server, 80)) 
  {
    Serial.println("connecting...");

    // Specify the target script for the POST.
    client.println("POST /Domo/Scripts/yourscript.php HTTP/1.1");

    // Specify the HOST and all the header informations
    client.println("Host: www.yourdomain.com");
    client.println("User-Agent: Arduino/1.0");
    client.println("Connection: close");
    client.println("Content-Type: application/x-www-form-urlencoded;");
    client.print("Content-Length: ");
    client.println(strBufferData.length());
    client.println();
    client.println(strBufferData); 
    client.println();
    client.stop();
  } 
  else 
  {
    // If you couldn't make a connection:
    Serial.println("Connection failed");
    Serial.println("Disconnecting.");
    client.stop();
  }
}

Comme on peut le voir, le code est relativement simple :

  • dans le setup :
    • on initialise les capteurs DS18B20 et on spécifie la résolution de ces derniers ;
    • on tente de monter la connexion Wifi
    • on affiche le status de la connexion Wifi (SSID, Adresse IP, force du signal).
  • dans la partie loop :
    • on récupère les données de l’ensemble des capteurs
    • en fonction de l’état de la connexion Wifi soit on envoie les données via une requête POST soit on relance la connexion Wifi si elle est tombée

Et, concrètement, ça donne quoi ?

Une fois les données collectées, il suffit de les exploiter. Un simple fichier Excel / Cals (OpenOffice) suffit pour cela :

  • une colonne contient la t° ambiante
  • une colonne contient la température de surface du radiateur
  • il suffit d’appliquer les règles de calculs présenter dans la première partie.

Les données ci-dessous ont été complétées avec l’hygrométrie de la pièce (tracé bleu foncé) et la température extérieure (relevé météo en bleu clair).
En orange les périodes ou la t° de surface du radiateur est > à la t° ambiante – donc les périodes où le radiateur apporte de l’énergie à la pièce.
En gris, les périodes ou la t° de surface du radiateur est > à 23°C donc les périodes où le compteur de thermies s’active.
En violet, la période ou la t° de surface est > à 23°C ET le delta entre la t° de surface et la t° ambiante est > à 4° donc la période d’incrémentation des thermies.

Le radiateur sur lequel a été réalisé les extractions ci-dessous est équipé d’une tête thermostatique programmable. Il est possible d’y définir des plages horaires avec des t° spécifiques afin de limiter l’utilisation du radiateur sur les plages horaires où il n’y a personne.

Ci-dessus, un test ou l’on a réglé la tête programmable comme s’il s’agissait d’une tête manuelle : elle délivre tout le temps la même t°.  Verdict : une période en jaune ou le radiateur chauffe pour « rien ». Mais pour être plus précis sur ce verdict, il faudrait faire une analyse plus détaillée du coût exact de cette période.

En conclusion :

C’est quelques données permettent de voir l’utilité des têtes thermostatiques et l’intérêt des têtes programmables. En effet, en spécifiant des t° de consigne en fonction des horaires de présence dans un logement, il est possible de minimiser l’usage du radiateur et donc la consommation associée tout ça de façon automatisée. La configuration utilisée était la suivante :

  • de 6h30 à 8h : on passe sur une t° de consigne de 19°C pour le réveil, le petit déjeuner et la préparation du petit ;
  • de 11h30 à 13h : on passe sur une t° de consigne de 19°C tout simplement parce que je rentre manger le midi
  • enfin, de 17h30 à 23h00 : on passe à une t° de consigne de 19°C pour la fin d’apres midi et la soirée.

La nuit et lorsque le logement n’est pas occupé, on a programmé la t° de consigne passe à 17°.
Les têtes programmables sont relativement souples et permettent en général :

  • de définir un certains nombre de plage (3 en général) ;
  • de spécifier un plage par jour, une plage pour la semaine (Lundi à vendredi) et une plage pour le Week End) ;
  • de spécifier une période de congés :avant de partir en vacance, spécifier votre date de retour et HOP la tête thermostatique se calera sur une t° basse (configurable) pour minimiser la consommation – à la date programmée, les têtes refonctionnent de manière normale : EXTREMEMENT PRATIQUE.

ATTENTION : la t° de consigne que l’on programme sur la tête est utilisée pour être comparée avec la t° mesurée en local de cette même tête thermostatique. Comme, il n’y a pas de sonde de t° dans la pièce, il sera nécessaire d’ajuster LA t° de consigne en fonction de ce qui vous conviendra.  Si vous souhaiter caler l’activité de vos radiateurs sur la température de la pièce où il(s) se trouve(nt), alors il faudra s’orienter vers des têtes pilotées mais ce sera pour une nouvel épisode … 🙂

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.