本帖最后由 aramy 于 2025-2-8 21:13 编辑
一、项目名称: 车内环境监测系统。 二、项目概述: 伴随现代化生活,每日在车上的时间越来越长。车内环境对身体影响比重也在加大。为保障健康,对车内环境进行监测就很有必要了。 本系统以树莓派5作为主控制器,外接多个传感器。 1、MQ-3酒精探测器,与ADS1115配合使用,用于检测驾驶员是否有喝酒,酒驾作为最危险的驾驶行为必须严厉禁止。 2、MH-Z19B二氧化碳浓度传感器,二氧化碳浓度过高,容易导致疲劳、注意力下降,需要及时换气通风。 3、PM2.5空气质量传感器,这是一个可以测量PM2.5,PM1.0,PM10等颗粒物的空气质量传感器。 4、温湿度传感器STH30,用来监测温度和湿度。 5、微雪1.28寸圆形屏幕,用来展示各种信息。 电路图:
制作出实物,发现个问题,购买的ADS1115芯片,买错封装了,导致芯片无法安装,无奈之下,使用ADS1115的模块,来代替板子上的芯片的功能。
传感器中SHT30、ADS1115模块和PM2.5空气质量传感器,与树莓派使用I2C通讯,共用一组I2C接口。MH-Z19B二氧化碳浓度传感器使用串口通信,这里使用串口1。 系统使用python+C来实现。需要预先安装对应的包 - 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
复制代码
这里遇到个奇怪的问题,SHT30温湿度传感器,挂载在树莓派的I2C1总线上。通过命令查询SHT30挂载正常。但是使用python始终无法正常读取到温湿度信息。 - 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 0\n");
- 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 0\n");
- }
- else
- {
- printf("%d %d\n",(data[0] * 256 + data[1]), (data[3] * 256 + data[14]));
- }
- fflush (stdout);
- sleep(1);
- }
- }
复制代码
最终妥协为,SHT30使用C代码去读取,并用管道与python代码连接。其余传感器都是用python获取。 - # 温湿度信息由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的输出。参考着资料和网上**们的经验,使用拟合方式计算酒精浓度。公式:ppm=pow((6.467*10*V)/(5-V),(1.0/0.3962))(变量V为ADC采集到的电压值) 但是通过上边公式计算出来的值的单位是PPM,如何转换为交警同志认可的酒精血液浓度,没找到相关资料,这里仅仅使用PPM来做处理,通过实际测量,10000以下仅仅是淡淡的酒精味道,当酒味稍微浓郁一些时,空气中酒精浓度的PPM就超过10000了,程序里先使用10000作为阈值。 - #读取其它传感器 二氧化碳传感器,酒精传感器 空气质量传感器
- 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))
复制代码三、作品实物图 四、项目文档 五、视频
|