一、项目介绍
夏日炎炎,开车都是需要开空调的。汽车空调有一个内循环/外循环的选择。顾名思义,内循环就是将车内的空气通过冷却系统降温,再循环输出到车内;外循环则是将车外的空气通过冷却系统降温输送到车内。很明显两者降温的效率有明显的差别,在制冷方面,内循环明显要比外循环更有效率一些,使用内循环能更好的节约能源,即更省油。
网上有另外一种声音,说是内循环会使车内二氧化碳聚集,导致驾驶员缺氧,容易引发事故。为了驾驶员的安全建议在高速路上行驶不要使用内循环,要使用外循环。作为一个理工男,决定动手做一个二氧化碳监测装置,看看车内二氧化碳到底是怎样变化的!
二、硬件介绍
主控使用ESP32-S3_SMART_DIAL。M5Dial是一款多功能的嵌入式开发板,配备1.28寸圆形TFT触摸屏,以M5StampS3为主控(ESP32-S3@Xtensa LX7 ,8M-FLASH,WIFI,OTG\CDC功能),内置旋转编码器,可精确记录旋钮位置。此外,板载RFID检测模块,RTC电路,板载蜂鸣器以及屏下按键用于设备互动和提醒唤醒等功能。供电方面,产品设计支持宽电压6-36V直流电输入,并预留了锂电池接口和充电电路,以提供不同需求。
二氧化碳传感器使用了MH-Z19B。MH-Z19B二氧化碳气体传感器是一个通用智能小型传感器,利用非色散红外(NDIR)原理对空气中存在的CO2进行探测,具有很好的选择性和无氧气依赖性,寿命长等特点;内置温度补偿;同时具有串口输出、模拟输出及PWM输出,方便使用。该传感器是将成熟的红外吸收气体检测技术与精密光路设计、精良电路设计紧密结合而制作出的高性能传感器。
三、系统设计
M5Dial功能非常强大,M5Dial提供了1.28寸的彩线屏幕,直接使用这块显示屏来显示车内二氧化碳浓度。MH-Z19B传感器提供串口(UART)、模拟(DAC)、PWM波形等输出方式,这里选用串口与M5Dial连接。
系统整体构架很简单,主控和二氧化碳传感器都是使用了模块化的设计,所以只需要将不同的模块连接起来就可以了。M5Dial底部有两个Grove的接口,我这里使用2.0mm的排母,直接接上去,只使用了A接口。MH-Z19B在模块两端,预留了排针接口,这里也是使用2.54mm的排母进行连接。
PCB的设计这里考虑了这几个方面。PCB既是连接主控和传感器的桥梁,同时也是这个系统的骨架,需要同时固定M5Dial和MH-Z19B模块,并且要在车内好摆放。于是PCB我选用强度更大的铝基板,外形设计成球拍状,下部的柄的宽度设计的与车内安装手机支架的位置正好匹配,能够方便地插入车机上的手机支架的卡槽中。上边球拍部分,留有螺丝孔,用螺丝将M5Dial牢牢固定。并且在球拍中间开了个大圆孔,M5Dial在这个位置上有个隐藏的按键,在编程时出现死机情况可以按这个按键强行烧写程序。
打样、焊接、安装。还不错,算是严丝合缝。
四、系统编程
软件使用arduino编程。编程工具Vscode+platformio。传感器使用了第三方的库文件。参考着例程实现了MH-Z19B模块的读取和校正。这个MH-Z19B模块校正还挺有意思的,看它校正过程,感觉应该是使用自然环境中二氧化碳浓度为400ppm的均值这个特性,设置一个400ppm的参考点,然后读取的数据都和这个值作比较,得出相对的二氧化碳浓度。
[env:m5stack-stamps3]
platform = espressif32
board = m5stack-stamps3
framework = arduino
platform_packages = framework-arduinoespressif32@https://github.com/espressif/arduino-esp32/archive/refs/tags/2.0.14.zip
upload_speed = 115200
monitor_speed = 115200
; 指定FLASH和PSRAM的运行模式
board_build.arduino.memory_type = qio_opi
build_flags =
-DARDUINO_USB_CDC_ON_BOOT=1
-DBOARD_HAS_PSRAM
lib_deps =
strange-v/MHZ19 @ ^1.1.2
这里需要注意一点,ESP32-S3的串口有三个,串口0映射到USB口了,编程是用来显示系统运行的一些信息。和MH-Z19B模块连接这里使用了串口1。默认串口1 对应的管脚是 TX1-13,RX1-15。但是我这里MH-Z19B模块连接的分别是 TX1-16,RX1-15,所以需要重新设置一下对应关系。
从MH-Z19B模块读取到二氧化碳浓度和温度信息,然后在屏幕上进行显示。二氧化碳浓度单位使用的是ppm,当浓度小于450ppm时,空气质量优,使用绿色显示;在1000ppm时,使用翠绿色,1000ppm~2000ppm之间时使用黄色,超过2000ppm时,使用红色显示。每20秒更新一次数据。当按键被按下时,就对MH-Z19B模块进行校准。
void dispCO2(u16_t co2val, int8_t temp)
{
if (co2val <= 450)
{ // 优
M5Dial.Display.setTextColor(GREEN);
}
else if (co2val <= 1000)
{ // 良
M5Dial.Display.setTextColor(GREENYELLOW);
}
else if (co2val <= 2000)
{ // 一般
M5Dial.Display.setTextColor(YELLOW);
}
else if (co2val <= 5000)
{ // 差
M5Dial.Display.setTextColor(RED);
}
M5Dial.Display.setTextFont(&fonts::Orbitron_Light_32);
M5Dial.Display.setTextSize(2);
M5Dial.Display.drawString(String(co2val),
M5Dial.Display.width() / 2,
M5Dial.Display.height() / 2);
M5Dial.Display.setTextSize(1);
M5Dial.Display.drawString(String(temp),
M5Dial.Display.width() / 2,
M5Dial.Display.height() / 2 + 80);
M5Dial.Display.setTextFont(&fonts::FreeSerifBoldItalic9pt7b);
// M5Dial.Display.setTextSize(1);
M5Dial.Display.setTextColor(BLUE);
M5Dial.Display.drawString("CO2(ppm)",
70,
M5Dial.Display.height() / 2 - 70);
}
五、效果展示
这是办公室内的二氧化碳浓度。
这是空调内循环,车上两个人,行车10分钟和20分钟的值。
开窗两分钟后二氧化碳浓度迅速下降。
行车时开启着外循环,二氧化碳浓度就上升比较缓慢了。
早起卧式空气中二氧化碳浓度(关窗关门开空调)
由此自己的到的结论是,长时间开车还是需要适当的通风。卧室等地方也是需要及时通风,这样才能更加有效地提升注意力。
六、心得体会:
很开心参加电子森林举办的FASTBOND第三季活动,给自己了一个动手实践的机会。现在是信息时代,很多信息单凭自己的主观感受很难准确认知。还是通过客观地验证一遍才能够更好滴认识了解这个世界。