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.
  • alexsh1A Offline
    alexsh1A Offline
    alexsh1
    wrote on last edited by
    #1

    Hello,

    Anyone has got a modified MH-Z14A CO2 sensor working please?
    Whenever I tried to use sub-type V_UNIT_PREFIX, I get the following error (My Sensors 1.5.4)

    MySensors: Unknown/Invalid sensor type (43)

    Additionally, I cannot get proper readings from PWM. This is the description (in Chinese - sorry)~
    http://www.winsensor.com/product_pdf/MH/MH-Z14A红外传感器说明书V1.0.pdf

    I am using the following PINS: Pin23 - VIN, Pin 22 - GND, Pin26 - PWM.

    Any help is appreciated

    1 Reply Last reply
    0
    • alexsh1A Offline
      alexsh1A Offline
      alexsh1
      wrote on last edited by
      #2

      OK, I manage to get it resolved now. Simple code really - I am going to convert it into MySensors now. One thing to note - there is an error in the formula. This is 5000ppm sensor, therefore "5000" multiplier has to be used in the formula.

      // set pin number:
      const int sensorPin = 2;     // the number of the sensor pin
      long ppm=0;
      unsigned long duration;
      
      void setup() {
        Serial.begin(9600);
        // initialize the sensor pin as an input
        pinMode(sensorPin, INPUT);
      }
      
      void loop(){
        duration = pulseIn(sensorPin,HIGH,2000000);
        ppm = 5000 * (((duration)/1000)-2)/1000; 
          Serial.println("CO2 = " + String(ppm) + " ppm");
          delay(10000);
      }
      
      1 Reply Last reply
      1
      • 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


                            23

                            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