基于树莓派(RaspberryPi)平台的MQ-2烟雾报警

一、前期准备

 
 
 
达成目标:
 
 利用Rapberry Pi 驱动MQ-2烟雾报警模块,对信息进行采集和提取。

 
 
1.准备树莓派(Raspberry Pi)一个
 
2.MQ-2有害气体检测模块
 
3.杜邦线若干
 
4.SD卡一张以及一个读卡器
 
 
 
 
 

10年积累的网站建设、成都网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有子长免费网站建设让你可以放心的选择与我们合作。

二、各个器件介绍

 
 

1.树莓派(Raspberry Pi)

 
 Raspberry Pi是一个英国小型组织慈善组织The Raspberry Pi Foundation发行的一款针对电脑业余爱好者,学生,以及小型企业等用户的迷你电脑,预装的是Linux操作系统,体积非常小巧,在最新款的Raspberry Pi 3 Model B,搭载了高通的ARMv8的高性能CUP,并且包含1GB RAM,引脚数上升到40个。
 

    较上一代的优点:
              1.首先处理器是新一代四核心Broadcom BCM2837 64位ARMv8 处理器,并且处理器速度最高可达1.2GHz,必要时还可以超频。
              2.第二是新添加了板载BCM43143 WiFi芯片,无需WiFi网络适配器。

    Raspberry Pi官网:https://www.raspberrypi.org/ 

 
 

2.MQ-2有害气体检测模块

 
 这是一款广泛应用于家庭和工厂的气体泄漏检测装置,适用于液化气、甲烷、丙烷、丁烷、酒精、氢气、烟雾等有害气体的检测。
 

  • 有四个引脚:
    VCC:输入5V正极电流
    GND:接电源负极
    DO:TTL高低电平输出端
    AO:模拟电压输出端
  • TTL输出灵敏度调节:
    此电位器只针对TTL,也就是DO输出灵敏度进行调节。
    顺时针调节灵敏度增高,逆时针调节灵敏度降低。
  • 具有以下优点:
      广泛的探测范围
      高灵敏、快速的相应恢复
      优异的稳定性、寿命成长
      简单的驱动电路    

 
 
 
 
 

三、Raspberry Pi部署操作系统

 
 

1.概述

 
 绝大多数开源Linux社区都有树莓派Arm架构的操作系统,比如基于Debian的Raspbian系统和Ubuntu mate系统,这是两款对树莓派支持性最好的系统,并且在国内也有镜像源,对于一个开发板来说,这是可能是最重要的。
 我个人强烈推荐Raspbian系统,它本身的命令其实和服务器端的Debian操作命令相同,但是更大的优点在于:国内有诸多知名大学网站都有Raspbian系统镜像源,很是方便;因为开始我玩儿的是Centos系列的操作系统,比较熟悉命令以及其他配置方式,并且在Centos的官方网站也有专门为Raspberry Pi开发的基于Arm架构的系统镜像,但是安装完你会发现,镜像源很是不方便 0.0。
 
 

2.部署Raspbian系统

 
  首先,到前面我贴上去的官网上下载系统镜像文件,点进DOWNLOADS,看到有两种系统:“NOOBS”和“Raspbian ”,我选择了Raspbian,,然后会看到两个版本的镜像,其中左边有“DESKTOP”是带有桌面的操作系统,相反右边的是最小化安装的系统镜像,建议身边如果能方便的获取显示器,来通过HDML接入,那么就选择有桌面的操作系统,因为我这里主要是完成项目,所以就不选带桌面系统的镜像了。
 
 
官方系统镜像界面的截图:
 
基于树莓派(Raspberry Pi)平台的MQ-2烟雾报警
 
 
 

3.烧制系统

 
 下载好之后,通过一个软件“Win32DiskImager”,来烧录系统,在Device选择读卡器显示的外部设备,Image File选择刚刚下载好,并且解压完成的镜像文件,然后点击Write,进行写入操作,因为我是最小化的镜像系统,所以只需几分钟就完成系统的烧录,你们稍等片刻,也就完成了。
 
 
烧录软件截图:
 
