• 方案介紹
    • 一、項目名稱:
    • 二、項目概述:
    • 三、作品實物圖
    • 四、項目文檔
    • 五、視頻
  • 附件下載
  • 相關推薦
申請入駐 產業(yè)圖譜

車內環(huán)境監(jiān)控

05/28 14:30
132
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

carairinfo.zip

共1個文件

一、項目名稱:

車內環(huán)境監(jiān)測系統(tǒng)。

二、項目概述:

伴隨現(xiàn)代化生活,每日在車上的時間越來越長。車內環(huán)境對身體影響比重也在加大。為保障健康,對車內環(huán)境進行監(jiān)測就很有必要了。
本系統(tǒng)以樹莓派5作為主控制器,外接多個傳感器
1、MQ-3酒精探測器,與ADS1115配合使用,用于檢測駕駛員是否有喝酒,酒駕作為最危險的駕駛行為必須嚴厲禁止。
2、MH-Z19B二氧化碳濃度傳感器,二氧化碳濃度過高,容易導致疲勞、注意力下降,需要及時換氣通風。
3、PM2.5空氣質量傳感器,這是一個可以測量PM2.5,PM1.0,PM10等顆粒物的空氣質量傳感器。
4、溫濕度傳感器STH30,用來監(jiān)測溫度和濕度。
5、微雪1.28寸圓形屏幕,用來展示各種信息。

 

制作出實物,發(fā)現(xiàn)個問題,購買的ADS1115芯片,買錯封裝了,導致芯片無法安裝,無奈之下,使用ADS1115的模塊,來代替板子上的芯片的功能。

 

傳感器中SHT30、ADS1115模塊和PM2.5空氣質量傳感器,與樹莓派使用I2C通訊,共用一組I2C接口。MH-Z19B二氧化碳濃度傳感器使用串口通信,這里使用串口1。
軟件部分:
系統(tǒng)使用python+C來實現(xiàn)。需要預先安裝對應的包
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};
        // 循環(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);
        }
}
最終妥協(xié)為,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 ===")   #跳出

酒精監(jiān)測也是本項目重點關注的點。使用半導體MQ-3酒精傳感器。MQ-3酒精傳感器所使用的氣敏材料是在清潔空氣中電導率較低的二氧化錫(SnO2)。當酒精傳感器所處環(huán)境中存在酒精蒸汽時,氣體傳感器的電導率隨空氣中酒精氣體濃度的增加而增大。使用簡單的電路即可將電導率的變化轉換為與該氣體濃度相對應的輸出信號。由于樹莓派沒有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 多家優(yōu)質品牌制造商的 1,020 多萬種元器件獲得了強大的技術優(yōu)勢。DigiKey 還為工程師、設計師、開發(fā)者和采購專業(yè)人員提供豐富的數(shù)字解決方案、無障礙互動和工具支持,以幫助他們提升工作效率。在中國,客戶可以通過電子郵件、電話和客服獲得全方位技術支持。如需了解更多信息和獲取 DigiKey 廣泛的產品,請訪問 www.digikey.cn 并關注我們的微信、微博、騰訊視頻和 BiliBili 賬號。

DigiKey 總部位于美國明尼蘇達州錫夫里弗福爾斯市,是一家獲得原廠授權的全球性、全類目電子元器件和自動化產品分銷商。我們通過分銷來自 2,300 多家優(yōu)質品牌制造商的 1,020 多萬種元器件獲得了強大的技術優(yōu)勢。DigiKey 還為工程師、設計師、開發(fā)者和采購專業(yè)人員提供豐富的數(shù)字解決方案、無障礙互動和工具支持,以幫助他們提升工作效率。在中國,客戶可以通過電子郵件、電話和客服獲得全方位技術支持。如需了解更多信息和獲取 DigiKey 廣泛的產品,請訪問 www.digikey.cn 并關注我們的微信、微博、騰訊視頻和 BiliBili 賬號。收起

查看更多

相關推薦