Image entête

Station météo interne

Le code

  /* Station météo interne comprenant plusieurs capteurs
   * Alimentation en continue par l'USB de l'Arduino Nano
   * Capteurs :
   *    DHT22             Température, Humidité                 Vin : 5 V
   *    MQ135             Pollution atmosphérique               Vin : 5 V
   *    Sharp GP2Y1010AU  Particules                            Vin : 5 V
   * 
   * Transmission via ZigBee et module XBee                     Vin : 3,3 V
   * 
   * Horloge RTC DS3231                                         Vin : 3,3 V ou 5 V    protocole I2C    adresse 0x68
   * 
   * Ecran OLED 128x64 monochrome I2C                           Vin : 3,3 V           protocole I2C    adresse 0x3C
   * 
   *    
  */

#include <DHT.h>            // pour le module DHT22               library Adafruit https://github.com/adafruit/DHT-sensor-library
#include <Wire.h>           // pour le protocol I2C               library intégrée https://www.arduino.cc/en/Reference/Wire
#include <uRTCLib.h>        // pour le module RTC3231             library uRTCLib https://github.com/Naguissa/uRTCLib
#include <MQ135.h>          // pour le module MQ135               library de GeorgK https://github.com/GeorgK/MQ135
#include <SharpDust.h>      // pour le capteur Sharp GP2Y1010AU   library de chiknhed https://github.com/chiknhed/sharp_dust_gp2y1010au
#include <U8glib.h>         // pour l'affichage OLED              library https://github.com/olikraus/u8glib
#include <SoftwareSerial.h> // pour XBee                          library intégrée https://www.arduino.cc/en/Reference/SoftwareSerial


//définition des variables et modules
// DHT22
DHT dht(3, DHT22);          // Pin D3 pour le capteur DHT22 et type DHT 22 (AM2302)

//RTC DS3231
uRTCLib rtcDS3231;          // définit le module rtcDS3231

// MQ135
const byte mq135Pin = 0;    // Pin A0 sur lequel est branché de MQ135
MQ135 gasSensor = MQ135(mq135Pin);  // Initialise l'objet MQ135 sur le Pin spécifié

// XBee en sortie série "software"
SoftwareSerial xbee(9,8); // pin D9 RX à DOUT de Xbee, pin D8 TX à DIN de Xbee

// MicroOLED
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);  // I2C / TWI

// GP2Y1010AU
// pin 1 :

// ============================ SETUP ===========================

void setup() {

// -------------- XBee SETUP -----------------  
  xbee.begin(9600); // initialise le port serie XBee

// -------------- DHT22 SETUP ------------------
  dht.begin();
  

// ----------- RTC SETUP ------------ Basé sur les examples de la library uRTCLib
/* Branchementen I2C
     SDA : broche A4 sur Arduino Nano
     SCL : broche A5 sur Arduino Nano
*/ 
// rien à faire

// -------------- MQ135 SETUP ---------------------
// Rien à faire sauf pour qualibrer le MQ135 au début
//  Serial.begin(9600); 
//  float rzero = gasSensor.getRZero();
//  Serial.println(rzero);  // Valeur à reporter ligne 27 du fichier mq135.h après 48h de préchauffage

// ---------- Capteur de poussière SETUP -------
  SharpDust.begin(2, 6); // Tension LED sur Digital pin D2 et Mesure sur Analog pin A6

// -------------- OLED Display SETUP ----------------
// flip screen, if required
  // u8g.setRot180();
  
  // assign default color value
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(255);     // white
  }
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(3);         // max intensity
  }
  else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1);         // pixel on
  }
  else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
    u8g.setHiColorByRGB(255,255,255);
  }
  
} // END OF SETUP


void loop() {


 // Delay between measurements.
  delay(2000);

  // transmission des données sur le XBee au format CSV (,)
  
  // transmet la date/heure au format DD/MM/YYYY,HH:MM:SS
  rtcDS3231.refresh(); // rafaîchit la lecture du module RTC
  byte jour = rtcDS3231.day();
  byte mois = rtcDS3231.month();
  byte an = rtcDS3231.year();
  byte heure = rtcDS3231.hour();
  byte minutes = rtcDS3231.minute();
  byte secondes = rtcDS3231.second();
  if (jour < 10) xbee.print('0');
  xbee.print(jour);
  xbee.print('/');
  if (mois < 10) xbee.print('0');
  xbee.print(mois);
  xbee.print("/20");
  // if (an < 10) xbee.print('0'); // pas nécessaire au dela de 2010
  xbee.print(an);
  xbee.print(',');
  if (heure < 10) xbee.print('0');
  xbee.print(heure);
  xbee.print(':');
  if (minutes < 10) xbee.print('0');
  xbee.print(minutes);
  xbee.print(':');
  if (secondes < 10) xbee.print('0');
  xbee.print(secondes);
  xbee.print(',');

  // transmet température, humitité du DHT22 avec 1 décimale
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  xbee.print(String(t, 1));
  xbee.print(',');
  xbee.print(String(h, 1));
  xbee.print(',');
  
  // transmet les données du MQ135 en ppm et mesure analogique
  float ppm = gasSensor.getPPM();
  int analog = analogRead(mq135Pin);
  xbee.print(String(analog));
  xbee.print(',');
  xbee.print(String(ppm, 2));
  xbee.print(',');

  // transmet les données du GP2Y1010AU
  float dust = SharpDust.measure();
  if (dust < 0) dust = 0;   // pour supprimer les valeurs négatives proches de  zéro
  xbee.println(String(dust,2));

  // affichage sur l'écran
  String affichage_temp = "";
  u8g.firstPage();  
  do {
    // affichage du titre de l'écran et trace un ligne
    u8g.setFont(u8g_font_unifont);
    u8g.drawStr( 0, 16, "Qualit" "\xe9" " de l'air");
    u8g.drawHLine(0, 18, 128);
    // affichage des informations fixes et de la date en petite police de caractères
    u8g.setFont(u8g_font_6x10);
    affichage_temp = String(jour) + "/" + String(mois) + "/" + String(an);
    u8g.setPrintPos( 0, 32);
    u8g.print(affichage_temp);
    u8g.drawStr( 0, 47, "T :");
    u8g.drawStr( 0, 62, "H :");
    u8g.drawStr( 64, 62, "dust:");
    u8g.drawStr( 64, 47, "ppm :");
    u8g.drawStr( 64, 32, "CO2 :");
    // affichage des mesures en grosse police de caractères
    u8g.setFont(u8g_font_unifont);
    affichage_temp = String(t, 1);   // température
    u8g.setPrintPos( 22, 49);
    u8g.print(affichage_temp);
    affichage_temp = String(h, 1);   // hygrométrie
    u8g.setPrintPos( 22, 64);
    u8g.print(affichage_temp);
    affichage_temp = String(analog); // ppm
    u8g.setPrintPos( 96, 49);
    u8g.print(affichage_temp);
    affichage_temp = String(ppm, 0); // CO2
    u8g.setPrintPos( 96, 34);
    u8g.print(affichage_temp);
    affichage_temp = String(dust,2);  // poussières
    u8g.setPrintPos( 96, 64);
    u8g.print(affichage_temp);
  } while( u8g.nextPage() );
}