AvrIO  1.4.5
Bibliothèque C modulaire pour ATMEL AVR
sensor/mq135/demo/demo_sensor_mq135.c

Demo capteur de témpérature et humidité HIH6130 et MQ135 Mesure la température et l'humidité et du taux de CO² toutes les secondes et affiche le résultat sur le LCD.

#define __ASSERT_USE_STDERR
#include <stdio.h>
#include <stdlib.h>
#include <avrio/assert.h>
#include <avrio/led.h>
#include <avrio/delay.h>
#include <avrio/hih6130.h>
#include <avrio/lcd.h>
#include <avrio/mq135.h>
/* constants ================================================================ */
#define MQ135_ADC 0 // Voie ADC du capteur
#define MQ135_RL 4.53 // RL en kilo-Ohms
#define MQ135_R0 75.61 // Résistance R0 à l'étalonnage
#define ATMO_CO2 400.23 // Teneur globale en CO² à l'étalonnage
/* private variables ======================================================== */
static xAdcSensor xMyMq135;
static xAdcSensorSetting xMyMq135Setting;
/*
* Etalonnage de mon capteur analogique MQ135
*/
static xMq135Calibration xMyMq135Calibration =
MQ135_CALIBRATION (MQ135_RL, MQ135_R0, ATMO_CO2);
/* main ===================================================================== */
int
main (void) {
/* mes: Variable structure pour stocker les mesures
* - température en dixième de degré (mes.iTemp)
* - humidité en dixième de %RH (mes.iHum)
*/
static xHih6130Data mes;
static uint16_t usRaw;
static double dGasPpm, dGasCorrPpm;
static double dTemp, dHum;
vLedInit(); // Le temps d'allumage de LED_LED1 correspondra au temps de mesure
/*
* Init du bus I2C en mode maître à 400 kHz utilisé par le HIH et le LCD
*/
eTwiSetSpeed (400);
/*
* Init LCD, c'est la sortie standard et d'erreur
* Dans le cas de la carte XNODE, l'afficheur est connecté par I2C
*/
ucLcdBacklightSet (32); // 0 à 63
ucLcdContrastSet (16); // 0 à 31
stdout = &xLcd;
stderr = &xLcd;
/*
* Init ADC
*/
// Horloge ADC à 2 MHz, une conversion prend 6.5 us
// On utilise la tension d'alimentation par connexion interne
/*
* Init capteur HIH6130
*/
ret = eHih6130Init (0);
/*
* Init du contexte du capteur MQ135
* Le capteur est un capteur MQ135 connecté sur ADC0
* la valeur mesurée est moyennée sur 16 termes
*/
vMq135Init (&xMyMq135Setting, &xMyMq135Calibration);
vAdcSensorInit (&xMyMq135, &xMyMq135Setting, ADC_SENSOR_NLINEAR, MQ135_ADC, 16);
for (;;) {
// Démarre la mesure (la mesure dure ~ 40 ms)
ret = eHih6130Start();
do { // Boucle d'attente de fin de mesure
// Lecture
ret = eHih6130Read (&mes);
// Vérif absence d'erreur
}
while (ret == HIH6130_BUSY);
dTemp = mes.iTemp / 10.0;
dHum = mes.iHum / 10.0;
usRaw = usAdcSensorGetRaw (&xMyMq135);
dGasPpm = dMq135RawToPPM (&xMyMq135, usRaw);
dGasCorrPpm = dMq135RawToCorrectedPPM (&xMyMq135, usRaw, dTemp, dHum);
printf ("T=%.1f H=%.1f\nP=%.1f C=%.1f", dTemp, dHum, dGasPpm, dGasCorrPpm);
delay_ms (1000);
}
return 0;
}
/* ========================================================================== */