基于纳芯微NSHT30芯片的干燥箱外循环系统
一、项目介绍
本次的设计是基于纳芯微NSHT30芯片和压力传感器NSPAS3芯片进行的一次创意DIY,实现干燥箱的外循环控制,能够有效进行箱体内的干燥,并具有加温功能。
二、准备工作
本次使用的软件包括PCB设计软件KiCAD,软件编程软件thonny,编程语言选择的是micropython;
硬件开发平台:带屏版的12指神探,主控采用的是树莓派Pico核心芯片RP2040;
传感器平台包括纳芯微NSHT30芯片demo板,压力传感器NSPAS3芯片demo;
其他硬件:加热膜、加压泵、继电器模块、适配器等等。
三、任务分析
本次DIY选取的任务是干燥箱控制台,任务要求中最基本的是进行温湿度的读取和现实,这里就需要依赖于纳芯微NSHT30芯片的数据读取以及带屏版的12指神探的显示功能了,在这里我们还加入了基于压力传感器NSPAS3的大气压力显示;
需要使干燥箱可以将湿度降低到20%RH以下,这就要求我们需要有干燥手段,这里我们选择的分子筛作为湿度的吸附剂;
需要可以加温到40摄氏度并可控,这里就需要加热方式,我们选取的是加热膜作为内部加热方式,并需要有温度设置界面,而对于烘干功能实际上在满足上述加热干燥功能就能实现。
四、详细设计
1、资料搜集以及基本器件介绍
主控使用的是带屏版的12指神探,配备了一块240*240分辨率的LCD彩屏以及两个可程控按键和一个拨轮,丰富了人机交互功能,方便信息观察、界面切换等使用方式。这个模块是通过Type C的USB接口提供供电、下载以及通信的功能,板上有5V转3.3V,最高支持800mA的电压变换器,在12根引脚上也将5V和3.3V引出,方便对其它外设板供电。采用树莓派Pico核心芯片RP2040,可以运行到133MHz,例程丰富便于开发,扩展接口包含5v、3.3v输出、GND、9个GPIO,可同时使能最多三个通道ADC。电子森林网站上有丰富的教程和例程,可以让大家非常快速的上手。
纳芯微传感器是本次的重要反馈器件,本次使用了纳芯微NSHT30芯片和压力传感器NSPAS3芯片,接下来我们一起看一下:
NSHT30-QDNR:
NSHT30是一种具有IPC接口的相对湿度和温度传感器。它是基于NOVOSENSE新湿度和温度平台的CMOSMEMS传感器芯片。NSHT30将电容式相对湿度传感器、CMOS温度传感器、信号处理器和高速l2C接口集成在单个芯片中,并封装在小型DFN封装中。DEN封装的外形长度仅为2.5毫米,宽度为2.5毫米,高度为0.9毫米。这使得NSHT30可以更广泛地集成到各种应用中。此外,12C接口具有两个独特的可选IPC地址和高达1 MHz的通信速度,宽电源电压范围从2 V到5.5 V,使NSHT30更兼容于各种应用环境。主要接口如下:
NSPAS3NII5RRAI:
NSPAS3系列是纳芯微针对汽车进气歧管压力传感器市场,推出的经过校准过的绝压传感器产品。该产品采用汽车级信号调理芯片对MEMS芯体输出进行校准和补偿,能将10kPa 至400kPa的压力信号转换为可自定义输出范围(0~5V)的模拟输出信号。保证产品优异可靠性的同时,将两颗芯片进行集成封装,大大减小了封装尺寸。同时,调理过的产品可在温度范围内提供精度范围内的标准输出,免去了客户对传感器进行校准的门槛。NSPAS3N115RRA1的输出范围是10kPa 至115kPa,非常适合大气压力的检测。典型接口如下:
气泵:
气泵采用得到是大流量微型气泵,采用12V供电,额定电流800mA。
加热膜:
加热膜采用的是定制款,12V 60W最大功率。
2、原理图以及PCB设计
本部分主要设计三个原理图和PCB的设计,分别为温湿度传感器demo板、压力传感器demo板,十二指接口转接板。
温湿度传感器demo板参考接口图设计如下:
原理图:
传感器板采用独立设计,为了以后可以重复使用,尽可能将相关引脚引出,其实最主要的还是IIC接口,为了减少板子的尺寸,接口插座选用的是ZH1.5*5;
PCB图如下:
根据平时常用的demo板尺寸,选择了20mm*20mm板尺寸进行设计,传感器周围尽可能进行了隔断处理,不覆铜,减少热传导。
压力传感器demo板参考接口图设计如下:
原理图:
传感器板采用独立设计,选用的是压力传感器的基本模式,使用模拟输出,模拟量最大输出为5V,所以接口了TVS防护,电源可以不加,该款传感器的供电非常宽泛,为了减少板子的尺寸,接口插座选用的是ZH1.5*4;
PCB图如下:
采用标准尺寸20mm*20mm。
转接板:
原理图设计:
转接板就没有特别的,把主要的口进行了划分,主要还是本次使用的适配接口,其他都是扩展;
PCB设计:
3、系统搭建
整体系统框图如下:
主控板采用5V单独供电,用于整个传感器系统供电,包括控制信号;
输出控制系统都是12V供电,通过继电器模块控制;
深色为外循环气路,通过硅胶管连接,
干燥盒位于外侧,主要材质是分子筛,如果出现明显的板结后方便更换。
实际效果如下:
4、软件开发
本次的软件设计主要包括按键采集与页面控制、传感器采集量大部分。
传感器的数据采集初始化:
# 创建温湿度传感器对象
i2c = I2C(1, sda=Pin(22),scl=Pin(23), freq=100000)
sht = NSHT30.SHT30(i2c,0,0,0x44) # 0x44是模块的I2C地址
adc = ADC(Pin(28))
from machine import Pin, SPI, ADC,PWM,I2C
import test.sht30 as NSHT30
这里用到了sht30的驱动库,这还是很方面的,基本上通用,更改一下地址就可以,压力的采集是ADC输入,属于基本模块,配置即可;
算法部分:
data_pre = (adc.read_u16()/3*5/65535+0.00095)/0.008095
if sht.is_present():
data_tem,data_hum = sht.measure() # 测量温湿度
循环采集传感器数据,其中温湿度为数字信号读出来的数据可以直接使用,大气压力需要进行转化,参考公式来源如下:
按键与页面:
页面初始化内容:
import uos
import test.st7789 as st7789
from test.fonts import vga2_8x8 as font1
from test.fonts import vga1_16x32 as font2
from machine import Pin, SPI, ADC,PWM,I2C
#image_file0 = "/logo.bin" #图片文件地址
st7789_res = 0
st7789_dc = 1
disp_width = 240
disp_height = 240
CENTER_Y = int(disp_width/2)
CENTER_X = int(disp_height/2)
spi_sck=Pin(2)
spi_tx=Pin(3)
spi0=SPI(0,baudrate=4000000, phase=1, polarity=1, sck=spi_sck, mosi=spi_tx)
display = st7789.ST7789(spi0, disp_width, disp_width,
reset=machine.Pin(st7789_res, machine.Pin.OUT),
dc=machine.Pin(st7789_dc, machine.Pin.OUT),
xstart=0, ystart=0, rotation=0)
display.fill(st7789.BLACK)
display.fill_rect(10,10,220,40,st7789.BLUE)
display.fill_rect(100,200,40,40,st7789.RED)
# 页面索引
Tset_PAGE = 0
Set_PAGE = 1
# 当前页面
current_page = Tset_PAGE
# 菜单索引
menu_index = 0
Page_RefreshCnt = 0
def Show_TEST_PAGE(closeOropen):
if closeOropen:
display.text(font2, "TEST_PAGE", 45, 15,color=st7789.BLACK,background=st7789.BLUE)
display.text(font1, "Tem:", 40, 60,color=st7789.BLUE)
display.text(font1, "Hum:", 40, 100,color=st7789.BLUE)
display.text(font1, "Pre:", 40, 140,color=st7789.BLUE)
else:
display.text(font2, "TEST_PAGE", 45, 15,color=st7789.BLUE,background=st7789.BLUE)
display.text(font1, "Tem:", 40, 60,color=st7789.BLACK)
display.text(font1, "Hum:", 40, 100,color=st7789.BLACK)
display.text(font1, "Pre:", 40, 140,color=st7789.BLACK)
display.text(font2, " ", 80, 60,st7789.BLUE)
display.text(font2, " ", 80, 100,st7789.BLUE)
display.text(font2, " ", 80, 140,st7789.BLUE)
def Show_SET_PAGE(closeOropen):
if closeOropen:
display.text(font2, "SET_PAGE", 45, 15,color=st7789.BLACK,background=st7789.BLUE)
display.text(font1, "Tem:", 40, 60,color=st7789.YELLOW)
display.text(font1, "Hum:", 40, 100,color=st7789.YELLOW)
display.text(font2, str(dataset_tem), 80, 60,st7789.YELLOW)
display.text(font2, str(dataset_hum), 80, 100,st7789.YELLOW)
else:
display.text(font2, "SET_PAGE", 45, 15,color=st7789.BLUE,background=st7789.BLUE)
display.text(font1, "Tem:", 40, 60,color=st7789.BLACK)
display.text(font1, "Hum:", 40, 100,color=st7789.BLACK)
display.text(font2, str(dataset_tem), 80, 60,st7789.BLACK)
display.text(font2, str(dataset_hum), 80, 100,st7789.BLACK)
Show_TEST_PAGE(1)
按键初始化内容:
confirm_pressed = False
return_pressed = False
up_pressed = False
down_pressed = False
center_pressed = False
confirm_btn = Pin(5,Pin.IN, Pin.PULL_UP) #B
return_btn = Pin(6,Pin.IN, Pin.PULL_UP) #A
up_btn = Pin(7,Pin.IN, Pin.PULL_UP) #A
center_btn = Pin(8,Pin.IN, Pin.PULL_UP) #A
down_btn = Pin(9,Pin.IN, Pin.PULL_UP) #A
驱动的控制部分:
motopin = machine.Pin(24, machine.Pin.OUT)
motopin.value(0)
heatpin = machine.Pin(25, machine.Pin.OUT)
heatpin.value(0)
接下来就是按键和页面以及控制的联动:
while True:
# 按键状态更新
confirm_pressed = not confirm_btn.value()
return_pressed = not return_btn.value()
up_pressed = not up_btn.value()
down_pressed = not down_btn.value()
center_pressed = not center_btn.value()
data_pre = (adc.read_u16()/3*5/65535+0.00095)/0.008095
if sht.is_present():
data_tem,data_hum = sht.measure() # 测量温湿度
Page_RefreshCnt = Page_RefreshCnt+1
if Page_RefreshCnt >= 10:
Page_RefreshCnt = 0
if current_page == Tset_PAGE:
round_temp=round(data_tem,1)
display.text(font2, str(round_temp), 80, 60,st7789.BLUE)
round_huml=round(data_hum,1)
display.text(font2, str(round_huml), 80, 100,st7789.BLUE)
round_pre=round(data_pre,2)
display.text(font2, str(round_pre)+" ", 80, 140,st7789.BLUE)
if current_page == Tset_PAGE:
if confirm_pressed and not WorkState:
WorkState = 1
display.fill_rect(100,200,40,40,st7789.GREEN)
elif confirm_pressed and WorkState:
WorkState = 0
HeatState = 0
heatpin.value(0)
MotoState = 0
motopin.value(0)
display.fill_rect(100,200,40,40,st7789.RED)
time.sleep(0.2) # 延迟一段时间以避免按键的抖
if data_tem> dataset_tem+5 and HeatState and WorkState:
HeatState = 0
heatpin.value(0)
elif data_tem < dataset_tem and not HeatState and WorkState:
HeatState = 1
motopin.value(1)
heatpin.value(1)
if data_hum> data_hum-2 and MotoState and not HeatState and WorkState:
MotoState = 0
motopin.value(0)
elif data_hum > data_hum and not MotoState and not HeatState and WorkState:
MotoState = 1
motopin.value(1)
if return_pressed:
Show_TEST_PAGE(0)
current_page = Set_PAGE
menu_index = 0
Show_SET_PAGE(1)
time.sleep(0.2) # 延迟一段时间以避免按键的抖
elif current_page == Set_PAGE:
if confirm_pressed:
Show_SET_PAGE(0)
current_page = Tset_PAGE
Show_TEST_PAGE(1)
time.sleep(0.2) # 延迟一段时间以避免按键的抖
elif return_pressed:
if menu_index:
menu_index = 0
else:
menu_index = 1
time.sleep(0.2) # 延迟一段时间以避免按键的抖
elif up_pressed and menu_index:
dataset_tem -= 1
display.text(font2, str(dataset_tem), 80, 60,st7789.YELLOW)
time.sleep(0.2) # 延迟一段时间以避免按键的抖
elif up_pressed and not menu_index:
dataset_hum -= 1
display.text(font2, str(dataset_hum), 80, 100,st7789.YELLOW)
time.sleep(0.2) # 延迟一段时间以避免按键的抖
elif down_pressed and menu_index:
dataset_tem += 1
display.text(font2, str(dataset_tem), 80, 60,st7789.YELLOW)
time.sleep(0.2) # 延迟一段时间以避免按键的抖
elif down_pressed and not menu_index:
dataset_hum += 1
display.text(font2, str(dataset_hum), 80, 100,st7789.YELLOW)
time.sleep(0.2) # 延迟一段时间以避免按键的抖
五、效果展示
运行过程中的12指神探屏幕显示:
这一部分参见视频讲解.
六、心得体会
本次通过对传感器的详细资料的了解,让我们接触到了纳芯微的传感器的高性能和稳定性,作为控制系统的重要反馈数据,起到了至关重要的作用。深深的体会到一个想法从诞生到实现的艰苦历程,其中也陷入到如何选型的迷茫,不过办法总比困难多,迈出去也就解决了。本设计主要是进行一下构想的展示,还是有很多不足的,对于气路方面配置方面还是有很大的提升空间,对于热交换的应用也需要不断提升,争取做出更好的额干燥箱。