最近給人做了個機智雲的環境監測程序,第一次賺外快,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;
}