煙霧檢測傳感器使用的是MQ-2煙霧傳感器。MQ-2型煙霧傳感器屬于二氧化錫半導體氣敏材料,屬于表面離子式N型半導體。處于200~300攝氏度時,二氧化錫吸附空氣中的氧,形成氧的負離子吸附,使半導體中的電子密度減少,從而使其電阻值增加。當與煙霧接觸時,如果晶粒間界處的勢壘收到煙霧的調至而變化,就會引起表面導電率的變化。利用這一點就可以獲得這種煙霧存在的信息,煙霧的濃度越大,導電率越大,輸出電阻越低,則輸出的模擬信號就越大。
使用MQ-2煙霧傳感器來檢測周圍環境煙霧濃度,再通過小凌派開發板采集信號。因為采集的信號是電壓值所以通過adc轉換成數字信號。這里有個需要注意的地方RK2206的ADC默認參考電壓是內部2.4v所以初始化ADC時通過配置soc_con29 寄存器改成外部3.3v參考電壓。
參考代碼:
typedef union
{
uint32_t value;
struct
{
uint16_t gRF_saradc_ana_reg_low: 4;
uint16_t grf_saradc_vol_sel: 1;
uint16_t grf_saradc_ana_reg_high: 11;
struct
{
uint16_t grf_saradc_ana_reg_low: 4;
uint16_t grf_saradc_vol_sel: 1;
uint16_t grf_saradc_ana_reg_high: 11;
} rw;
};
} GRF_SOC_CON29;
static uint32_t iss_adc_dev_init(iss_mq2_dev_s *adc)
{
if (PinctrlInit(adc->adc) != 0)
{
printf("adc pin %d init faiLED ", adc->adc.gpio);
}
if (LzSaradcInit() != 0)
{
printf("saradc %d init failed ", adc->port);
}
volatile GRF_SOC_CON29 *soc = (GRF_SOC_CON29*)&GRF->SOC_CON29;
soc->rw.grf_saradc_vol_sel = 1;
soc->grf_saradc_vol_sel = 0;
soc->rw.grf_saradc_vol_sel = 0;
adc->init = 1;
return 0;
}
(左右移動查看全部內容)
讀取ADC電壓:
static float iss_get_voltage(void)
{
unsigned int ret;
unsigned int data;
ret = LzSaradcReadValue(m_iss_mq2, &data);
if (ret != 0)
{
printf("ADC Read Fail ");
}
return (float)data * 3.3 / 1024;
}
(左右移動查看全部內容)
計算ppm值:
阻值R與空氣中被測氣體的濃度C的計算關系式
log R = mlog C + n (m,n均為常數)
傳感器的電阻計算:
Rs = (Vc/VRL-1) X RL
Vc為回路電壓,VRL是傳感器4腳6腳輸出電壓,RL是負載
float e53_iss_get_mq2_ppm(void)
{
float voltage, rs, ppm;
voltage = iss_get_voltage();
rs = (5 - voltage) / voltage * RL; //計算rs
ppm = 613.9f * pow(rs / m_r0, -2.074f); //計算ppm
return ppm;
}
(左右移動查看全部內容)
ppm值校準:
void e53_iss_mq2_ppm_calibration(void)
{
float voltage = iss_get_voltage();
float rs = (5 - voltage) / voltage * RL;
m_r0 = rs / pow(CAL_PPM / 613.9f, 1 / -2.074f);
printf("R0 =%f ", m_r0);
}
(左右移動查看全部內容)
因為使用的是無源蜂鳴器,所以通過pwm驅動蜂鳴器報警。
pwm初始化:
static uint32_t iss_pwm_dev_init(iss_pwm_dev_s *p)
{
if (PwmIoInit(p->pwmio) != 0)
{
printf("Pwm pin %d init failed ", p->pwmio.pwm.gpio);
}
if (LzPwmInit(p->port) != 0)
{
printf("Pwm %d init failed ", p->port);
}
p->init = 1;
return 0;
}
(左右移動查看全部內容)
pwm 啟動:
static uint32_t iss_pwm_start(iss_pwm_dev_s *pwm)
{
if (pwm->init == 0)
{
printf("PWM not init ");
return 1;
}
else if (LzPwmstart(pwm->port, pwm->duty * pwm->cycle / 100, pwm->cycle) != 0)
{
printf("PWM Start Fail ");
return 1;
}
pwm->onoff = 1;
return 0;
}
(左右移動查看全部內容)
pwm停止:
static uint32_t iss_pwm_stop(iss_pwm_dev_s *pwm)
{
if (pwm->init == 0)
{
printf("PWM not init ");
return 1;
}
else if (pwm->onoff == 0)
{
return 0;
}
else if (LzPwmStop(pwm->port) != 0)
{
printf("PWM Stop Fail ");
return 1;
}
pwm->onoff = 0;
return 0;
}
(左右移動查看全部內容)
蜂鳴器報警控制,需要報警時啟動pwm,不需要報警時停止pwm:
void e53_iss_beep_status_set(e53_iss_status_e status)
{
if (status == ON)
{
iss_pwm_start(&m_iss_beep);
}
if (status == OFF)
{
iss_pwm_stop(&m_iss_beep);
}
}
(左右移動查看全部內容)
整個模塊初始化:
uint32_t e53_iss_init()
{
uint32_t ret = 1;
ret = iss_led_dev_init(&m_iss_led);
if (ret != 0)
{
printf(“led init err ”);
}
ret = iss_pwm_dev_init(&m_iss_beep);
if (ret != 0)
{
printf(“pwm init err ”);
}
ret = iss_adc_dev_init(&m_iss_mq2);
if (ret != 0)
{
printf(“adc init err ”);
}
return ret;
}
(左右移動查看全部內容)
創建一個任務處理函數
這里需要注意的是ppm校準需要提前測試,再把值寫死到代碼里。
還有需要注意的是mq2傳感器需要預熱,即提前通電大約半分鐘到一分鐘左右。用手放在傳感器外殼感覺微微發熱即可。如果不預熱就開始測量其測量值會偏差很大,而且會隨著加熱而變化。
void e53_iss_thread(void *args)
{
float ppm = 0;
uint32_t id = 0;
uint8_t index = 0;
e53_iss_init();
printf("%s ", __FUNCTION__);
/*傳感器校準*/
LOS_Msleep(2000); // 開機2s后進行校準
// e53_iss_mq2_ppm_calibration(); // 校準傳感器校準后不需要重復調用
while (1)
{
ppm = e53_iss_get_mq2_ppm();
printf("ppm:%.1f ", ppm);
/*判斷是否達到報警閾值*/
if (ppm > e53_iss_get_mq2_alarm_value())
{
e53_iss_beep_status_set(ON);
printf("over %u ppm alarm ", e53_iss_get_mq2_alarm_value());
}
else
{
e53_iss_led_status_set(OFF);
e53_iss_beep_status_set(OFF);
}
LOS_Msleep(1000);
}
}
(左右移動查看全部內容)
最后創建一個任務調用上面處理函數即可。
燒寫程序后通過串口打印結果
ppm:55.6
ppm:60.9
(左右移動查看全部內容)
當檢測到煙霧超過設定值時蜂鳴器報警響起。低于設置值時蜂鳴器停止報警。這樣基于小凌派的煙霧報警功能就實現了。
-
傳感器
+關注
關注
2548文章
50673瀏覽量
751986 -
開發板
+關注
關注
25文章
4943瀏覽量
97193 -
煙霧檢測
+關注
關注
0文章
14瀏覽量
8217 -
RK2206
+關注
關注
0文章
34瀏覽量
1763 -
小凌派
+關注
關注
0文章
27瀏覽量
1193
原文標題:基于小凌派 RK2206 鴻蒙開發板實現煙霧報警功能
文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發燒友開源社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論