+/* SFE_BMP180 library example sketch
+
+This sketch shows how to use the SFE_BMP180 library to read the
+Bosch BMP180 barometric pressure sensor.
+https://www.sparkfun.com/products/11824
+
+Like most pressure sensors, the BMP180 measures absolute pressure.
+This is the actual ambient pressure seen by the device, which will
+vary with both altitude and weather.
+
+Before taking a pressure reading you must take a temparture reading.
+This is done with startTemperature() and getTemperature().
+The result is in degrees C.
+
+Once you have a temperature reading, you can take a pressure reading.
+This is done with startPressure() and getPressure().
+The result is in millibar (mb) aka hectopascals (hPa).
+
+If you'll be monitoring weather patterns, you will probably want to
+remove the effects of altitude. This will produce readings that can
+be compared to the published pressure readings from other locations.
+To do this, use the sealevel() function. You will need to provide
+the known altitude at which the pressure was measured.
+
+If you want to measure altitude, you will need to know the pressure
+at a baseline altitude. This can be average sealevel pressure, or
+a previous pressure reading at your altitude, in which case
+subsequent altitude readings will be + or - the initial baseline.
+This is done with the altitude() function.
+
+Hardware connections:
+
+- (GND) to GND
++ (VDD) to 3.3V
+
+(WARNING: do not connect + to 5V or the sensor will be damaged!)
+
+You will also need to connect the I2C pins (SCL and SDA) to your
+Arduino. The pins are different on different Arduinos:
+
+Any Arduino pins labeled: SDA SCL
+Uno, Redboard, Pro: A4 A5
+Mega2560, Due: 20 21
+Leonardo: 2 3
+
+Leave the IO (VDDIO) pin unconnected. This pin is for connecting
+the BMP180 to systems with lower logic levels such as 1.8V
+
+Have fun! -Your friends at SparkFun.
+
+The SFE_BMP180 library uses floating-point equations developed by the
+Weather Station Data Logger project: http://wmrx00.sourceforge.net/
+
+Our example code uses the "beerware" license. You can do anything
+you like with this code. No really, anything. If you find it useful,
+buy me a beer someday.
+
+V10 Mike Grusin, SparkFun Electronics 10/24/2013
+*/
+
+// Your sketch must #include this library, and the Wire library.
+// (Wire is a standard library included with Arduino.):
+
+#include <SFE_BMP180.h>
+#include <Wire.h>
+#include "DHT.h"
+
+// You will need to create an SFE_BMP180 object, here called "pressure":
+
+SFE_BMP180 pressure;
+
+// DHT object for humidity sensor
+DHT dht;
+
+#define CO2_PIN A1
+#define DHT_PIN 4
+#define GAS_PIN A0
+#define START_DELAY 20000
+#define DELAY 50000
+
+byte HasBaro;
+
+#define READ_SAMPLE_INTERVAL 50
+#define READ_SAMPLE_TIMES 5
+
+#define MQ135_RES 1000
+
+float MQRead(int mq_pin)
+{
+
+ int i;
+ float rs=0;
+ float rr;
+
+ for (i=0;i<READ_SAMPLE_TIMES;i++) {
+ rr = analogRead(mq_pin);
+ rs += rr;
+ delay(READ_SAMPLE_INTERVAL);
+ }
+
+ rs = rs/READ_SAMPLE_TIMES;
+ return rs;
+
+}
+
+/// Parameters to model temperature and humidity dependence
+
+#define CORA 0.00035
+#define CORB 0.02718
+#define CORC 1.39538
+#define CORD 0.0018
+
+float getMQ135CorrectionFactor(float t, float h) {
+ return CORA * t * t - CORB * t + CORC - (h-33.)*CORD;
+}
+
+#define RZERO 25300
+#define PARA 116.6020682
+#define PARB 2.769034857
+
+float getMQ135ppm(float Resistance) {
+ return PARA * pow((Resistance/RZERO), -PARB);
+}
+
+void setup()
+{
+ delay(START_DELAY);
+
+ Serial1.begin(57600);
+ Serial1.println("START");
+
+ // Initialize the sensor (it is important to get calibration values stored on the device).
+
+ if (pressure.begin()) {
+ Serial1.println("BMP180 init success");
+ HasBaro = 1;
+ } else {
+ Serial1.println("BMP180 init fail\n\n");
+ HasBaro = 0;
+ }
+
+ dht.setup(DHT_PIN);
+
+ pinMode(GAS_PIN,INPUT);
+ pinMode(CO2_PIN,INPUT);
+
+ digitalWrite(GAS_PIN, LOW);
+ digitalWrite(CO2_PIN, LOW);
+}
+
+void loop()
+{
+ char status;
+ double T,P;
+ double DHT_T,DHT_H;
+ int DHTStatus;
+ int Gas;
+
+ double LastTemp;
+ byte GotTemperature,GotPressure;
+
+ // Loop here getting pressure readings every 60 seconds.
+
+ GotTemperature = 0;
+ GotPressure = 0;
+
+ if (HasBaro) {
+
+ status = pressure.startTemperature();
+ if (status != 0) {
+ // Wait for the measurement to complete:
+ delay(status);
+
+ // Retrieve the completed temperature measurement:
+ // Note that the measurement is stored in the variable T.
+ // Function returns 1 if successful, 0 if failure.
+
+ status = pressure.getTemperature(T);
+ if (status = !0) {
+ LastTemp=T;
+ GotTemperature=1;
+ } else {
+ Serial1.println("ERROR:TYPE=BMP180,MESSAGE=FAILED MEASURE TEMPERATURE\n");
+ }
+ } else {
+ Serial1.println("ERROR:TYPE=BMP180,MESSAGE=FAILED START TEMPERATURE MEASUREMENT\n");
+ }
+
+ // Start a pressure measurement:
+ // The parameter is the oversampling setting, from 0 to 3 (highest res, longest wait).
+ // If request is successful, the number of ms to wait is returned.
+ // If request is unsuccessful, 0 is returned.
+
+ status = pressure.startPressure(3);
+ if (status != 0) {
+ // Wait for the measurement to complete:
+ delay(status);
+
+ // Retrieve the completed pressure measurement:
+ // Note that the measurement is stored in the variable P.
+ // Note also that the function requires the previous temperature measurement (T).
+ // (If temperature is stable, you can do one temperature measurement for a number of pressure measurements.)
+ // Function returns 1 if successful, 0 if failure.
+
+ status = pressure.getPressure(P,LastTemp);
+ if (status != 0) {
+ // Print out the measurement:
+ GotPressure=1;
+
+ } else {
+ Serial1.println("ERROR:TYPE=BMP180,MESSAGE=FAILED MEASURE PRESSURE\n");
+ }
+ } else {
+ Serial1.println("ERROR:TYPE=BMP180,MESSAGE=FAILED START PRESSURE MEASUREMENT\n");
+ }
+ if (GotPressure || GotTemperature) {
+ Serial1.print("SENSOR:TYPE=BMP180");
+ if (GotPressure) { Serial1.print(",PRESSURE="); Serial1.print(P); }
+ if (GotTemperature) { Serial1.print(",TEMPERATURE="); Serial1.print(T); }
+ Serial1.println();
+ }
+ }
+
+ delay(dht.getMinimumSamplingPeriod());
+
+ DHT_H = dht.getHumidity();
+ DHT_T = dht.getTemperature();
+
+ DHTStatus=dht.getStatus();
+
+ if (DHTStatus == 0) {
+ Serial1.print("SENSOR:TYPE=DHT22,TEMPERATURE=");
+ Serial1.print(DHT_T);
+ Serial1.print(",HUMIDITY=");
+ Serial1.println(DHT_H);
+ } else {
+ Serial1.print("ERROR:TYPE=DHT22,MESSAGE=");
+ Serial1.println(dht.getStatusString());
+ }
+
+ Gas = MQRead(GAS_PIN);
+
+ Serial1.print("SENSOR:TYPE=MQ4,VALUE=");
+ Serial1.println(Gas);
+
+ float MQ135_Resistance;
+ float CO2_raw;
+ float CO2_ppm;
+
+ float CO2_resistance;
+
+ CO2_raw = MQRead(CO2_PIN);
+ Serial1.print("DEBUG:RAW=");
+ Serial1.println(CO2_raw);
+
+ MQ135_Resistance=MQ135_RES*(1023./CO2_raw-1);
+
+ Serial1.print("DEBUG:RESISTANCE=");
+ Serial1.println(MQ135_Resistance);
+
+ MQ135_Resistance=MQ135_Resistance/getMQ135CorrectionFactor(DHT_T,DHT_H);
+ Serial1.print("DEBUG:CORR_RESISTANCE=");
+ Serial1.println(MQ135_Resistance);
+
+ CO2_ppm = getMQ135ppm(MQ135_Resistance);
+
+ Serial1.print("SENSOR:TYPE=MQ135,VALUE=");
+ Serial1.println(CO2_ppm);
+
+ delay(DELAY); // Pause for 50 seconds.
+}
+