Hier nun die Fortsetzung meines alten 4 Sensoren Sketches. Nun ist der MH-Z19 für die CO2 Messung integriert und ich habe außerdem noch eine Steuerung für eine LED-Warnung eingebaut. Der Sketch funktioniert genau so mit dem MH-Z21.
//Sens4Sketch (Motion, Temperature, Humidity, CO2) //v0.13 LED blink co2 //v0.12 MH-Z19 integration //v0.11 Motion corrected //v0.10 ---- installation co2 value specification outside----under construction //v0.9 Autoset r0 off, vaule < 400 possible!!!! //v0.8 Corr. Lib von rstoica (set r0, correction) impl //v0.7 set r0 to eeprom //v0.6 SetR0-Button //v0.5 Motion //v0.4 autosetr0 if co2<400 //v0.3 api 2.0, redesign //v0.2 CorrectedRZero basis for calculating r0 //G. Krocker K.-H. Wind et. al. ++++JH //Caution: The Sketch erorder an amended mq135.h Library #define MY_DEBUG // Enables debug messages in the serial log #define MY_RADIO_NRF24 //#define MY_REPEATER_FEATURE // Enables repeater functionality for a radio node #include <SPI.h> #include <MySensors.h> #include "DHT.h" //---------------------------------------------------------------------------- // Timer unsigned long SLEEP_TIME = 30*1000; // Sleep time between reads (in milliseconds) //----------------------------------------------------------------------------- //MOTION #define DIGITAL_INPUT_SENSOR 3 // The digital input you attached your motion sensor. (Only 2 and 3 generates interrupt!) #define INTERRUPT DIGITAL_INPUT_SENSOR-3 // Usually the interrupt = pin -2 (on uno/nano anyway) #define CHILD_ID_MOTION 16 // Id of the sensor child MyMessage msgMotion(CHILD_ID_MOTION, V_TRIPPED); //----------------------------------------------------------------------------- // DHT22 #define CHILD_ID_HUM 0 #define CHILD_ID_TEMP 1 #define DHTPIN 4 // what digital pin we're connected to //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE); float lastTemp; float lastHum; boolean metric = true; MyMessage msgHum(CHILD_ID_HUM, V_HUM); MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); //------------------------------------------------------------------------- #define CHILD_ID_AIQ 0 #define AIQ_SENSOR_ANALOG_PIN 5 float valAIQ =0.0; float lastAIQ =0.0; MyMessage msg(CHILD_ID_AIQ, V_LEVEL); MyMessage msg2(CHILD_ID_AIQ, V_UNIT_PREFIX); //----------------------------------------------------------------------------- void setup() { //--------------------------------------------------------------------- dht.begin(); pinMode(DIGITAL_INPUT_SENSOR, INPUT); pinMode(7, OUTPUT); } //----------------------------------------------------------------------------- void presentation(){ sendSketchInfo("Sens4", "v0.13"); present(CHILD_ID_TEMP, S_TEMP); present(CHILD_ID_HUM, S_HUM); present(CHILD_ID_MOTION, S_MOTION); present(CHILD_ID_AIQ, S_AIR_QUALITY); //-------------------------------------------------------------------- } void loop(){ //----------------------------------------------------------------------------- //TEMP_FEUCHTE float temperature = dht.readTemperature(); send(msgTemp.set(temperature, 1)); Serial.print("T: "); Serial.println(temperature); float humidity = dht.readHumidity(); send(msgHum.set(humidity, 1)); Serial.print("H: "); Serial.println(humidity); //----------------------------------------------------------------------------- //CO2 unsigned long duration = pulseIn(AIQ_SENSOR_ANALOG_PIN, HIGH, 2000000); //Serial.print(duration/1000); Serial.println(" ms "); //from datasheet //CO2 ppm = 2000 * (Th - 2ms) / (Th + Tl - 4ms) // given Tl + Th = 1004 // Tl = 1004 - Th // = 2000 * (Th - 2ms) / (Th + 1004 - Th -4ms) // = 2000 * (Th - 2ms) / 1000 = 2 * (Th - 2ms) long co2ppm = 5 * ((duration/1000) - 2); Serial.print(co2ppm); send(msg.set(co2ppm,1)); if (co2ppm>1000){ digitalWrite(7, HIGH); // turn the LED on (HIGH is the voltage level) } if (co2ppm<550) { digitalWrite(7, LOW); } //----------------------------------------------------------------------------- //Read digital motion value boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; Serial.print("Motion: "); Serial.println(tripped); send(msgMotion.set(tripped?"1":"0")); //----------------------------------------------------------------------------- wait(SLEEP_TIME); } //---------------------------------------------------------------------------