Capteur CO2 et Température
Publié : 28 juin 2015, 17:45
Bonjour à tous
Alors voilà une fois de plus j'ai un soucis ..... Je tente de faire une capteur de CO2 et température/humitidé à base de MQ135 et DHT11
Mais voilà ..... rien ne se passe dans domoticz ! alors que sur le moniteur série j'ai bien toutes les valeurs qui s'affichent .... je ne comprend pas .
voici mon code il doit y avoir quelque chose qui cloche ( Désolé je suis débutant en arduino ... ) je me suis inspiré en grande partie du travail de epierre.
Merci d'avance
Alors voilà une fois de plus j'ai un soucis ..... Je tente de faire une capteur de CO2 et température/humitidé à base de MQ135 et DHT11
Mais voilà ..... rien ne se passe dans domoticz ! alors que sur le moniteur série j'ai bien toutes les valeurs qui s'affichent .... je ne comprend pas .
voici mon code il doit y avoir quelque chose qui cloche ( Désolé je suis débutant en arduino ... ) je me suis inspiré en grande partie du travail de epierre.
Code : Tout sélectionner
/*
Arduino MQ135
connect the sensor as follows :
A H A >>> 5V
B >>> A0
H >>> GND
B >>> 10K ohm >>> GND
Contribution: epierre Modification DHT11: Zang
Based on David Gironi http://davidegironi.blogspot.fr/2014/01/cheap-co2-meter-using-mq135-sensor-with.html
http://skylink.dl.sourceforge.net/project/davidegironi/avr-lib/avr_lib_mq135_01.zip
*/
#include <SPI.h>
#include <MySensor.h>
#include <Wire.h>
#include <DHT.h>
#define CHILD_ID_AIQ 0
#define CHILD_ID_HUM 1
#define CHILD_ID_TEMP 2
#define AIQ_SENSOR_ANALOG_PIN 0
#define HUMIDITY_SENSOR_DIGITAL_PIN 3
#define MQ135_DEFAULTPPM 399 //default ppm of CO2 for calibration
#define MQ135_DEFAULTRO 68550 //default Ro for MQ135_DEFAULTPPM ppm of CO2
#define MQ135_SCALINGFACTOR 116.6020682 //CO2 gas value
#define MQ135_EXPONENT -2.769034857 //CO2 gas value
#define MQ135_MAXRSRO 2.428 //for CO2
#define MQ135_MINRSRO 0.358 //for CO2
unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in seconds)
MySensor gw;
MyMessage msgAiq(CHILD_ID_AIQ, V_VAR1);
MyMessage msgHum(CHILD_ID_HUM, V_HUM);
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
//VARIABLES
//float Ro = 10000.0; // this has to be tuned 10K Ohm
float mq135_ro = 10000.0; // this has to be tuned 10K Ohm
int val = 0; // variable to store the value coming from the sensor
float valAIQ =0.0;
float lastAIQ =0.0;
DHT dht;
float lastTemp;
float lastHum;
boolean metric = true;
void setup()
{
gw.begin();
dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);
// Send the sketch version information to the gateway and Controller
gw.sendSketchInfo("Air Quality DHT11", "1.0");
// Register all sensors to gateway (they will be created as child devices)
gw.present(CHILD_ID_AIQ, S_AIR_QUALITY);
gw.present(CHILD_ID_HUM, S_HUM);
gw.present(CHILD_ID_TEMP, S_TEMP);
metric = gw.getConfig().isMetric;
}
/*
* get the calibrated ro based upon read resistance, and a know ppm
*/
long mq135_getro(long resvalue, double ppm) {
return (long)(resvalue * exp( log(MQ135_SCALINGFACTOR/ppm) / MQ135_EXPONENT ));
}
/*
* get the ppm concentration
*/
double mq135_getppm(long resvalue, long ro) {
double ret = 0;
double validinterval = 0;
validinterval = resvalue/(double)ro;
if(validinterval<MQ135_MAXRSRO && validinterval>MQ135_MINRSRO) {
ret = (double)MQ135_SCALINGFACTOR * pow( ((double)resvalue/ro), MQ135_EXPONENT);
}
return ret;
}
void loop()
{
uint16_t valr = analogRead(AIQ_SENSOR_ANALOG_PIN);// Get AIQ value
Serial.println(val);
uint16_t val = ((float)22000*(1023-valr)/valr);
mq135_ro = mq135_getro(val, MQ135_DEFAULTPPM);
//convert to ppm (using default ro)
valAIQ = mq135_getppm(val, MQ135_DEFAULTRO);
Serial.print ( "Vrl / Rs / ratio:");
Serial.print ( val);
Serial.print ( " / ");
Serial.print ( mq135_ro);
Serial.print ( " / ");
Serial.print ( valAIQ);
if (valAIQ != lastAIQ) {
gw.send(msgAiq.set((int)ceil(valAIQ)));
lastAIQ = ceil(valAIQ);
}
delay(dht.getMinimumSamplingPeriod());
float temperature = dht.getTemperature();
if (isnan(temperature)) {
Serial.println("Failed reading temperature from DHT");
} else if (temperature != lastTemp) {
lastTemp = temperature;
gw.send(msgTemp.set(temperature, 1));
Serial.print("T: ");
Serial.println(temperature);
}
float humidity = dht.getHumidity();
if (isnan(humidity)) {
Serial.println("Failed reading humidity from DHT");
} else if (humidity != lastHum) {
lastHum = humidity;
gw.send(msgHum.set(humidity, 1));
Serial.print("H: ");
Serial.println(humidity);
}
// Power down the radio. Note that the radio will get powered back up
// on the next write() call.
gw.sleep(SLEEP_TIME); //sleep for: sleepTime
}
/***************************** MQGetPercentage **********************************
Input: rs_ro_ratio - Rs divided by Ro
pcurve - pointer to the curve of the target gas
Output: ppm of the target gas
Remarks: By using the slope and a point of the line. The x(logarithmic value of ppm)
of the line could be derived if y(rs_ro_ratio) is provided. As it is a
logarithmic coordinate, power of 10 is used to convert the result to non-logarithmic
value.
************************************************************************************/
int MQGetPercentage(float rs_ro_ratio, float ro, float *pcurve)
{
return (double)(pcurve[0] * pow(((double)rs_ro_ratio/ro), pcurve[1]));
}