一、前期准备

 
    达成目标:     利用Rapberry Pi 驱动MQ-2烟雾报警模块,对信息进行采集和提取。     **1.**准备树莓派(Raspberry Pi)一个   **2.**MQ-2有害气体检测模块   **3.**杜邦线若干   **4.**SD卡一张以及一个读卡器          

二、各个器件介绍

   

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,必要时还可以超频。</font>
			  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接入,那么就选择有桌面的操作系统,因为我这里主要是完成项目,所以就不选带桌面系统的镜像了。         官方系统镜像界面的截图:        

3.烧制系统

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

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

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

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

   

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

       

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

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

   

     

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” 可以看到系统的版本,所以务必配置镜像文件之前,查一下系统版本哦。

    这是我的系统版本:        

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工具  

 

  • 安装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”。

   

下面为是所有可用方法的截图:        

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的引脚图:  

      上面有个地方指出的:“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连线:        

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”,说明检测到有害气体了,下面放图,我的实验结果:
  
![](https://s1.51cto.com/images/blog/201803/16/8e6270ca64884c9bafcf9359cc9b241e.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
  
  

  说明模块工作正常,可以检测有害气体,并且这个程序也是基本上没有什么问题的,后面需要停止的话,按下“Ctrl+C”停止脚本运作就好了。
  
>*** 注意 ***
  在Python2当中,因为语法的变化,当脚本当中有中文的情况下,在开头加上“# encoding=utf-8”;并且“print( )”方法是没有括号的,只有引号,并且异常处理后面可能有语法也不一样,需要读者注意因。

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