使用Zabbix监控机房温湿度(二)

前言

使用树莓派+zabbix监控机房温湿度已经有一段时间(见此文章),中间还遇上封控在家两个多月,结果不知道是出于什么原因,封控期间SHT30,挂了。。。
其实这个问题不止一次出现过,但是由于当时人在公司,只要简单插拔下SHT30和树莓派链接的3.3V线即可。
但是由于在封控期间去不了公司,SHT30挂了后无法人工恢复,重启树莓派也无法恢复,查找资料发现,1 号和 17 号引脚提供 3.3V 电源,而 2 号和 4 号引脚提供 5V 电源。当打开树莓派时,这些引脚便会提供恒定功率,并且无论在何种条件下,这几个引脚都是不可编程的。
所以如果要控制SHT30的电源输入,就必须想办法使用其他方式

安装WiringPi

为了方便调试,首先安装gpio
由于自带的gpio版本,兼容性等问题可能安装不上,可以选择从源码安装

git clone https://github.com/WiringPi/WiringPi.git
cd WiringPi
./build

经过等待,输出Success即表示成功,我们使用gpio -v 检查下版本
检查gpio版本
然后使用gpio readall 查看所有引脚的情况
所有引脚情况
其中BCM编码为2 3 4 就是这次我们需要使用的引脚
可以用gpio命令来操作带BCM编号的引脚
不带BCM就是接地或者电源输出,这些引脚无法操作

$ GPIO -v                            #查看库的版本信息
$ GPIO -g                            #使用BCMYGPIO引脚数而不是WiRIPPI引脚数。注:BCM\ GPIO引脚号始终与export和edge命令一起使用。
$ GPIO -1                            #使用物理管脚号而不是wiringPi管脚号。注意:这仅适用于P1接头。不可能以这种方式使用第2版P5连接器上的插脚,与-g一样,BCM\ GPIO插脚号始终与export和edge命令一起使用。
$ GPIO -x extension                  #签名用于简单的测试和诊断目的,但可以在shell脚本中用于对GPIO管脚的一般控制(如果有点慢)。它还可以控制PiFace IO板上的IO,并在需要时加载SPI和I2C内核模块。此外,它还可以用于设置/sys/class/gpio系统目录中的导出,以允许后续程序使用/sys/class/gpio接口而无需运行作为根。
$ GPIO -p                            #使用PiFace接口板及其对应的管脚号。在gpio命令中,PiFace总是出现在pin编号200处。不过,您可以在自己的程序中指定任何您喜欢的pin码。
$ GPIO read <pin>                    #读取给定管脚的数字值并打印0或1以表示各自的逻辑电平。
$ GPIO write <pin> <value>           #将给定值(0或1)写入引脚。您需要先将引脚设置为输出模式。
$ GPIO toggle <pin>                  #更改GPIO引脚的状态;0到1,或1到0。
$ GPIO blink <pin>                   #打开/关闭给定的pin。按Control-C退出。注意:这个命令显式地将pin设置为输出模式。
$ GPIO aread <pin>                   #读取给定引脚的模拟值。这需要与-x标志一起使用,以添加处理模拟输入的扩展。
$ GPIO awrite <pin> <value>          #将模拟值写入给定引脚。这需要与-x标志一起使用,以添加处理模拟输入的扩展。
$ GPIO wb <value>                    #将给定字节写入8个主GPIO引脚。可以在它前面加上0x来指定十六进制数。您需要先将管脚设置为输出模式。
$ GPIO readall                       #输出所有GPIO引脚值的表格。这些值表示管脚处于输入模式时读取的实际值,或管脚处于输出模式时写入的最后一个值。
$ GPIO pwm <pin> <value>             #将PWM值(0-1023)写入给定引脚。引脚需要先进入PWM模式。
$ GPIO clock <pin> <frequency>       #设置给定引脚的输出频率。引脚需要先进入时钟模式。
$ GPIO mode <pin> <mode>             #将引脚设置为输入、输出或pwm模式。还可以使用文字up、down或tri设置内部上拉、下拉或三态(off)控件。
$ GPIO unexportall                   #取消导出/sys/class/GPIO目录中的所有GPIO管脚。
$ GPIO exports                       #打印所有导出的GPIO管脚及其当前值的列表(如果有)。
$ GPIO export                        #在/sys/class/GPIO目录中导出GPIO pin。像上面的mode命令一样使用,但是此时只支持in、out、high和low。请注意,管脚编号是BCM\ GPIO编号,而不是wiringPi编号。在导出到输出模式的同时,high和low命令预先设置输出值。
$ GPIO edge                          #这将导出/sys/class/GPIO目录中的GPIO引脚,将方向设置为input,并将edge interrupt method设置为none、rising、falling或both。与上面的export命令一样使用,请注意,使用的是BCM\U GPIO引脚编号,而不是wiringPi引脚编号。
$ GPIO unexport                      #取消导出/sys/class/GPIO目录中的GPIO pin。
$ GPIO wfi <pin> <mode>              #这会将给定的引脚设置为提供的中断模式:上升、下降或两者兼有,然后等待中断发生。这是一个非繁忙的等待,所以不消耗和CPU,而它的等待。
$ GPIO drive                         #将给定焊盘组的焊盘驱动器值更改为提供的驱动器值。组为0、1或2,值为0-7。不要使用,除非你绝对确定你知道你在做什么。
$ GPIO usbp gigh/low                 #将USB限流器更改为高(1.2安培)或低(默认值为600毫安)这仅适用于B+型和B v2型。     
$ GPIO pwm-bal/wpm-ms                #将PWM模式更改为平衡(默认)或标记:空间比(传统)
$ GPIO pwmr                          #更改PWM范围寄存器。默认值为1024。
$ GPIO gbr <channel>                 #这将读取给定通道上Gertboard上的模数转换器。板跳线需要就位才能执行此操作。
$ GPIO gbw <channel value>           #这会将提供的值写入Gertboards SPI数模转换器的输出通道。板跳线需要就位才能执行此操作。

