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() );
}