基于树莓派(Raspberry Pi)平台的MQ-2烟雾报警
 
 

注意:一般情况下Raspbian系统是不带有SSH远程连接功能的,因此想要开启功能,需要进入烧录好的镜像系统
文件当中(通过读卡器),新建一个空白的文本文件,名为“ssh”,不需要改后缀,然后就可以进行下一步了

 
 插上网线,通过路由器可以得知分配给开始Raspbian的IP,然后通过SSH远程登录。
 

这里需要注意的是,默认用户是“pi”,密码是“raspberry”,SSH远程连接“ssh pi@192.168.1.1 ”,输入密码即可

 
 

  下面是以pi用户连接树莓派后的截图:
 

基于树莓派(Raspberry Pi)平台的MQ-2烟雾报警
 
 
 
 

4.更改默认登录用户

 
 一般情况下,我们都是以root用户的身份去操作系统的,这样权利更大,也更方便做一些普通用户很难做到的事情,根据下面:
 
 

  • 首先切换root用户,激活root用户的密码配置选项:

    pi@raspberrypi:~ $ sudo passwd root
    Enter new UNIX password:
    Retype new UNIX password:
    passwd: password updated successfully

     

  • 然后解锁root用户:

    pi@raspberrypi:~ $ sudo passwd --unlock root
    passwd: password expiry information changed.

     

  • 最后切换root用户:

    pi@raspberrypi:~ $ su root
    Password:

     

  • 但是由于Raspbian系统默认是以“pi”用户登录树莓派的,也就是说即使上面激活了root用户,也无法通过:“ssh root@192.168.1.1”去登陆,因此还需要进行下面操作。

进入文件:
vim /etc/systemd/system/getty.target.wants/getty\@tty1.service

找到: ExecStart=-/sbin/agetty --noclear %I $TERM
改为: ExecStart=-/sbin/agetty --autologin root --noclear %I $TERM

 
 
 下图为更改配置后的截图:

 
基于树莓派(Raspberry Pi)平台的MQ-2烟雾报警
 
基于树莓派(Raspberry Pi)平台的MQ-2烟雾报警

 
 
 

5.配置镜像源

 

  配置镜像源,是为了方便后面部署各类软件,解决依赖关系。
好在官方给出了软件镜像名单:
 
 http://www.raspbian.org/RaspbianMirrors
 

  这里包括了世界各地的大学或者教育机构网站提供了Raspbian软件镜像,极大的方便了喜欢玩转树莓派的爱好者,我在其中节选了几个大学提供的镜像地址,供大家参考:
 

http://mirror.sysu.edu.cn/raspbian/raspbian 中山大学镜像源(南方用户)
http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ 清华大学镜像源(北方用户)
http://mirrors.ustc.edu.cn/raspbian/raspbian/ 中科大镜像源(中部用户)
http://mirrors.cqu.edu.cn/Raspbian/raspbian/ 重庆大学镜像(中西部用户)

 

  因为我离北京比较近,所以选择了清华的镜像源,速度快 稳定。
 

  • 进入文件: vim /etc/apt/sources.list

    注释其他语句,并且,加上下面的语句:
    deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian stretch main contrib non-free rpi

  • 要注意的是 : 配置上的源,后面有个“stretch”字段,它代表的是第九代Debian系统,其他字段的有:第七代系统“wheezy”,第八代系统“Jessie”,因为在Raspberry Pi的官网一般下载的都是最新的系统,并且这一代系统极大的扩展和发挥了Raspberry性能,因此建议安装这个版本的系统。
     通过命令:“lsb_release -a” 可以看到系统的版本,所以务必配置镜像文件之前,查一下系统版本哦。

 
 
这是我的系统版本:
 
基于树莓派(Raspberry Pi)平台的MQ-2烟雾报警
 
 
 

6.配置无限路由(WiFi)

 
 Raspberry内置WiFi设备,因此只需要在网络配置文件当中,把WiFi名称和密码写进去,那么每次启动机器都会去读取文件,自动连接WiFi。

 

  • 找到文件并写入: vim /etc/wpa_supplicant/wpa_supplicant.conf

    network={
    ssid="WiFi名称"
    psk="WiFi密码"
    }

 
 
 

