标签:Raspberry Pi Zabbix和嵌入式系统的结合 Python3 树莓派和MQ-2气体检测
一、前期准备
达成目标:
利用Rapberry Pi 驱动MQ-2烟雾报警模块,对信息进行采集和提取,而后Zabbix监控系统来收集和处理信息采集到的信息。
1.准备树莓派(Raspberry Pi)一个
2.MQ-2有害气体检测模块
3.杜邦线若干
4.SD卡一张以及一个读卡器
??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/
??这是一款广泛应用于家庭和工厂的气体泄漏检测装置,适用于液化气、甲烷、丙烷、丁烷、酒精、氢气、烟雾等有害气体的检测。
- 有四个引脚:
VCC:输入5V正极电流
GND:接电源负极
DO:TTL高低电平输出端
AO:模拟电压输出端
- TTL输出灵敏度调节:
此电位器只针对TTL,也就是DO输出灵敏度进行调节。
顺时针调节灵敏度增高,逆时针调节灵敏度降低。- 具有以下优点:
???广泛的探测范围
???高灵敏、快速的相应恢复
???优异的稳定性、寿命成长
???简单的驱动电路 ???
? ?绝大多数开源Linux社区都有树莓派Arm架构的操作系统,比如基于Debian的Raspbian系统和Ubuntu mate系统,这是两款对树莓派支持性最好的系统,并且在国内也有镜像源,对于一个开发板来说,这是可能是最重要的。
? ?我个人强烈推荐Raspbian系统,它本身的命令其实和服务器端的Debian操作命令相同,但是更大的优点在于:国内有诸多知名大学网站都有Raspbian系统镜像源,很是方便;因为开始我玩儿的是Centos系列的操作系统,比较熟悉命令以及其他配置方式,并且在Centos的官方网站也有专门为Raspberry Pi开发的基于Arm架构的系统镜像,但是安装完你会发现,镜像源很是不方便 0.0。
? ? 首先,到前面我贴上去的官网上下载系统镜像文件,点进DOWNLOADS,看到有两种系统:“NOOBS”和“Raspbian ”,我选择了Raspbian,,然后会看到两个版本的镜像,其中左边有“DESKTOP”是带有桌面的操作系统,相反右边的是最小化安装的系统镜像,建议身边如果能方便的获取显示器,来通过HDML接入,那么就选择有桌面的操作系统,因为我这里主要是完成项目,所以就不选带桌面系统的镜像了。
? ? 官方系统镜像界面的截图:
??下载好之后,通过一个软件“Win32DiskImager”,来烧录系统,在Device选择读卡器显示的外部设备,Image File选择刚刚下载好,并且解压完成的镜像文件,然后点击Write,进行写入操作,因为我是最小化的镜像系统,所以只需几分钟就完成系统的烧录,你们稍等片刻,也就完成了。
??烧录软件截图:
注意:一般情况下Raspbian系统是不带有SSH远程连接功能的,因此想要开启功能,需要进入烧录好的镜像系统
文件当中(通过读卡器),新建一个空白的文本文件,名为“ssh”,不需要改后缀,然后就可以进行下一步了
??插上网线,通过路由器可以得知分配给开始Raspbian的IP,然后通过SSH远程登录。
这里需要注意的是,默认用户是“pi”,密码是“raspberry”,SSH远程连接“ssh pi@192.168.1.1 ”,输入密码即可
??下面是以pi用户连接树莓派后的截图:
??一般情况下,我们都是以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:
进入文件:
vim /etc/systemd/system/getty.target.wants/getty\@tty1.service>找到: ExecStart=-/sbin/agetty --noclear %I $TERM
>改为: ExecStart=-/sbin/agetty --autologin root --noclear %I $TERM
??下图为更改配置后的截图:
??配置镜像源,是为了方便后面部署各类软件,解决依赖关系。
好在官方给出了软件镜像名单:
??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内置WiFi设备,因此只需要在网络配置文件当中,把WiFi名称和密码写进去,那么每次启动机器都会去读取文件,自动连接WiFi。
- 找到文件并写入: vim /etc/wpa_supplicant/wpa_supplicant.conf
>network={
ssid="WiFi名称"
psk="WiFi密码"
}
??由于Raspberry原产地为英国,因此键盘布局为英式键盘,许多键位都不一样,因此需要更改键盘布局,首先执行下面两个操作:
首先安装输入法配置,才可以更换键盘布局:
>apt install fcitx- 然后输入:
>raspi-config
>>进入伪图形化配置界面,选择配置“keyboard layout”,选择US键盘布局,保存后退出,重启即可。
??在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”。
下面为是所有可用方法的截图:
下面简单介绍其中比较常用的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”定义的。
??在这里需要知道的是,Python的GPIO库只能接受引脚的高低电平的变化,因此只需要接线三个引脚就好:5V电源,地线,和DO接口,我选择以“BOARD”规则定义引脚,也就是36号引脚连接MQ-2的DO口,认真对应上面给出的引脚图,下面是我接好后的图:
??MQ-2连线:
??Raspberry连线:
??接下来开始写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”,说明检测到有害气体了,下面放图,我的实验结果:
??说明模块工作正常,可以检测有害气体,并且这个程序也是基本上没有什么问题的,后面需要停止的话,按下“Ctrl+C”停止脚本运作就好了。
注意
??在Python2当中,因为语法的变化,当脚本当中有中文的情况下,在开头加上“# encoding=utf-8”;并且“print( )”方法是没有括号的,只有引号,并且异常处理后面可能有语法也不一样,需要读者注意因。
??实际在后面结合Zabbix进行数据的监控和统计,是不需要输出的,因此这里只是为了效果直观,而加进去“print( )”语句,为了达到目的,我后面会把它放在Cron计划任务当中,在一开机的时候,就开始后台执行这个程序,并且没有输出,但是会实时记录引脚的高低电平。
??对于如何获取到这个值,并以什么方式进行存储,在后面我会研究,这里可能会遇到Zabbix的二次开发的问题。
??????????????????? --------Zabbix项目部分我会在后面几个星期做好,未完待续.......
基于树莓派(Raspberry Pi)平台的MQ-2烟雾报警系统以及结合Zabbix监控的实现(一)
标签:Raspberry Pi Zabbix和嵌入式系统的结合 Python3 树莓派和MQ-2气体检测
原文地址:http://blog.51cto.com/13479737/2087546