基于纳芯微NSHT30芯片的干燥箱外循环系统
该项目使用了NSHT30、NSPAS3、带屏版的12指神探,实现了干燥箱外循环控制的设计,它的主要功能为:可以对箱体内部进行干燥,加热等功能。
标签
纳芯微
WeDesign活动
NSHT30
WeDesign6
无言的朝圣
更新2024-12-25
49

基于纳芯微NSHT30芯片的干燥箱外循环系统

一、项目介绍

本次的设计是基于纳芯微NSHT30芯片和压力传感器NSPAS3芯片进行的一次创意DIY,实现干燥箱的外循环控制,能够有效进行箱体内的干燥,并具有加温功能。

二、准备工作

本次使用的软件包括PCB设计软件KiCAD,软件编程软件thonny,编程语言选择的是micropython;

硬件开发平台:带屏版的12指神探,主控采用的是树莓派Pico核心芯片RP2040;

传感器平台包括纳芯微NSHT30芯片demo板,压力传感器NSPAS3芯片demo;

其他硬件:加热膜、加压泵、继电器模块、适配器等等。

三、任务分析

本次DIY选取的任务是干燥箱控制台,任务要求中最基本的是进行温湿度的读取和现实,这里就需要依赖于纳芯微NSHT30芯片的数据读取以及带屏版的12指神探的显示功能了,在这里我们还加入了基于压力传感器NSPAS3的大气压力显示;

需要使干燥箱可以将湿度降低到20%RH以下,这就要求我们需要有干燥手段,这里我们选择的分子筛作为湿度的吸附剂;

需要可以加温到40摄氏度并可控,这里就需要加热方式,我们选取的是加热膜作为内部加热方式,并需要有温度设置界面,而对于烘干功能实际上在满足上述加热干燥功能就能实现。

四、详细设计

1、资料搜集以及基本器件介绍


0

主控使用的是带屏版的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:


0

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更兼容于各种应用环境。主要接口如下:


0

NSPAS3NII5RRAI:


0

NSPAS3系列是纳芯微针对汽车进气歧管压力传感器市场,推出的经过校准过的绝压传感器产品。该产品采用汽车级信号调理芯片对MEMS芯体输出进行校准和补偿,能将10kPa 至400kPa的压力信号转换为可自定义输出范围(0~5V)的模拟输出信号。保证产品优异可靠性的同时,将两颗芯片进行集成封装,大大减小了封装尺寸。同时,调理过的产品可在温度范围内提供精度范围内的标准输出,免去了客户对传感器进行校准的门槛。NSPAS3N115RRA1的输出范围是10kPa 至115kPa,非常适合大气压力的检测。典型接口如下:


0

气泵:


0

气泵采用得到是大流量微型气泵,采用12V供电,额定电流800mA。

加热膜:


0

加热膜采用的是定制款,12V 60W最大功率。

2、原理图以及PCB设计

本部分主要设计三个原理图和PCB的设计,分别为温湿度传感器demo板、压力传感器demo板,十二指接口转接板。

温湿度传感器demo板参考接口图设计如下:

原理图:


0

传感器板采用独立设计,为了以后可以重复使用,尽可能将相关引脚引出,其实最主要的还是IIC接口,为了减少板子的尺寸,接口插座选用的是ZH1.5*5;

PCB图如下:


0

根据平时常用的demo板尺寸,选择了20mm*20mm板尺寸进行设计,传感器周围尽可能进行了隔断处理,不覆铜,减少热传导。

压力传感器demo板参考接口图设计如下:

原理图:


0

传感器板采用独立设计,选用的是压力传感器的基本模式,使用模拟输出,模拟量最大输出为5V,所以接口了TVS防护,电源可以不加,该款传感器的供电非常宽泛,为了减少板子的尺寸,接口插座选用的是ZH1.5*4;

PCB图如下:


0

采用标准尺寸20mm*20mm。

转接板:

原理图设计:


0

转接板就没有特别的,把主要的口进行了划分,主要还是本次使用的适配接口,其他都是扩展;

PCB设计:


0

3、系统搭建

整体系统框图如下:


0

主控板采用5V单独供电,用于整个传感器系统供电,包括控制信号;

输出控制系统都是12V供电,通过继电器模块控制;

深色为外循环气路,通过硅胶管连接,

干燥盒位于外侧,主要材质是分子筛,如果出现明显的板结后方便更换。

实际效果如下:


0

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() # 测量温湿度

循环采集传感器数据,其中温湿度为数字信号读出来的数据可以直接使用,大气压力需要进行转化,参考公式来源如下:


0

按键与页面:

页面初始化内容:

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指神探屏幕显示:

这一部分参见视频讲解.

六、心得体会

本次通过对传感器的详细资料的了解,让我们接触到了纳芯微的传感器的高性能和稳定性,作为控制系统的重要反馈数据,起到了至关重要的作用。深深的体会到一个想法从诞生到实现的艰苦历程,其中也陷入到如何选型的迷茫,不过办法总比困难多,迈出去也就解决了。本设计主要是进行一下构想的展示,还是有很多不足的,对于气路方面配置方面还是有很大的提升空间,对于热交换的应用也需要不断提升,争取做出更好的额干燥箱。

KiCad文件
使用说明
全屏
附件下载
资料合集(原理图代码参考资料).zip
包括三个测试板的原理图PCB、使用的最终代码、报告中用到的图片、开发过程中的参考资料
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号