0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于小凌派开发板的烟雾检测传感器设计

电子发烧友开源社区 来源:HarmonyOS官方合作社区 作者:HarmonyOS官方合作社 2022-04-29 08:42 次阅读

烟雾检测传感器使用的是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是负载

#define CAL_PPM      20       //校准环境中PPM值#define RL         1       //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.6ppm:60.9

(左右移动查看全部内容)

当检测到烟雾超过设定值时蜂鸣器报警响起。低于设置值时蜂鸣器停止报警。这样基于小凌派的烟雾报警功能就实现了。

原文标题:基于小凌派 RK2206 鸿蒙开发板实现烟雾报警功能

文章出处:【微信公众号:HarmonyOS官方合作社区】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2545

    文章

    50432

    浏览量

    750886
  • 开发板
    +关注

    关注

    25

    文章

    4888

    浏览量

    97021
  • 烟雾检测
    +关注

    关注

    0

    文章

    14

    浏览量

    8214
  • RK2206
    +关注

    关注

    0

    文章

    34

    浏览量

    1755
  • 小凌派
    +关注

    关注

    0

    文章

    27

    浏览量

    1187

原文标题:基于小凌派 RK2206 鸿蒙开发板实现烟雾报警功能

文章出处:【微信号:HarmonyOS_Community,微信公众号:电子发烧友开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    轻量系统开发套件介绍:睿智捷 | 小-RK2206 开发板套件

    睿智捷 | 小-RK2206 开发板套件是由福州市睿智捷电子有限公司出品,主控为瑞芯微
    发表于 04-21 13:39

    基于小开发板实现烟雾报警功能

    ,则输出的模拟信号就越大。 使用MQ-2烟雾传感器检测周围环境烟雾浓度,再通过小
    发表于 04-26 09:27

    【小RK2206开发板试用体验】第3章 应用开发

    开发环境:开发系统:Ubuntu 20.04开发板:小-RK2206开发板OpenHarmo
    发表于 05-08 14:07

    【小RK2206开发板试用体验】鸿蒙应用开发和鸿蒙线程创建

    开发系统:Ubuntu 20.04开发板:小-RK2206开发板OpenHARMony版本:3.0.0-LTS1应用实例简介小
    发表于 05-25 01:32

    基于开发板的FastDeploy适配

    )目前,我已将FastDeploy适配到开发板上,可用于目标检测、人脸检测、人脸识别、人脸对齐、图像分割、OCR等领域,这将大大提高
    发表于 02-16 09:43

    【ELF 1开发板试用】+传感器检测

    ELF 1开发板通过几种传感器的测试,如温湿度、六轴传感器等,而在配备功能扩展板的情况下,还能进行光照强度的检测。 温湿度检测 ELF1
    发表于 11-29 11:59

    【ELF 1开发板试用】板载资源测试4:体验温湿度传感器

    ,对比数据,进一步理解传感器检测技术。2、从测试过程中理解了ELF 1开发板命令行操作方式。3、从测试过程中进一步熟悉了ELF 1开发板板载资源。总之,飞
    发表于 12-18 11:09

    基于OpenHarmony系统和小RK2206开发板的避障小车

    这是一款基于OpenHarmony系统和小-RK2206开发板的避障小车。同时,小车上搭载了超声波测距模块、舵机模块、红外寻迹模块、直流电机模块。
    的头像 发表于 04-21 07:58 4815次阅读

    基于小烟雾报警功能的实现

    烟雾检测传感器使用的是MQ-2烟雾传感器。MQ-2型烟雾传感
    的头像 发表于 04-26 16:16 1938次阅读
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>烟雾</b>报警功能的实现

    基于小RK2206开发板所制作的简易示波器

    基于OpenHarmony + 小RK2206开发板制作的简易示波器,实时采集波形,实时计算并实时显示对应的波形。OpenHarmony实时性较高,稳定性好,瑞芯微RK2206芯片接口丰富
    的头像 发表于 05-06 17:09 1726次阅读
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b>RK2206<b class='flag-5'>开发板</b>所制作的简易示波器

    利用小开发板自带的wifi功能来进行tcp通信的教程

    基于小RK2206开发板wifi-tcp通信实验 在开发过程中想要与开发板进行通信一般使用串口通信,当
    的头像 发表于 05-13 15:05 2630次阅读
    利用小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b>自带的wifi功能来进行tcp通信的教程

    使用小开发板wifi进行tcp通信的步骤

    开发过程中想要与开发板进行通信一般使用串口通信,当开发板使用串口与pc通信还需要专门的串口转换工具才行,而小
    的头像 发表于 05-16 09:35 2170次阅读

    用小开发板wifi进行udp通信的教程

    开发板与pc通信有很多形式,之前已经介绍过通过tcp通信,不过有些场合使用udp会更合适,因为udp没有了tcp的握手与连接步骤,传输效率会高的多。例如通过wifi传输开发板采集到传感器数据在PC端
    的头像 发表于 05-31 16:43 3298次阅读
    用小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>开发板</b>wifi进行udp通信的教程

    基于小RK2206开发板wifi-udp通信实验

    开发板与pc通信有很多形式,之前已经介绍过通过tcp通信,不过有些场合使用udp会更合适,因为udp没有了tcp的握手与连接步骤,传输效率会高的多。例如通过wifi传输开发板采集到传感器数据在PC端
    的头像 发表于 06-01 10:33 800次阅读
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b>RK2206<b class='flag-5'>开发板</b>wifi-udp通信实验

    基于小RK2206开发板wifi-tcp通信实验

    基于小RK2206开发板wifi-tcp通信实验在开发过程中想要与开发板进行通信一般使用串口通信,当
    的头像 发表于 06-14 11:10 1202次阅读
    基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b>RK2206<b class='flag-5'>开发板</b>wifi-tcp通信实验