一、项目名称:
二、项目概述:


pip install spidev
pip install numpy
pip install smbus
pip install rpi.gpio
pip install getrpimodel
pip install gpiozero
pip install pillow
pip install pyserial
pip install getrpimodel
pip install getrpimodel
pip3 install adafruit-circuitpython-ads1x15


import time
import smbus
BUS = smbus.SMBus(1)
addr=0x44# sht30
def read_value():
BUS.write_byte_data(addr,0xe0,0x0)
time.sleep(1)
data = BUS.read_i2c_block_data(addr,0x0,6)
rawT = ((data[0]) << 8) | (data[1])
rawR = ((data[3]) << 8) | (data[4])
temp = -45 + rawT * 175 / 65535
RH = 100 * rawR / 65535
return temp,RH
def init_sht30():
try:
BUS.write_byte_data(addr,0x23,0x34)
time.sleep(0.5)
except:
return False
else:
return True
if __name__ == '__main__':
init_sht30()
while True:
temp,rh=read_value()
strtemp="{:.1f}".format(temp)
strrh="{:.1f}".format(rh)
print(strtemp,strrh)
time.sleep(1)
焊接的芯片,一直怀疑是硬件问题,更换了芯片也是问题依旧。后来使用C去读取传感器,就一切正常,原因还是没能找到
#include <stdio.h>
#include <stdlib.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#include <fcntl.h>
void main()
{
// Create I2C bus
int file;
char *bus = "/dev/i2c-1";
if ((file = open(bus, O_RDWR)) < 0)
{
printf("0 0n");
exit(1);
}
char config[2] = {0x2C,0x06};
char data[6] = {0};
// 循环读取sht30数据
while(1){
// Get I2C device, SHT30 I2C address is 0x44(68)
ioctl(file, I2C_SLAVE, 0x44);
write(file, config, 2);
sleep(1);
// Read 6 bytes of data
// Temp msb, Temp lsb, Temp CRC, Humididty msb, Humidity lsb, Humidity CRC
if(read(file, data, 6) != 6)
{
printf("0 0n");
}
else
{
printf("%d %dn",(data[0] * 256 + data[1]), (data[3] * 256 + data[14]));
}
fflush (stdout);
sleep(1);
}
}

# 温湿度信息由SHT30提供,使用线程 通过管道获取
class Sht30(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.sht =Popen('sht30',shell=True,stdin=PIPE,stdout=PIPE)
def run(self):
while True:
line = self.sht.stdout.readline()
if not line: #空则跳出
break
# print(type(line.decode("GBK").replace('n', '').split()),line.decode("GBK").replace('n', '').split())
valuelist=line.decode("GBK").replace('n', '').split()
airinfo['temperature']=-45 + (175 * int(valuelist[0]) / 65535.0)
airinfo['humidity'] = 100 * int(valuelist[0]) / 65535.0;
print("look up!!! EXIT ===") #跳出
酒精监测也是本项目重点关注的点。使用半导体MQ-3酒精传感器。MQ-3酒精传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当酒精传感器所处环境中存在酒精蒸汽时,气体传感器的电导率随空气中酒精气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。由于树莓派没有ADC的电路,这里使用ADS1115,一个10位的AD转换芯片来读取MQ-3的输出。

#读取其它传感器 二氧化碳传感器,酒精传感器 空气质量传感器
airqualitysensor = DFRobot_AirQualitySensor()
i2c = busio.I2C(board.SCL, board.SDA)
ads = ADS.ADS1015(i2c)
alcoholval = AnalogIn(ads, ADS.P3) #使用P3管脚
def readDevice():
#读取二氧化碳传感器 单位 PPM
co2dic=read_all()
airinfo['co2']=co2dic['co2']
#读取空气质量信息 单位 指定颗粒物类型的浓度 PM1.0 PM2.5 PM10 浓度(ug/m3)
airinfo['PM25']=airqualitysensor.read_standard()
#酒精浓度 大致为 ppm=pow((6.467*10*V)/(5-V),(1.0/0.3962)) 单位ppm
airinfo['alcohol']=pow((6.467*10*alcoholval.voltage)/(5.0-alcoholval.voltage),(1.0/0.3962))
# print("{:>5}t{:>5.3f}".format(alcoholval.value, alcoholval.voltage))
三、作品实物图








四、项目文档
参考附件