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 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


                      28

                      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