7.键盘布局配置

 
 由于Raspberry原产地为英国,因此键盘布局为英式键盘,许多键位都不一样,因此需要更改键盘布局,首先执行下面两个操作:
 

  • 首先安装输入法配置,才可以更换键盘布局:

    apt install fcitx

  • 然后输入:

    raspi-config

    进入伪图形化配置界面,选择配置“keyboard layout”,选择US键盘布局,保存后退出,重启即可。

 
 
 
 
 

四、部署和应用GPIO库

 
 
 

1.部署Pip和GPIO

 
 在Raspbian系统当中,为了Raspberry爱好者方便的自定义自己的板子,因此选择原生支持了当今最主流的编程语言Python,无论是Python2,还是Python3都有安装,为了方便的安装GPIO库,强烈建议先安装pip工具,这个工具类似于apt和yum,可以自动解决安装第三方库时的依赖关系,非常好用。
 
 
 我将在下面使用Python3作为代码执行的平台,下面是包含的所有Python工具
 
基于树莓派(Raspberry Pi)平台的MQ-2烟雾报警

 

  • 安装pip:
     apt install pip3

    注意如果出现问题,显示无法安装,则使用下面命令:

    apt-get install *pip -y

  • 通过pip安装GPIO模块:
     pip3 install gpio

  • 验证GPIO模块是否安装成功并导入:
     #python3
     \>>>import RPi.GPIO as GPIO
     \>>>GPIO.setmode(GPIO.BOARD)

*发现上述命令都没有报错,并且按下Table键,补全所有内置方法

 
 
 
特别注意:为什么不是安装RPi.GPIO???

        RPi.GPIO库是我在Raspberry官网上看到的支持I/O状态读取的一个库,但是我按照网上很多博客上查的,执行安装命令:“pip install RPi.GPIO”,总是报错,要么就是安装成功以后会在“import ”这个模块的时候,出现错误,很是费解,以为是版本的问题,发现自己安装的是最新版本,但总是调不起来这个库,我因此也没有什么好的解决方法,偶然发现,直接执行命令,安装“pip installgpio”貌似是安装了另一个版本的GPIO库,并且是可以正常调用的,我在之后在Centos7虚拟机上做了测试,发现也是可以的,那么我就选择用“gpio”代替“RPi.GPIO”。

 
 

下面为是所有可用方法的截图:
 
基于树莓派(Raspberry Pi)平台的MQ-2烟雾报警
 
 
 

2.常用的GPIO用法

 
 
下面简单介绍其中比较常用的GPIO用法:
 

1.导入GPIO模块
        import RPi.GPIO as GPIO  

 

2.将GPIO引脚设置为BOARD模式
        GPIO.setmode(GPIO.BOARD) 

 

3.设置GPIO引脚通道 作为输入
        GPIO.setup(pin,GPIO.IN)  

 

4.设置初始化为高电平
        GPIO.setup(pin,GPIO.OUT,initial=GPIO.HIGH) 

 

5.软件实现上/下拉:
        GPIO.setup(pin,GPIO.IN,pull_up_down=GPIO.PUD_UP)
        GPIO.setup(pin,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)

 

6.边缘检测,该函数是对一个引脚进行监听
        GPIO.add_event_detect(channel, GPIO.RISING) 

 

7.清除所有资源
        GPIO.cleanup()    

 
 
下面给出Raspberry Pi的引脚图:
 
基于树莓派(Raspberry Pi)平台的MQ-2烟雾报警

 
 
 上面有个地方指出的:“GPIO引脚设置为BOARD模式”,这里还有另一种定义引脚的方式,在RPi.GPIO中,同时支持树莓派上的两种GPIO引脚编号。第一种编号是BOARD编号,这和树莓派电路板上的物理引脚编号相对应。使用这种编号的好处是:硬件将是一直可以使用的,而不用担心树莓派的版本问题。在更替版本或者系统的时候,不必重写代码。
 
 第二种编号是BCM规则,是更底层的工作方式,它和Broadcom的片上系统中信道编号相对应。在使用一个引脚时,用户需要查找信道号和物理引脚编号之间的对应规则。对于不同的树莓派版本,编写的脚本文件也可能是无法通用的。
