Station météo sans fil avec arduino

La station météo est bien souvent l’un des premiers montages que l’on fait lorsque l’on débute, il permet de bien appréhender la structure de base, les bibliothèques simples, les capteurs et l’affichage.

Voici un grand classique des premiers montages à réaliser lorsque l’on débute en Arduino (ce que je suis en train de faire). La station météo peut sembler un peu simple et surtout inintéressante mais elle permet réellement de commencer des montages plus complexes.

Mais pourquoi faire sa station météo ?

 

Comme le dit Léonard et sa bande, tout simplement parce que je peux…

Quel station météo ?

Pour présenter la station météo  que je vais faire ici, les points principaux de ce montage sera le suivant :

  • Mesurer la température et l’humidité
  • Deux lieux de mesure (intérieur et extérieur)
  • Une connexion sans fil, je choisis une connexion rf
  • Un fonctionnement sur pile ou batterie

Pour tout suggestion, n’hésitez pas à laisser un commentaire en bas de page, je verrais pour faire la modification et/ou mettre une petite description.

Tout d’abord, j’ai choisi de faire cette station météo avec l’aide de deux arduinos nano, vous allez pouvoir les trouver sur cette page.

Il y aura un arduino à l’extérieur (émetteur) et le second à l’intérieur (réception). Pour la communication sans fil, j’utilise couple émetteur/récepteur rf de 433MHz. Pour la prise de la température et de l’humidité, j’ai choisi un deux prendre deux DHT22.

L’affichage sera très simple à base d’un afficheur 4 lignes et 20 caractères par lignes disponibles ici.
.

Pour réaliser ce montage, il suffira d’assembler plusieurs choses que nous avons déjà pu voir :

Le montage que j’ai réalisé est très moche, je ne me suis pas amusé à faire un boitier pour, je laisse à votre imagination le soin de le faire.

Le récepteur

Le récepteur est composé d’un récepteur RF, d’un afficheur LCD et d’un capteur DHT22.

L’afficheur

Voici les le schéma de principe de l’afficheur :

afficheur lcd arduino
afficheur lcd arduino

Le récepteur RF

Le récepteur rf se présente comme ceci :

récepteur rf
récepteur rf

La broche VCC se place sur le 5 V de l’arduino, le GND est, sans surprise, sur le GND de l’arduino et la broche DATA sur la broche D9

Le capteur de température DHT22

Le DHT22 se branche comme ceci :

dht22
dht22

La résistance branchée entre le 3.3V et D8 de l’arduino est une résistance de 4.7kΩ (si cela ne fonctionne pas, remplacez la par une de 10kΩ).

L’émetteur

L’émetteur est simplement composé d’un capteur DHT22 et d’un émetteur.

Le capteur de température DHT22

Le capteur de température se branche de la même manière que pour le récepteur

Le récepteur rf

Voici le câblage du récepteur sur l’arduino :

emetteur rf
emetteur rf

Le VCC se met sur le 5V de l’arduino, le GND va toujours sur le GND et le data sur la pin D12 de l’arduino.

Voilà deux photos pour montrer, je suis désolé, elle ne sont pas très clair mais en suivant les étapes d’avant, il ne devraient pas y avoir de soucis :

photo récepteur
photo récepteur
Récepteur photo
Récepteur photo

Programmation Arduino de la station météo

Maintenant, nous allons voir la programmation des deux arduinos. Pour inclure la librairie dht, je le décrirais dans un article, sinon vous pouvez la télécharger ici.

L’émetteur

#include <VirtualWire.h> //librairie pour l'emission rf
#include "DHT.h"

#define DHTPIN 8 

// Décommentez les capteurs inutilisés
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

//déclaration du capteur
DHT dht(DHTPIN, DHTTYPE);

float temperature;
float humidite;
char valeur[VW_MAX_MESSAGE_LEN];
char temp1[VW_MAX_MESSAGE_LEN];
char temp2[VW_MAX_MESSAGE_LEN];
void setup()
{
  vw_setup(2000);
  dht.begin();
  delay(500);
}
void loop()
{
  temperature = dht.readTemperature();
  humidite = dht.readHumidity();
  dtostrf(temperature,1,2,temp1);
  dtostrf(humidite,1,2,temp2);
  strcpy(valeur,temp1);
  strcat(valeur,"/");
  strcat(valeur,temp2);
  vw_send((uint8_t *)valeur,strlen(valeur));
  vw_wait_tx();
  delay(1000);
}

Récepteur

#include <VirtualWire.h> // inclusion de la librairie VirtualWire
#include "LiquidCrystal.h" //ajout de la librairie
#include "DHT.h"

#define DHTPIN 8

// Décommentez les capteurs inutilisés
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

//déclaration du capteur
DHT dht(DHTPIN, DHTTYPE);

LiquidCrystal lcd(11,10,5,4,3,2);
 
float temperature;
float humidite;

void setup() // Fonction setup()
{
    lcd.begin(20,4);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Station Meteo");
    lcd.setCursor(0,1);
    lcd.print("1 capteur exterieur");
    lcd.setCursor(0,2);
    lcd.print("et un capteur interieur");
    vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT)
    vw_set_rx_pin(9)
    vw_rx_start();  // Activation de la partie réception de la librairie VirtualWire
    delay(500);
}
 
void loop() // Fonction loop()
{
    uint8_t buf[VW_MAX_MESSAGE_LEN]; // Tableau qui va contenir le message reçu (de taille maximum VW_MAX_MESSAGE_LEN)
    uint8_t buflen = VW_MAX_MESSAGE_LEN; // Taille maximum de notre tableau
    if (vw_wait_rx_max(200)) // Si un message est reçu dans les 200ms qui viennent
    {
        if (vw_get_message(buf, &buflen)) // On copie le message, qu'il soit corrompu ou non
        {
            lcd.clear();
            lcd.setCursor(7,0);
            lcd.print("Ext");
            lcd.setCursor(14,0);
            lcd.print("Int");
            lcd.setCursor(0,1);
            lcd.print("Temp");
            lcd.setCursor(0,2);
            lcd.print("Hum");
            lcd.setCursor(14,1);
            lcd.print(temperature);
            lcd.setCursor(14,2);
            lcd.print(humidite);
            lcd.setCursor(7,1);
            for (byte i = 0; i < buflen; i++) // Si il n'est pas corrompu on l'affiche via Serial
            {
                if ((char)buf[i] == '/')
                {
                  lcd.setCursor(7,2);
                  i++; 
                }
                lcd.print((char)buf[i]);
            }
            temperature = dht.readTemperature();
            humidite = dht.readHumidity();
            delay(2000);
        }
    }
}

Voilà, il ne vous suffit plus que de reverser chaque code dans le bon arduino, et ils fontionneront (je l’espère).

Vous pouvez remplacer/ajouter un ou les capteurs avec un BMP180, qui permet d’obtenir une pression atmosphérique, un tutoriel sur l’utilisation de ce capteur avec l’arduino est disponible ici.

2 Replies to “Station météo sans fil avec arduino”

  1. Bonjour, il s’agissait d’un premier montage après réception de quelques composants, sur la boucle émetteur, maintenant avec plus de recul, je ne ferai plus comme ça
    Dans la boucle loop de l’émetteur, les 27 et 28 lignes permettent de récupérer les valeurs des capteurs. Les lignes 29 – 30 convertissent les valeurs lues en string, puis je concatène en séparant les deux variables par un « / ».
    En relisant ça, c’est vrai que ce n’est vraiment pas joli

Laisser un commentaire