当前位置:   article > 正文

MQ2和MQ7电压值与PPM的转换公式_mq2如何转化为ppm

mq2如何转化为ppm

最近给人做了个机智云的环境监测程序,第一次赚外快,100块钱我就接了。写程序的时候发现好多人在找这两传感器电压值和PPM的转换,我这个也是照搬别人的公式,不过效果还不错。不过遗憾的是,我都写的差不多了,他又要让我换ONENET,ONENET我不太熟,他就又给了我100让我帮他搞搞,然后我就赚了200大洋,人生少有的一次靠知识赚外快

硬件 stm32f103c8t6\esp8266\mq2\mq7\dht11
云平台 机智云

代码里边关于配网的部分我没写,因为我的esp8266烧录完机智云的固件后,用了很多次了,我家WIFI密码我现在都可以背下来了。

下面这个是MQ2电压值与PMM的转换

#define CAL_PPM 	20  	// 校准环境中PPM值
#define RL			5		// RL阻值
static float R0 = 6.00; 	// 元件在洁净空气中的阻值

//得到ADC采样内部传感器的值
//取10次,然后平均
vu16 Get_ADCValue_MQ2(void)
{
	u32 val = 0;
	u8 times = 10;
	u8 count;
	for(count = 0; count < times; count++)
	{
		val += ADC_ConvertedValue[0];//获取DMA通道值
		delay_ms(5);
	}
	return val/times;
}
 
// 传感器校准函数
void MQ2_PPM_Calibration(float RS)
{
    R0 = RS / pow(CAL_PPM / 613.9f, 1 / -2.074f);
}
 
// MQ2传感器数据处理
float MQ2_GetPPM(void)
{	
    float Vrl = 3.3f * Get_ADCValue_MQ2() / 4096.f;
	Vrl = ( (float)( (int)( (Vrl+0.005)*100 ) ) )/100;
    float RS = (3.3f - Vrl) / Vrl * RL; 

	if(times_mq < 6000) // 获取系统执行时间,300ms前进行校准
    {
		R0 = RS / pow(CAL_PPM / 613.9f, 1 / -2.074f);
    }
	
    float ppm = 613.9f * pow(RS/R0, -2.074f);
	
    return  ppm;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

这个是MQ7的

#define CAL_PPM  10  // 校准环境中PPM值
#define RL	10  // RL阻值
static float R0 = 8.00;

//得到ADC采样内部传感器的值
//取10次,然后平均
vu16 Get_ADCValue_MQ7(void)
{
	u32 val = 0;
	u8 times = 10;
	u8 count;
	for(count = 0; count < times; count++)
	{
		val += ADC_ConvertedValue[1];
		delay_ms(5);
	}
	return val/times;
}

 // 传感器校准函数
void MQ7_PPM_Calibration(float RS)
{
	
    R0 = RS / pow(CAL_PPM / 98.322, 1 / -1.458f);
}
 
 // 获取传感器的值
float MQ7_GetPPM(void)
{
    float Vrl = 3.3f * Get_ADCValue_MQ7() / 4096.f;
	Vrl = ( (float)( (int)( (Vrl+0.005)*100 ) ) )/100;
    float RS = (3.3f - Vrl) / Vrl * RL;
//	printf("MQ7_VRL = %.2f\n", Vrl);
    if(times_mq < 6000) // 获取系统执行时间,3s前进行校准
    {
		MQ7_PPM_Calibration(RS);
    }
	
    float ppm = 98.322f * pow(RS/R0, -1.458f);

    return  ppm;
}

关于有人争论ppm是个常数的问题: 
前三秒,R0是由RS推导出来的,最终的ppm一定是个定值,因为前三秒的目的是要标定,也可以在前三秒内不计算ppm。 
之后,R0是一个常量,RS是个变量,他两的计算结果在什么情况下能一直是个常量???



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

完整工程代码下载

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/225966
推荐阅读
相关标签
  

闽ICP备14008679号