Les bus I2C et SPI ne sont pas aux mêmes endroits sur les cartes UNO et MEGA
La carte UNO est un peu juste en mémoire pour le code complet, utiliser une MEGA de préférence.
![]() |
![]() |
// CAPTEUR QUALITE AIR MQ-135 + DHT11 + SD + ECRAN LCD + RTC
#include <SPI.h>
#include <SD.h>
#define enteteCsv "Date;Time;RZero;CorrectedRZero;ppm;corectedPPM;Temperature;RessentiTemp;Humidity"
#define sdCardSelect 10
// Variables SD Card
SdVolume VolumeCarteSD;
uint32_t volumesize;
File CSVFile;
char nomDuFichier[16] = {0};
#include <DHT.h>
#define DHTpin 4 // D4
#define DHTtype DHT22
DHT dht(DHTpin, DHTtype);
#include <MQ135.h>
#define MQ135pin A0
MQ135 gasSensor = MQ135(MQ135pin);
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
#include <RTClib.h>
RTC_DS1307 rtc;
String jour, heure, heureLCD, heureCSV;
void setup() {
Serial.begin(9600);
initLCD();
initDHT();
float tauxHumidite = dht.readHumidity(); // Lecture du taux d'humidit� (en %)
float temperatureEnCelsius = dht.readTemperature(); // Lecture de la temp�rature, exprim�e en degr�s Celsius
initRTC();
GetDateHeure(false);
initSD();
delay(2000);
lcd.clear();
lcd.setCursor(1,1);
lcd.print("CAPTEUR MQ-135");
lcd.setCursor(1,3);
lcd.print("File :");
lcd.print(String(nomDuFichier));
delay(2000);
lcd.clear();
Serial.println("Date Time RZero CorrectedRZero ppm/100 corectedPPM/100 Temperature RessentiTemp Humidity");
}
void loop() {
// Lecture des donn�es
float tauxHumidite = dht.readHumidity(); // Lecture du taux d'humidite (en %)
float temperatureEnCelsius = dht.readTemperature(); // Lecture de la temperature, exprimee en degres Celsius
float temperatureRessentieEnCelsius = dht.computeHeatIndex(temperatureEnCelsius, tauxHumidite, false);
lcd.setCursor(4,2);
lcd.print("Temp: ");
lcd.print(temperatureEnCelsius);
lcd.print(F(" "));
lcd.write((byte)0xDF);
lcd.print(F("C "));
lcd.setCursor(4,3);
lcd.print(" Hum: ");
lcd.print(tauxHumidite);
lcd.print(" % ");
// mesure = analogRead(MQ135pin);
float RZero = gasSensor.getRZero();
float correctedRZero = gasSensor.getCorrectedRZero(temperatureEnCelsius, tauxHumidite);
float resistance = gasSensor.getResistance();
float ppm = gasSensor.getPPM();
float correctedPPM = gasSensor.getCorrectedPPM(temperatureEnCelsius, tauxHumidite);
//Mise a jour de l'heure
GetDateHeure(false);
Serial.print(jour);
Serial.print (" ");
Serial.print(heure);
Serial.print (" ");
Serial.print(RZero);
Serial.print (" ");
Serial.print(correctedRZero);
Serial.print (" ");
Serial.print(ppm/100);
Serial.print (" ");
Serial.print(correctedPPM/100);
Serial.print (" ");
Serial.print(temperatureEnCelsius);
Serial.print (" ");
Serial.print(temperatureRessentieEnCelsius);
Serial.print (" ");
Serial.print(tauxHumidite);
Serial.println("");
lcd.setCursor(4,1);
lcd.print("Qual: ");
lcd.print((int)correctedPPM);
lcd.print(" PPM ");
lcd.setCursor(0,0);
if (correctedPPM < 1400 ) {
digitalWrite(7, HIGH);
digitalWrite(6, LOW);
digitalWrite(5, LOW);
digitalWrite(2, LOW);
lcd.print("AIR CORRECT ");
} else {
if (correctedPPM < 2000 ) {
digitalWrite(7, LOW);
digitalWrite(6, HIGH);
digitalWrite(5, LOW);
digitalWrite(2, LOW);
lcd.print("AIR MALSAIN ");
} else {
digitalWrite(7, LOW);
digitalWrite(6, LOW);
digitalWrite(5, HIGH);
digitalWrite(2, HIGH);
lcd.print("ALERTE POLLUTION ");
}
}
//affichage de l'heure sur LCD
GetDateHeure(true);
// Enregistrement de ces donnees sur la carte SD
CSVFile = SD.open(nomDuFichier, FILE_WRITE);
if (CSVFile) {
CSVFile.print(jour);
CSVFile.print(";");
CSVFile.print(heure);
CSVFile.print(";");
CSVFile.print(RZero);
CSVFile.print(";");
CSVFile.print(correctedRZero);
CSVFile.print(";");
CSVFile.print(ppm);
CSVFile.print(";");
CSVFile.print(correctedPPM);
CSVFile.print(";");
CSVFile.print(temperatureEnCelsius);
CSVFile.print(";");
CSVFile.print(temperatureRessentieEnCelsius);
CSVFile.print(";");
CSVFile.println(tauxHumidite);
CSVFile.close(); // L'enregistrement des donnees se fait au moment de la cloture du fichier
} else {
Serial.println(F(" ==> Erreur lors de la tentative d'ouverture du fichier en ecriture, sur la carte SD"));
}
delay(10000);
// lcd.clear();
}
void initRTC() {
lcd.setCursor(2,2);
lcd.print(" RTC: ");
if (! rtc.begin()) {
lcd.print(" Not available !");
Serial.println("Le module RTC non disponible");
while (1); // Attente RESET
} else {
rtc.writeSqwPinMode(DS1307_ON);
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Date du PC
}
lcd.print("Ok");
}
void initLCD() {
lcd.begin(); // initialize the lcd
lcd.backlight();
lcd.noBacklight();
lcd.print(" AIR QUALITY METER");
}
void initDHT(){
dht.begin();
lcd.setCursor(2,1);
lcd.print(" DHT: Ok");
}
void initSD() {
lcd.setCursor(3,2);
lcd.print(" SD: ");
// Etape 1 : test la presence d'une carte raccordee ou non
if (SD.begin(sdCardSelect)) {
if (!CarteSD.init(SPI_HALF_SPEED, sdCardSelect)) {
Serial.println(F("Echec lors de l'initialisation. Essayez de jeter un coup d'oeil a : "));
Serial.println(F("- est-ce que la carte SD est bien inseree dans le lecteur ?"));
Serial.println(F("- est-ce que vos branchements electriques sont corrects ?"));
Serial.println(F("- est-ce que le 'chipSelect' choisi dans le programme correspond bien a celui branche sur l'arduino ? (pin D10, par defaut)"));
Serial.println();
Serial.println(F("Appuyez sur RESET pour relancer le programme, au besoin."));
lcd.print("No SD card");
while (1); // Boucle infinie, arr�t du programme
}
}
// Etape 3 : tentative d'ouverture du volume/de la partition (qui doit �tre en FAT16, ou FAT32), et affichage du format
if (!VolumeCarteSD.init(CarteSD)) {
Serial.println(F("Aucune partition FAT16/FAT32 trouvee."));
Serial.println(F("Verifiez que votre carte SD est bien formatee !"));
lcd.print("No SD partition");
while (1); // Boucle infinie, arr�t du programme
}
// Etape 5 : affichage de la taille du volume, en KB/MB/GB
volumesize = VolumeCarteSD.clusterCount() * VolumeCarteSD.blocksPerCluster();
volumesize = volumesize / 2; // Nota : les blocs d'une carte SD font toujours 512 octets (il faut donc 2 blocs pour faire 1KB)
// Etape 6 : suppression du fichier 'nomDuFichier' si existe deja
String newFileName;
newFileName = "D" + heureCSV + ".CSV";
newFileName.toCharArray(nomDuFichier, 16);
if (SD.exists(nomDuFichier)) {
if(!SD.remove(nomDuFichier)) {
Serial.println(F("Echec de suppression du fichier present sur la SD card !"));
lcd.print("Unable to delete");
while (1); // Boucle infinie (arret du programme)
}
}
// Etape 7 : Ecriture de donnaes dans le fichier 'nomDuFichier'
CSVFile = SD.open(nomDuFichier, FILE_WRITE);
if (CSVFile) {
CSVFile.println( enteteCsv ); // Ecriture dans le fichier
CSVFile.close(); // Fermeture du fichier
} else {
Serial.print(F("Echec d'ouverture en ecriture, pour le fichier '"));
Serial.print(nomDuFichier);
Serial.println(F("', sur la carte SD !"));
lcd.print("Unable to open file");
while (1); // Boucle infinie (arret du programme)
}
lcd.print("Ok");
}
void GetDateHeure(bool displayed) {
// Lecture du module RTC
DateTime datetime = rtc.now();
//
jour = "";
jour = String(datetime.year(),DEC) + "-" +
On2Digits(datetime.month())+ "-" +
On2Digits(datetime.day());
// heure
heure = "";
heure = On2Digits(datetime.hour()) + ":" +
On2Digits(datetime.minute()) + ":" +
On2Digits(datetime.second()) + "";
heureLCD = "";
heureLCD = On2Digits(datetime.hour()) + "H" +
On2Digits(datetime.minute()) + "";
heureCSV = "";
heureCSV = On2Digits(datetime.hour()) +
On2Digits(datetime.minute()) +
On2Digits(datetime.second()) + "";
//affichage sur l'ecran
if ( displayed ) {
lcd.setCursor(15,0);
lcd.print(heureLCD);
}
}
//permet d'afficher les nombres sur deux chiffres
String On2Digits(byte nombre) {
String retour = "";
if(nombre < 10)
retour = "0";
return retour += String(nombre,DEC);
}