前言
使用树莓派+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 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长时间通电情况下故障的可能性
最后运行一下脚本,查看一下数据是否正常获取即可