• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

基于树莓派5的车内环境监控系统

05/28 14:30
764
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

carairinfo.zip

共1个文件

一、项目名称:

车内环境监测系统。

二、项目概述:

伴随现代化生活,每日在车上的时间越来越长。车内环境对身体影响比重也在加大。为保障健康,对车内环境进行监测就很有必要了。
本系统以树莓派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 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使用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))

三、作品实物图

四、项目文档

参考附件

五、视频

  • carairinfo.zip
    下载
DigiKey得捷

DigiKey得捷

DigiKey 总部位于美国明尼苏达州锡夫里弗福尔斯市,是一家获得原厂授权的全球性、全类目电子元器件和自动化产品分销商。我们通过分销来自 2,300 多家优质品牌制造商的 1,020 多万种元器件获得了强大的技术优势。DigiKey 还为工程师、设计师、开发者和采购专业人员提供丰富的数字解决方案、无障碍互动和工具支持,以帮助他们提升工作效率。在中国,客户可以通过电子邮件、电话和客服获得全方位技术支持。如需了解更多信息和获取 DigiKey 广泛的产品,请访问 www.digikey.cn 并关注我们的微信、微博、腾讯视频和 BiliBili 账号。

DigiKey 总部位于美国明尼苏达州锡夫里弗福尔斯市,是一家获得原厂授权的全球性、全类目电子元器件和自动化产品分销商。我们通过分销来自 2,300 多家优质品牌制造商的 1,020 多万种元器件获得了强大的技术优势。DigiKey 还为工程师、设计师、开发者和采购专业人员提供丰富的数字解决方案、无障碍互动和工具支持,以帮助他们提升工作效率。在中国,客户可以通过电子邮件、电话和客服获得全方位技术支持。如需了解更多信息和获取 DigiKey 广泛的产品,请访问 www.digikey.cn 并关注我们的微信、微博、腾讯视频和 BiliBili 账号。收起

查看更多

相关推荐