赞
踩
最近给人做了个机智云的环境监测程序,第一次赚外快,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; }
这个是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是个变量,他两的计算结果在什么情况下能一直是个常量???
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。