一、項目名稱:
二、項目概述:


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};
// 循環(huán)讀取sht30數(shù)據(jù)
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 ===") #跳出
酒精監(jiān)測也是本項目重點關注的點。使用半導體MQ-3酒精傳感器。MQ-3酒精傳感器所使用的氣敏材料是在清潔空氣中電導率較低的二氧化錫(SnO2)。當酒精傳感器所處環(huán)境中存在酒精蒸汽時,氣體傳感器的電導率隨空氣中酒精氣體濃度的增加而增大。使用簡單的電路即可將電導率的變化轉換為與該氣體濃度相對應的輸出信號。由于樹莓派沒有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))
三、作品實物圖








四、項目文檔
參考附件