Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Hardware
  3. MH-Z14A CO2 sensor

MH-Z14A CO2 sensor

Scheduled Pinned Locked Moved Hardware
13 Posts 3 Posters 10.0k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • epierreE Offline
    epierreE Offline
    epierre
    Hero Member
    wrote on last edited by
    #3

    @alexsh1 said:

    I am going to convert it into MySensors now

    you have it here:
    https://github.com/empierre/arduino/blob/master/AirQuality-CO2-MH-Z14.ino

    z-wave - Vera -> Domoticz
    rfx - Domoticz <- MyDomoAtHome <- Imperihome
    mysensors -> mysensors-gw -> Domoticz

    alexsh1A 1 Reply Last reply
    0
    • epierreE epierre

      @alexsh1 said:

      I am going to convert it into MySensors now

      you have it here:
      https://github.com/empierre/arduino/blob/master/AirQuality-CO2-MH-Z14.ino

      alexsh1A Offline
      alexsh1A Offline
      alexsh1
      wrote on last edited by
      #4

      @epierre I took your sketch and modified it. The problem is that the formula for CO2 is wrong for 5000ppm sensors. Additionally, I was getting the error in your sketch - MySensors: Unknown/Invalid sensor type (43). Not sure why.

      Anyway, my modification:

      #include <MySensor.h>  
      #include <SPI.h>
      
      #define CHILD_ID 0
      #define CO2_SENSOR_PWM_PIN 2
      
      unsigned long SLEEP_TIME = 30*1000; // Sleep time between reads (in milliseconds)
      
      float valAIQ =0.0;
      float lastAIQ =0.0;
      unsigned long duration;
      long ppm;
      MySensor gw;
      MyMessage msg(CHILD_ID, V_LEVEL);
      
      void setup()  
      {
        gw.begin();
      
        // Send the sketch version information to the gateway and Controller
        gw.sendSketchInfo("AIQ Sensor CO2 MH-Z14A", "1.0");
      
        // Register all sensors to gateway (they will be created as child devices)
        gw.present(CHILD_ID, S_AIR_QUALITY);  
        
        pinMode(CO2_SENSOR_PWM_PIN, INPUT);
         
      }
      
      void loop() { 
      
        while(digitalRead(CO2_SENSOR_PWM_PIN) == HIGH) {;}
        //wait for the pin to go HIGH and measure HIGH time
        duration = pulseIn(CO2_SENSOR_PWM_PIN, HIGH, 2000000);
        ppm = 5000 * ((duration/1000) - 2)/1000;
        Serial.print(ppm);
        if ((ppm != lastAIQ)&&(abs(ppm-lastAIQ)>=10)) {
            gw.send(msg.set((long)ceil(ppm)));
            lastAIQ = ceil(ppm);
        }
        
        gw.sleep(SLEEP_TIME); //sleep for: sleepTime
      }
      
      1 Reply Last reply
      0
      • epierreE Offline
        epierreE Offline
        epierre
        Hero Member
        wrote on last edited by
        #5

        @alexsh1 sorry I don't read chinese, but my datasheet says 2000:
        http://www.futurlec.com/Datasheet/Sensor/MH-Z14.pdf

        are you using an alternate wiring or alternate version (the A at the end for enhanced or revised ?

        z-wave - Vera -&gt; Domoticz
        rfx - Domoticz &lt;- MyDomoAtHome &lt;- Imperihome
        mysensors -&gt; mysensors-gw -&gt; Domoticz

        alexsh1A 1 Reply Last reply
        0
        • epierreE epierre

          @alexsh1 sorry I don't read chinese, but my datasheet says 2000:
          http://www.futurlec.com/Datasheet/Sensor/MH-Z14.pdf

          are you using an alternate wiring or alternate version (the A at the end for enhanced or revised ?

          alexsh1A Offline
          alexsh1A Offline
          alexsh1
          wrote on last edited by
          #6

          @epierre Which sensor do you have? 2000ppm or 5000ppm? For 2000ppm you should use 2000 multiplier. I have 5000ppm, but the formula still gives me 2000 multiplier. Using 5000 multiplier seems to give a correct result.

          I have MH-Z14A 5000ppm. No idea what "A" stands for - there is very little documentation in English.

          epierreE 1 Reply Last reply
          0
          • alexsh1A alexsh1

            @epierre Which sensor do you have? 2000ppm or 5000ppm? For 2000ppm you should use 2000 multiplier. I have 5000ppm, but the formula still gives me 2000 multiplier. Using 5000 multiplier seems to give a correct result.

            I have MH-Z14A 5000ppm. No idea what "A" stands for - there is very little documentation in English.

            epierreE Offline
            epierreE Offline
            epierre
            Hero Member
            wrote on last edited by
            #7

            @alexsh1 so mine is CO-MHZ14, no wiring on the 20+ pins, written on it 0~5000ppm

            z-wave - Vera -&gt; Domoticz
            rfx - Domoticz &lt;- MyDomoAtHome &lt;- Imperihome
            mysensors -&gt; mysensors-gw -&gt; Domoticz

            alexsh1A 1 Reply Last reply
            0
            • epierreE epierre

              @alexsh1 so mine is CO-MHZ14, no wiring on the 20+ pins, written on it 0~5000ppm

              alexsh1A Offline
              alexsh1A Offline
              alexsh1
              wrote on last edited by
              #8

              @epierre In this case you should use 5000 multiplier - please see above my sketch.
              There is a mistake in the datasheet file - it has been written for 2000ppm model.

              Mine has got 20+ pins and it is 0-5000ppm

              1 Reply Last reply
              1
              • B Offline
                B Offline
                banjabi
                wrote on last edited by
                #9

                hi
                this looks quite nice stuff, but how should i wire up the sensor to wemos d1 for example?
                do i have to use the TTL adapter mode on the board by shorting some pins or do i just need to give some power to the sensor and hook the PWM pin to the wemos board somehow?

                and how does this code comapre to these codes?
                https://gist.github.com/igrr/deb7ba7755fcffe0b96e
                https://github.com/ihormelnyk/mh-z19_co2_meter/blob/master/mh-z19_co2_meter.ino

                or should i just get a usb/ttl adapter and use it over python then?
                https://github.com/alpacagh/MHZ14-CO2-Logger

                1 Reply Last reply
                0
                • B Offline
                  B Offline
                  banjabi
                  wrote on last edited by banjabi
                  #10

                  well, i got this far that i just soldered some connectors to pins 16-19 and now want to use the wemos board as USB to TTL adapter, so i could use the Co2 logger over python server, but how do i need to connect the Rx and Tx pins?

                  does it have to be like a crossover cable or just normal straight?
                  like Sensor Rx to Wemos Tx + S-Tx to W-Rx or just the regular connection like Rx to Rx and Tx to Tx?

                  edit*
                  lol.... the 16-19 pins maybe doesnt have this somekind of 3.3v query pin and only has 5V input? or Rx&Tx run at 3,3 volts?

                  1 Reply Last reply
                  0
                  • B Offline
                    B Offline
                    banjabi
                    wrote on last edited by
                    #11

                    lol.... so i thought that maybe i could run it like this:
                    https://arduinomania.in.ua/datchik-co2-mh-z14
                    but what is the (T1)PD5/IO5 pin on the wemos board ? D3 or D4? maybe D3 as GPIO0 then???:-S
                    from here:
                    http://www.instructables.com/id/Programming-the-WeMos-Using-Arduino-SoftwareIDE/

                    1 Reply Last reply
                    0
                    • B Offline
                      B Offline
                      banjabi
                      wrote on last edited by banjabi
                      #12

                      ok, so i got it working from the last link, but wonder what does this code do?
                      CO2= int(2000*(duration_h-2)/(duration_h+(1004-duration_h)-4));

                      and i actually changed it to this:
                      CO2=int(5000*(duration_h-2)/(duration_h+(1004-duration_h)-4));
                      (removed the space before "int" too)
                      and this code somehow has "-4" not "-2" as in this forum topic?

                      and it probably calibrates itself on the 1st startup hour and also does this every 24 hours?
                      so wonder if i need to place the sensor in a relatively clean air(on a window?) or it doesnt really matter? and it is of course a bit colder near the window because i also opened it a bit to let more clean air in.......
                      and when i first plugged it in, it started to show something like 495ppm, but then i unplugged it and took it to the window(in another room), and it then started from 1375ppm and has now been dropped down to 900....
                      so i wonder why did it first show 495, but then 1375 suddenly.....

                      1 Reply Last reply
                      0
                      • B Offline
                        B Offline
                        banjabi
                        wrote on last edited by banjabi
                        #13

                        nice...
                        i got this reset stack now:

                        CO2 level: -10 ppm

                        Soft WDT reset

                        ctx: cont
                        sp: 3ffef1f0 end: 3ffef3d0 offset: 01b0

                        stack>>>
                        3ffef3a0: 00000000 00000000 00000001 40202281
                        3ffef3b0: 3fffdad0 00000000 3ffee39c 402022ac
                        3ffef3c0: feefeffe feefeffe 3ffee3b0 40100114
                        <<<stack<<<
                        ?⸮⸮⸮⸮DH⸮⸮⸮CO2 level: 395 ppm
                        CO2 level: 395 ppm
                        CO2 level: -10 ppm
                        CO2 level: 405 ppm
                        CO2 level: 405 ppm
                        ...
                        CO2 level: 1070 ppm
                        CO2 level: 1075 ppm
                        CO2 level: 1080 ppm
                        ...

                        atleast now i know that it started the calibration from the start again, but what could it all mean?
                        and its probably best to use good quality cables too then... and perhaps good to not to touch the dupont cables too...

                        1 Reply Last reply
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        31

                        Online

                        11.7k

                        Users

                        11.2k

                        Topics

                        113.1k

                        Posts


                        Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • MySensors
                        • OpenHardware.io
                        • Categories
                        • Recent
                        • Tags
                        • Popular