煙霧檢測傳感器使用的是MQ-2煙霧傳感器。MQ-2型煙霧傳感器屬于二氧化錫半導(dǎo)體氣敏材料,屬于表面離子式N型半導(dǎo)體。處于200~300攝氏度時(shí),二氧化錫吸附空氣中的氧,形成氧的負(fù)離子吸附,使半導(dǎo)體中的電子密度減少,從而使其電阻值增加。當(dāng)與煙霧接觸時(shí),如果晶粒間界處的勢壘收到煙霧的調(diào)至而變化,就會引起表面導(dǎo)電率的變化。利用這一點(diǎn)就可以獲得這種煙霧存在的信息,煙霧的濃度越大,導(dǎo)電率越大,輸出電阻越低,則輸出的模擬信號就越大。
使用MQ-2煙霧傳感器來檢測周圍環(huán)境煙霧濃度,再通過小凌派開發(fā)板采集信號。因?yàn)椴杉男盘柺请妷褐邓酝ㄟ^adc轉(zhuǎn)換成數(shù)字信號。這里有個需要注意的地方RK2206的ADC默認(rèn)參考電壓是內(nèi)部2.4v所以初始化ADC時(shí)通過配置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;}
(左右移動查看全部內(nèi)容)
讀取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;}
(左右移動查看全部內(nèi)容)
計(jì)算ppm值:
阻值R與空氣中被測氣體的濃度C的計(jì)算關(guān)系式
log R = mlog C + n (m,n均為常數(shù))
傳感器的電阻計(jì)算:
Rs = (Vc/VRL-1) X RL
Vc為回路電壓,VRL是傳感器4腳6腳輸出電壓,RL是負(fù)載
float e53_iss_get_mq2_ppm(void){float voltage, rs, ppm;voltage = iss_get_voltage();rs = (5 - voltage) / voltage * RL; //計(jì)算rsppm = 613.9f * pow(rs / m_r0, -2.074f); //計(jì)算ppmreturn ppm;}
(左右移動查看全部內(nèi)容)
ppm值校準(zhǔn):
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);}
(左右移動查看全部內(nèi)容)
因?yàn)槭褂玫氖菬o源蜂鳴器,所以通過pwm驅(qū)動蜂鳴器報(bào)警。
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;}
(左右移動查看全部內(nèi)容)
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;}
(左右移動查看全部內(nèi)容)
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;}
(左右移動查看全部內(nèi)容)
蜂鳴器報(bào)警控制,需要報(bào)警時(shí)啟動pwm,不需要報(bào)警時(shí)停止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);}}
(左右移動查看全部內(nèi)容)
整個模塊初始化:
uint32_t e53_iss_init(){uint32_t ret = 1;ret = iss_led_dev_init(&m_iss_led);if (ret != 0){printf(“l(fā)ed 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;}
(左右移動查看全部內(nèi)容)
創(chuàng)建一個任務(wù)處理函數(shù)
這里需要注意的是ppm校準(zhǔn)需要提前測試,再把值寫死到代碼里。
還有需要注意的是mq2傳感器需要預(yù)熱,即提前通電大約半分鐘到一分鐘左右。用手放在傳感器外殼感覺微微發(fā)熱即可。如果不預(yù)熱就開始測量其測量值會偏差很大,而且會隨著加熱而變化。
void e53_iss_thread(void *args){float ppm = 0;uint32_t id = 0;uint8_t index = 0;e53_iss_init();printf("%s ", __FUNCTION__);/*傳感器校準(zhǔn)*/LOS_Msleep(2000); // 開機(jī)2s后進(jìn)行校準(zhǔn)// e53_iss_mq2_ppm_calibration(); // 校準(zhǔn)傳感器校準(zhǔn)后不需要重復(fù)調(diào)用while (1){ppm = e53_iss_get_mq2_ppm();printf("ppm:%.1f ", ppm);/*判斷是否達(dá)到報(bào)警閾值*/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);}}
(左右移動查看全部內(nèi)容)
最后創(chuàng)建一個任務(wù)調(diào)用上面處理函數(shù)即可。
燒寫程序后通過串口打印結(jié)果
ppm:55.6ppm:60.9
(左右移動查看全部內(nèi)容)
當(dāng)檢測到煙霧超過設(shè)定值時(shí)蜂鳴器報(bào)警響起。低于設(shè)置值時(shí)蜂鳴器停止報(bào)警。這樣基于小凌派的煙霧報(bào)警功能就實(shí)現(xiàn)了。
原文標(biāo)題:基于小凌派 RK2206 鴻蒙開發(fā)板實(shí)現(xiàn)煙霧報(bào)警功能
文章出處:【微信公眾號:HarmonyOS官方合作社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
傳感器
+關(guān)注
關(guān)注
2573文章
54372瀏覽量
786081 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
6123瀏覽量
113351 -
煙霧檢測
+關(guān)注
關(guān)注
0文章
14瀏覽量
8396 -
RK2206
+關(guān)注
關(guān)注
0文章
38瀏覽量
2479 -
小凌派
+關(guān)注
關(guān)注
0文章
28瀏覽量
1554
原文標(biāo)題:基于小凌派 RK2206 鴻蒙開發(fā)板實(shí)現(xiàn)煙霧報(bào)警功能
文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發(fā)燒友開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
輕量系統(tǒng)開發(fā)套件介紹:凌睿智捷 | 小凌派-RK2206 開發(fā)板套件
基于小凌派開發(fā)板實(shí)現(xiàn)煙霧報(bào)警功能
【小凌派RK2206開發(fā)板試用體驗(yàn)】第3章 應(yīng)用開發(fā)
【小凌派RK2206開發(fā)板試用體驗(yàn)】鴻蒙應(yīng)用開發(fā)和鴻蒙線程創(chuàng)建
基于凌蒙派開發(fā)板的FastDeploy適配
【ELF 1開發(fā)板試用】+傳感器檢測
【ELF 1開發(fā)板試用】板載資源測試4:體驗(yàn)溫濕度傳感器
基于OpenHarmony系統(tǒng)和小凌派RK2206開發(fā)板的避障小車
基于小凌派RK2206開發(fā)板所制作的簡易示波器
利用小凌派開發(fā)板自帶的wifi功能來進(jìn)行tcp通信的教程
使用小凌派開發(fā)板wifi進(jìn)行tcp通信的步驟
用小凌派開發(fā)板wifi進(jìn)行udp通信的教程
基于小凌派RK2206開發(fā)板wifi-udp通信實(shí)驗(yàn)
基于小凌派RK2206開發(fā)板wifi-tcp通信實(shí)驗(yàn)

基于小凌派開發(fā)板的煙霧檢測傳感器設(shè)計(jì)
評論