示例

$ gpio mode 4 output       #将引脚4设置为输出
$ gpio -g mode 23 output   #将GPIO引脚23设置为输出
$ gpio mode 1 pwm          #将引脚1设置为PWM模式
$ gpio pwm 1 512           #将引脚1的pwm值设置为512
$ gpio export 17 out       #将GPIO引脚17设置为output
$ gpio export 0 in         #将个屁哦引脚0(SDA0)设置为input
$ gpio -g read 0           #读取GPIO引脚0(SDA0)

重新链接SHT30

将SHT30 VCC接到BCM 4 号引脚,即原来接到3.3V的线拔下,接到GPIO7,如图所示
接线

更改程序

默认已经安装了gpio.rpi库

import smbus
import time
import RPi.GPIO as GPIO
# Set GPIO to Output and initial high level
GPIO.setmode(GPIO.BCM)
GPIO.setup(4,GPIO.OUT,initial=GPIO.HIGH)
time.sleep(0.1)
# Get I2C bus
bus = smbus.SMBus(1)
# SHT30 address, 0x44(68)
bus.write_i2c_block_data(0x44, 0x2C, [0x06])
time.sleep(0.5)
# SHT30 address, 0x44(68)
# Read data back from 0x00(00), 6 bytes
# Temp MSB, Temp LSB, Temp CRC, Humididty MSB, Humidity LSB, Humidity CRC
data = bus.read_i2c_block_data(0x44, 0x00, 6)
# Convert the data
temp = data[0] * 256 + data[1]
Temp = -45 + (175 * temp / 65535.0)
Humi = 100 * (data[3] * 256 + data[4]) / 65535.0
newTemp = round(Temp,2)
newHumi = round(Humi,2)
# Write data to log
file_handle=open('/usr/local/zabbix/temhum.log',mode='w')
file_handle.write(str(newTemp)+'\n'+str(newHumi)+'\n')
file_handle.close()
# Set GPIO to low level
GPIO.setup(4,GPIO.IN)

相较于上一篇文章,增加了gpio控制,在读取SHT30数据前先给它上电GPIO.setup(4,GPIO.OUT,initial=GPIO.HIGH),然后数据写入log后再断电GPIO.setup(4,GPIO.IN)
这样在不获取数据时,SHT30就处于断电状态,只有获取数据才会上电,避免了SHT30长时间通电情况下故障的可能性
最后运行一下脚本,查看一下数据是否正常获取即可

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×