例如:上图当中的“GPIO 16”和“36”号引脚就是指的同一个,而对应的前者就是通过BCM定义的,后者是通过“BOARD”定义的。
 
 
 
 
 

五、应用实践

 
 
 

1.Raspberry Pi 和 MQ-2之间的连线

 
 在这里需要知道的是,Python的GPIO库只能接受引脚的高低电平的变化,因此只需要接线三个引脚就好:5V电源,地线,和DO接口,我选择以“BOARD”规则定义引脚,也就是36号引脚连接MQ-2的DO口,认真对应上面给出的引脚图,下面是我接好后的图:

 
 MQ-2连线:
 
基于树莓派(Raspberry Pi)平台的MQ-2烟雾报警
 
 
 Raspberry连线:
 
基于树莓派(Raspberry Pi)平台的MQ-2烟雾报警
 
 
 

2.模块测试

 
 接下来开始写Python代码,用于测试连线,以及模块的功能是否完好,根据上面的介绍的简答的几个GPIO库方法,以及简单的逻辑,写出如下代码:
 

#! /usr/bin/env python3
import RPi.GPIO as GPIO # 导入库,并进行别名的设置
import time

CHANNEL=36 # 确定引脚口。按照真实的位置确定
GPIO.setmode(GPIO.BOARD) # 选择引脚系统,这里我们选择了BOARD
GPIO.setup(CHANNEL,GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
#初始化引脚,将36号引脚设置为输入下拉电阻,因为在初始化的时候不确定的的引电平,因此这样设置是用来保证精准,(但是也可以不写“pull_up_down=GPIO.PUD_DOWN”)

# 带有异常处理的主程序
try:
         while True: # 执行一个while死循环
          status=GPIO.input(CHANNEL) # 检测36号引脚口的输入高低电平状态
          #print(status) # 实时打印此时的电平状态
          if status == True: # 如果为高电平,说明MQ-2正常,并打印“OK”
                        print ( ' 正常 ' )      
           else:    # 如果为低电平,说明MQ-2检测到有害气体,并打印“dangerous”
                        print ( ' 检测到危险气体 ! ! ! ' )
           time.sleep(0.1) # 睡眠0.1秒,以后再执行while循环
except KeyboardInterrupt: # 异常处理,当检测按下键盘的Ctrl+C,就会退出这个>脚本
            GPIO.cleanup() # 清理运行完成后的残余

 

  • 开始执行程序:
     
    \#chmod +x test.py
    \#./test.py

     
     
     然后会跳出"OK"的字样,每0.1秒一次,当通过打火机的去伸到MQ-2报警器跟前时,就会弹出一个“DANGEROUS”,说明检测到有害气体了,下面放图,我的实验结果:
     
    基于树莓派(Raspberry Pi)平台的MQ-2烟雾报警
     
     

  说明模块工作正常,可以检测有害气体,并且这个程序也是基本上没有什么问题的,后面需要停止的话,按下“Ctrl+C”停止脚本运作就好了。
 

注意
 在Python2当中,因为语法的变化,当脚本当中有中文的情况下,在开头加上“# encoding=utf-8”;并且“print( )”方法是没有括号的,只有引号,并且异常处理后面可能有语法也不一样,需要读者注意因。

 
 
 实际在后面结合Zabbix进行数据的监控和统计,是不需要输出的,因此这里只是为了效果直观,而加进去“print( )”语句,为了达到目的,我后面会把它放在Cron计划任务当中,在一开机的时候,就开始后台执行这个程序,并且没有输出,但是会实时记录引脚的高低电平。
 
 对于如何获取到这个值,并以什么方式进行存储,在后面我会研究,这里可能会遇到Zabbix的二次开发的问题。
 
 
 
 
 
 
 
 
                                             --------Zabbix项目部分我会在后面几个星期做好,未完待续.......


本文名称:基于树莓派(RaspberryPi)平台的MQ-2烟雾报警
本文地址:http://ybzwz.com/article/iesijd.html