mirror of
https://github.com/sigmasternchen/MH-Z-CO2-Sensors
synced 2025-03-15 06:38:55 +00:00
Add support for setting the range and autocalibration. Closes #1.
* added possibility to set Range, to enable/disable Autocalibrate and to calibrate maually ( see Datasheet v 1.2 : https://www.winsen-sensor.com/d/files/MH-Z14A.pdf * Update MHZ.cpp * Update MHZ.cpp * Update MHZ.h added calibrate Span, for complete functionality but commented out , due to professional use (req. constant atmosphere with 2k, 5k or 10k ppm CO2.). corrected the bugs in MHZ.cpp also. * Update MHZ.cpp Added comments for Sensors with specific firmware. Co-authored-by: Christoph Schultz <christoph@schultz1-christoph.de>
This commit is contained in:
parent
d67723a05d
commit
8a063e7c27
2 changed files with 77 additions and 1 deletions
70
MHZ.cpp
70
MHZ.cpp
|
@ -7,6 +7,9 @@
|
|||
|
||||
const int MHZ14A = 14;
|
||||
const int MHZ19B = 19;
|
||||
const int MHZ_2K = 1;
|
||||
const int MHZ_5K = 2;
|
||||
const int MHZ_10K = 3;
|
||||
|
||||
const unsigned long MHZ14A_PREHEATING_TIME = 3L * 60L * 1000L;
|
||||
const unsigned long MHZ19B_PREHEATING_TIME = 3L * 60L * 1000L;
|
||||
|
@ -251,3 +254,70 @@ int MHZ::readCO2PWM() {
|
|||
}
|
||||
return ppm_pwm;
|
||||
}
|
||||
|
||||
void MHZ::setAutoCalibrate(boolean b) //only available for MHZ-19B with firmware < 1.6 and MHZ 14a
|
||||
{
|
||||
uint8_t cmd_enableAutoCal[9] = { 0xFF, 0x01, 0x79, 0xA0, 0x00, 0x00, 0x00, 0x00, 0xE6 };
|
||||
uint8_t cmd_disableAutoCal[9] = { 0xFF, 0x01, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86};
|
||||
if (b)
|
||||
{
|
||||
_serial->write(cmd_enableAutoCal,9);
|
||||
}
|
||||
else
|
||||
{
|
||||
_serial->write(cmd_disableAutoCal,9);
|
||||
}
|
||||
}
|
||||
|
||||
void MHZ::setRange(int range) //only available for MHZ-19B < 1.6 and MH-Z 14a
|
||||
{
|
||||
uint8_t cmd_2K[9] = {0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x8F};
|
||||
uint8_t cmd_5K[9] = {0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x13, 0x88, 0xCB};
|
||||
uint8_t cmd_10K[9] = {0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x27, 0x10, 0x2F};
|
||||
|
||||
switch(range)
|
||||
{
|
||||
case 1:
|
||||
_serial->write(cmd_2K,9);
|
||||
break;
|
||||
case 2:
|
||||
_serial->write(cmd_5K,9);
|
||||
break;
|
||||
case 3:
|
||||
_serial->write(cmd_10K,9);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void MHZ::calibrateZero()
|
||||
{
|
||||
char cmd[9] = {0xFF, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78};
|
||||
_serial->write(cmd,9);
|
||||
}
|
||||
|
||||
/***** calibrateSpan() function for professional use. requires a constant atmosphere with 2K, 5k or 10k ppm CO2 and calibrateZero at first.
|
||||
|
||||
void MHZ::calibrateSpan(int range)
|
||||
{
|
||||
char cmd_2K[9] = {0xFF, 0x01, 0x88, 0x07, 0xD0, 0x00, 0x00, 0x00, 0xA0};
|
||||
char cmd_5K[9] = {oxFF, 0x01, 0x88, 0x13, 0x88, 0x00, 0x00, 0x00, 0xDC};
|
||||
char cmd_10K[9]= {0xFF, 0x01, 0x88, 0x27, 0x10, 0x00, 0x00, 0x00, 0x40};
|
||||
|
||||
switch(range)
|
||||
{
|
||||
case 1:
|
||||
_serial->write(cmd_2K,9);
|
||||
break;
|
||||
case 2:
|
||||
_serial->write(cmd_5K,9);
|
||||
break;
|
||||
case 3:
|
||||
_serial->write(cmd_10k,9);
|
||||
}
|
||||
|
||||
}
|
||||
****/
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
8
MHZ.h
8
MHZ.h
|
@ -16,7 +16,9 @@
|
|||
// types of sensors.
|
||||
extern const int MHZ14A;
|
||||
extern const int MHZ19B;
|
||||
|
||||
extern const int MHZ_2K;
|
||||
extern const int MHZ_5k;
|
||||
extern const int MHZ_10K;
|
||||
// status codes
|
||||
extern const int STATUS_NO_RESPONSE;
|
||||
extern const int STATUS_CHECKSUM_MISMATCH;
|
||||
|
@ -35,6 +37,10 @@ class MHZ {
|
|||
|
||||
boolean isPreHeating();
|
||||
boolean isReady();
|
||||
void setAutoCalibrate(boolean b);
|
||||
void calibrateZero();
|
||||
void setRange(int range);
|
||||
// void calibrateSpan(int range); //only for professional use... see implementation and Dataheet.
|
||||
|
||||
int readCO2UART();
|
||||
int readCO2PWM();
|
||||
|
|
Loading…
Reference in a new issue