Module station météo V3

station-meteo_outBox_v3

Bonjour à tous !

Je vais aujourd’hui parler de la nouvelle version de mes modules pour l’appartement. En effet, dans des précédents articles je vous présentais une première version avec un boitier en bois, puis avec un boitier en plastique « pas terrible » puis le module extérieur avec une boite étanche. Dans cette nouvelle version, je vais vous présenter pourquoi j’ai décidé d’en créer une nouvelle, et comment je l’ai faite.

 

Pourquoi une version 3 ?

J’ai décidé de créer cette troisième version de module car j’avais le besoin de pouvoir voir les températures et humidités de chaque module dans l’appartement.

En effet jusqu’à maintenant le moyen de voir mes données était soit d’aller sur la plateforme Thingspeak, ou sur mon interface météo que je vous ai présenté dans un article précédent (ici). Mais pour cela il m’était absolument nécessaire d’avoir internet, sinon impossible de connaitre la température dans mon salon ou sur mon balcon.

 

Quelle solution choisir ?

Plusieurs solutions me sont venues. Une première était de créer un écran (physique) avec une Raspberry Pi pour afficher mes données toutes les 2 ou 3 minutes. Mais le problème reste le même que précédemment, si je n’ai plus de connexion à internet, pas de température.

Je me suis donc dis que le meilleur moyen de pouvoir visualiser mes données était encore d’installer un petit écran sur chaque module. Il existe de plus en plus de formats sur le marché électronique, du plus petit allant de 0,5pouce jusqu’a plus de 10pouces. J’ai donc évalué quelle taille il me fallait. Pour cela j’ai déterminé combien d’informations je voulais afficher, ici j’en avais deux -> la température et l’humidité. J’ai regardé un peu sur internet des gens qui avaient fait des projets similaires pour voir combien de données ils affichaient et donc la taille de l’écran qu’ils utilisaient. Et j’en ai conclu qu’un écran de 1 pouce était largement suffisant (0,96pouce exactement).

 

Quel matériel choisir ?

À vrai dire, le matériel importe peu. Ce qui importe c’est le budget qu’on veut consacrer à chaque module et la vitesse avec laquelle les composants vont communiquer. Pour le coup, le critère de la vitesse d’exécution n’est pas essentiel. En effet, pour connaitre la température dans son salon on se moque un peu si on perd une donnée toutes les 10 minutes – on est pas en train de piloter une fusée de chez SpaceX.

Revenons à nos moutons ! Pour choisir le matériel, j’ai regardé chez des marchands pas chers, du style Aliexpress, banggood, gearbest, etc.. Je savais que je voulais du style Arduino avec une puce wifi ESP8266. Ensuite, je voulais une sonde de température/humidité (DHT11) mais j’en avais déjà, et enfin un petit écran pour afficher mes données.

Voici la liste de ces trois composants:

 

Et coter code ?

Au niveau du code c’est assez « simple », il suffit de se connecter à Internet, de récupérer la température et l’humidité de la sonde et de l’afficher sur l’écran. Pour cela, il faut utiliser quelques librairies:

  • Wire.h -> pour la liaison série I2C
  • SSD1306.h -> pour afficher sur l’écran oled
  • ESP8266WiFi.h -> pour la connexion wifi
  • DHT.h -> pour la sonde de température/humidité DHT11

C’est à peu pret tout du coter des librairies nécessaires pour le module.

 

Maintenant voici le code qui fait tout ça:

// Include the correct display library
// For a connection via I2C using Wire include
#include <Wire.h>  // Only needed for Arduino 1.6.5 and earlier
#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"`
#include <ESP8266WiFi.h> 

#include <DHT.h>

#define DHTPIN 0     // what pin we're connected to
#define DHTTYPE DHT11   // DHT 11

const char* ssid     = "YOUR_SSID"; 
const char* password = "SSID_PASSWORD"; 

const char* server = "api.thingspeak.com"; 
String apiKey = "API_KEY"; 

// Initialize the OLED display using brzo_i2c
// D1 -> SDA
// D2 -> SCL

// Initialize the OLED display using Wire library
SSD1306  display(0x3c, D1, D2);
// SH1106 display(0x3c, D3, D5);

// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);
WiFiClient client; 
void setup(){
  // Initialising the UI will init the display too.
  display.init();
  Serial.begin(9600);
  display.flipScreenVertically();
  Serial.print("Connexion à "); 
  Serial.println(ssid); 
  WiFi.begin(ssid, password); 
  while (WiFi.status() !=WL_CONNECTED) {
    delay(500); 
  }
  Serial.println(); 
  Serial.println("Wifi connecté"); 
  Serial.println("Adresse IP: "); 
  Serial.println(WiFi.localIP()); 
  dht.begin(); // initialize dht
}

void displayTempHumid(){
  int hum, temp;
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  int h = dht.readHumidity();
  int t = dht.readTemperature();
  Serial.println("humi" + h);
  Serial.println("temp" + t);
  // Read temperature as Celsius
// Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)){
    display.clear(); // clearing the display
    display.drawString(5,0, "Failed DHT");
    return;
  }

  if(t < 100 && h < 100) {
    temp = t;
    hum = h;
    
    display.clear();
    display.setFont(ArialMT_Plain_16);
    display.setTextAlignment(TEXT_ALIGN_LEFT);
    display.drawString(0, 0, "Humid");
    display.setFont(ArialMT_Plain_24);
    display.drawString(0, 16, String(hum) + "%");
    display.setFont(ArialMT_Plain_16);
    display.drawString(64, 0, "Temp");
    display.setFont(ArialMT_Plain_24);
    display.drawString(64, 16, String(temp) + "°C"); 

        if (client.connect(server,80)){ 
      String postStr = apiKey; 
             postStr +="&field1="; 
             postStr += String(temp); 
             postStr += "&field2="; 
             postStr += String(hum); 
             postStr += "\r\n\r\n"; 
       client.print("POST /update HTTP/1.1\n"); 
       client.print("Host: api.thingspeak.com\n"); 
       client.print("Connection: close\n"); 
       client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");  
       client.print("Content-Type: application/x-www-form-urlencoded\n");  
       client.print("Content-Length: ");  
       client.print(postStr.length());  
       client.print("\n\n");  
       client.print(postStr); 
    }
    client.stop(); 
  }
  else{
    return;
  }
  
   
}

void loop(){
  displayTempHumid();
  display.display();
  delay(60000);
}
code module individuel

Et la suite ?

Evidemment il y a une suite, vous devez bien vous rendre compte qu’il manque une finition. La carte est reliée par des câbles sur une breadboard, ce qui veut dire que c’est encore au stade de développement. J’ai deja prévu de souder les cables proprement et de finir l’ensemble du module en créant une « boite » en impression 3D. Car oui, j’ai commandé une imprimante 3D que je devrai d’ailleurs recevoir bientot !

Cette derniere étape fera l’objet d’un nouvel article pour présenter la méthode suivie pour créer cette boite en 3D, ainsi que les différentes étapes pour mettre les éléments dans celle-ci.

 

Sur ce, je vous laisse et vous dis à tres bientôt !

 

F.

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.