基于纳芯微NSHT30-QDNR&NSPAS3NII5RPAI芯片设计环境检测桌搭
该项目使用了KiCad软件、MicroPython语言,实现了一个RP2040系统板的设计,它的主要功能为:利用温湿度传感器采集环境的温度和湿度,通过I2C协议把输入发送到树莓派; 利用压力传感器采集大气压力,树莓派通过ADC采集电压换算压力 根据采集到的数据进行滤波后,将需要显示的内容传输到屏幕进行显示。。
标签
KiCad
纳芯微
WeDesign活动
WeDesign6
Dearjim
更新2024-12-27
35

 image.png

项目总结报告

项目介绍

利用温湿度传感器和压力传感器,采集环境信息,包括温度、湿度、气压,然后利用LCD屏幕进行显示

image.png

项目设计思路

利用温湿度传感器采集环境温度和湿度数据,并通过I2C协议将采集到的输入数据传输至树莓派。通过压力传感器获取大气压力信息,树莓派利用ADC模块采集传感器的电压信号并将其转换为大气压力值。接着,利用数据滤波算法处理采集到的传感器数据,将所需的显示内容通过编程传输至LCD屏幕进行实时显示。

为实现上述功能,首先需要设计并制作一个传感器电路板(PCB),将传感器正确焊接到电路板上,并将传感器电路板与主控设备进行连接。接下来,在树莓派上编写相应的软件来读取传感器数据,并通过编程控制LCD屏幕,实时显示处理后的数据。

 

温湿度传感器芯片介绍

NSHT30是一款高精度、低功耗的数字温湿度传感器,广泛应用于环境监测、气候控制、智能家居、农业温湿度监测等领域。该传感器基于先进的感应技术,提供稳定、精确的温湿度测量结果。以下是NSHT30的主要特点和技术参数:

主要特点:

1. 高精度NSHT30提供±0.3°C的温度测量精度和±2%的相对湿度测量精度,适合需要高精度数据的环境监测应用。

2. 低功耗:具有极低的功耗,适合长期运行的电池供电系统。低功耗特性使得其在移动设备或远程监测系统中尤为重要。

3. 快速响应:传感器的响应时间短,可以快速捕捉环境变化,适应动态监测需求。

4. 数字输出NSHT30使用I2CSPI协议进行数据通信,简化了系统设计,并且可以直接与微控制器、树莓派等嵌入式设备进行连接和通信。

5. 小型封装:具有紧凑的封装设计,适合空间受限的应用场景。

6. 高稳定性:采用先进的校准技术,能够提供长时间稳定的测量结果,减少了长期使用中的漂移和误差。

技术参数:

 温度测量范围-40°C125°C

 温度精度±0.3°C(在0°C60°C范围内)

 湿度测量范围0%100% RH(相对湿度)

 湿度精度±2% RH(在20%80% RH范围内)

 供电电压1.5V3.6V(典型值3.3V

 通信接口I2C(标准、可配置地址)

 功耗:待机模式下最低功耗,工作模式下可通过编程调整采样频率,进一步降低功耗。

应用场景:

 环境监测:如室内温湿度控制、气候变化监测、温湿度数据采集等。

 农业:用于温室种植的气候监控,帮助农民优化灌溉和通风策略。

 智能家居:在空气净化器、空调、智能家居设备中用于温湿度检测,自动调节室内环境。

 医疗设备:用于控制医疗设备的温湿度,确保设备工作在最佳环境条件下。



阅读datasheet,6.4介绍了i2c协议,如何获取数据 开始和停止。


具体到PCBLayout建议:
1.温湿度传感器芯片位置尽量远离热源;
2.降低温湿度传感器芯片与PCB间的热传导;(芯片周围不覆铜,走线尽量细,PCB上芯片周围开孔,
降低热传导,或者采用柔性软板将温湿度传感器与测试主板进行物理隔离)
3.降低温湿度传感器芯片耦合到PCB上之后的热惯性;(温湿度传感器所在的PCB尽量薄,例如采用单
独的FPC软板装配温湿度传感器)

数据读取:

这里介绍一种数据读取的方法,向地址0x44,发送0x24000

传感器反馈温度(16bit)CRC8bit),湿度(16bit,CRC(8bit)

换算成物理值公式:

温度=-45+175 *(Raw_T) /65535

湿度=100 *(Raw_T) /65535

 image.png


压力传感器芯片介绍

NSPASx系列压力传感器是一款高性能、高精度的压力测量传感器,广泛应用于工业控制、液体和气体压力监测、自动化设备以及汽车、航空等领域。该系列传感器采用先进的MEMS(微电子机械系统)技术,能够提供准确、可靠的压力数据,同时具有较高的耐用性和稳定性。以下是NSPASx系列压力传感器的主要特点和技术参数:

主要特点:

1. 高精度测量NSPASx系列提供精确的压力测量,具有较低的测量误差,能够适应各种工业应用中的高精度要求。

2. 广泛的测量范围:该传感器支持不同压力范围的选择,包括低压、中压和高压,满足不同工作环境的需求。

3. 多种输出方式NSPASx提供模拟输出(如0-5V4-20mA)和数字输出(如I2CSPI协议),用户可以根据需求选择最合适的通信接口。

4. 耐高温与抗干扰能力:传感器设计具有较强的抗温差变化和电磁干扰能力,能够在恶劣环境下稳定工作。

5. 长期稳定性:采用高稳定性的MEMS压力传感元件和先进的温度补偿技术,保证长期使用中的测量精度。

6. 小型化设计:其紧凑的尺寸和模块化设计,方便集成到各种系统中,尤其适用于空间有限的应用场合。

7. 低功耗:传感器具有较低的功耗,非常适合用于电池供电系统或要求长时间稳定运行的场合。

技术参数:

 压力测量范围0 ~ 1 bar0 ~ 1000 bar(根据具体型号,支持多种压力范围)

 压力精度±0.25% FS(全量程精度,具体精度依型号而定)

 温度范围-40°C+125°C(部分型号可选更宽温度范围)

 输出信号

 模拟输出:0-5V4-20mA等(具体型号支持不同输出)

 数字输出:I2CSPI(根据型号选择)

 供电电压3.3V5V(具体取决于输出类型)

 工作温度范围-40°C+125°C(某些型号可选更广泛的工作温度范围)

 响应时间< 10 ms(快速响应,适应动态压力变化的监测需求)

 长期稳定性:典型漂移小于±0.1% FS/

应用场景:

1. 工业自动化:用于工业设备和生产线中压力监控与控制,例如气体压力、液压压力的实时监测。

2. 液体与气体监测:适用于液体和气体压力传感器的测量,如液体泵、气体管道的压力监测。

3. 汽车领域:在汽车引擎系统、轮胎压力监控(TPMS)等应用中,NSPASx可以实时监控压力变化,确保安全性与性能。

4. 航空航天:在航空器及其关键系统中(如燃油系统、气压系统)的压力测量,确保飞行安全。

5. 液压系统:用于液压设备中,如液压泵和液压系统的压力监控和调节。

6. 医疗设备:例如血压监测仪、呼吸机中的气体和液体压力监测。

NSPASx系列压力传感器凭借其卓越的测量精度、宽广的工作范围以及可靠的性能,在多种行业应用中表现出色,是实现精确压力控制和监测的理想选择。通过其灵活的输出方式,用户可以轻松集成到现有系统中,提高设备的可靠性和效率。

数据读取:

通过直接采集VOUTADC电压,读取得到uint16RAW值。

计算绝对压力:

Volt_P= Raw_P /65535 *5

P =(Volt_P /5 -B )/A

A=0.008095, B=-0.00095

 image.png

 

最终原理图、PCB


画原理图、PCB过程到的问题

遇到的问题1

温湿度传感器不知道传感器4pin的间距。

方案1:需要实物测量才能够确认了。

方案2:芯片手册

把图片导入到PCB绘图中 ,然后照着图片画

image.png

image.png

最终解决方案1

最后发现KICAD中有温湿度传感器现成的模块

 

遇到问题2:

焊接传感器时,传感器的正面看不出那边是1pin引脚

解决方案2

芯片手册里面写了传感器的PACKAGE标识,并且在KICAD中的PCB原理图中把中间部分的标识画了上去,避免焊接时弄错

遇到问题3

主控芯片的ADC采样是3.3V的,而压力传感器器供电5V的时候导致采集的电压超过的3.3V

解决方案3

可以通过分压的方式采集传感器输出的电压。但要求分压的电阻具备较高的精度和抗热敏性。

与传感器供应商沟通后,建议使用ADC3.3V供电参考电压给传感器器供电,也能得到较好的测量精度。


遇到问题4

温度湿度传感器特别小使用一般的焊锡尝试了几次都失败了。

解决方案4

购买焊浆进行焊接

 

实物照片:

打印的板子中没有两个上拉电阻,后来发现没有又直接改了原理图。但是测试发现,能够直接通讯,应该是主控中I2C已经有了上拉。

所以就没有重新再打板了。附件我上传了新版(带上拉电阻)的KICAD附件,本来想把旧版的KICAD文件上传的,可惜文件被我覆盖了。实物就是不带上拉电阻的。

另外,实物图中的电容也没有焊接,可能会对电路抗干扰能力产生影响。不过对演示来说影响不大。所以为了省力就没焊了。

image.png

两个芯片的电源和地共用,使用3V3供电。另外三根引脚分别是I2C和VOUT,分别用来传输温湿度和压力数据。


内心OS:

哇,那真的很棒呀!自己从设计板子开始,一路到焊接、调试成功,这整个过程可太有挑战性了,能顺利完成确实超级有成就感呢。即使它现在还比较简陋,没完全遵循设计规则也没关系呀,毕竟这是一个很好的开始嘛。




主控编程

使用十二指神探作为主控,其芯片为RP2040。露出的引脚定义如下:

image.png

CH0连接SDA   IO20

CH1连接SCL    IO21

GND与接线板GND连接

3V3与接线板POWER连接

CH6连接ADC

主控代码

C++
import uos
import test.st7789 as st7789
from test.fonts import vga2_8x8 as font1
from test.fonts import vga1_16x32 as font2
import random
import framebuf
from machine import Pin, SPI, ADC,PWM,I2C
import time, math,array
from utime import sleep_ms
import struct

pwm = PWM(Pin(19))
pwm.freq(50)

#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.text(font2, "EETREE", 10, 10)
display.text(font2, "www.eetree.cn", 10, 40)


# xAxis = ADC(Pin(28))
# yAxis = ADC(Pin(29))

buttonM = Pin(5,Pin.IN, Pin.PULL_UP) #B
buttonS = Pin(6,Pin.IN, Pin.PULL_UP) #A
buttonL = Pin(7,Pin.IN, Pin.PULL_UP) #A
buttonPRESS = Pin(8,Pin.IN, Pin.PULL_UP) #A
buttonR = Pin(9,Pin.IN, Pin.PULL_UP) #A
'''
f_image = open(image_file0, 'rb')
 
for column in range(1,240):
                buf=f_image.read(480)
                display.blit_buffer(buf, 1, column, 240, 1)
'''
adc = ADC(Pin(26))
conversion_factor = 5 / 65535  # Convert the raw reading to voltage
A= 0.008095
B= -0.00095
# 配置 I2C 总线(I2C 端口 0)
i2c = I2C(0, scl=Pin(21), sda=Pin(20))  # 根据你的硬件连接配置适当的 SCL 和 SDA 引脚

# 从机地址
I2C_ADDRESS = 0x44
def send_command(command):
    """发送命令给传感器"""
    try:
        i2c.writeto(I2C_ADDRESS, bytearray([command >> 8, command & 0xFF]))
    except:
        print("发送数据失败")
    time.sleep(0.1)  # 给传感器一些时间来响应
def read_sensor_data():
    temp_celsius =0;
    hum_percentage =0;
    # 发送命令 0x2400,启动传感器采集
    send_command(0x2400)
    # 读取 6 个字节数据4
    try:
        data = i2c.readfrom(I2C_ADDRESS, 6)
        # 确保我们读取到 6 个字节
        if len(data) != 6:
            print("读取数据失败,返回数据长度不符!")
            return None, None
        
        # 解析温度数据(data[0] 和 data[1])
        temp = (data[0] << 8) | data[1]  # 组合为 16 位整数
        # 温度数据处理(根据传感器的文档可能需要适当的转换公式)
        temp_celsius = (temp / 65536.0) * 175.0 - 45.0  # 假设为一个线性转换公式,具体根据传感器的文档来
        
        # 解析湿度数据(data[3] 和 data[4])
        hum = (data[3] << 8) | data[4]  # 组合为 16 位整数
        # 湿度数据处理(同样需要根据文档可能做适当转换)
        hum_percentage = (hum / 65536.0) * 100.0  # 假设线性转换
    except:
        print("读取数据失败")
    
    
    
    return temp_celsius, hum_percentage
while True:

#     xValue = xAxis.read_u16()
#     yValue = yAxis.read_u16()
    
    buttonValueM = buttonM.value()
    buttonValueS = buttonS.value()
    buttonValueL = buttonL.value()
    buttonValuePRESS = buttonPRESS.value()
    buttonValueR = buttonR.value()
    
#     display.text(font1, "xVaule="+"%05d" %(xValue) , 10, 70)
#     display.text(font1, "yVaule="+"%05d" %(yValue), 120, 70)
    

    adc_value = adc.read_u16()
    adc_value=adc_value*conversion_factor
    pressure = (adc_value /5-B )/A
    print(pressure)
    time.sleep(0.5)
    temp, hum = read_sensor_data()
    
    # 如果成功读取到数据
    if temp is not None and hum is not None:
        print("温度: {:.2f}C, 湿度: {:.2f}%".format(temp, hum))
    else:
        print("读取失败")
#     display.text(font2, "温度="+str(temp)+"C", 2, 90)
#     display.text(font2, "湿度="+str(hum)+"%", 2, 130)
    display.text(font2, "temp=" + "{:.2f}".format(temp) + "C", 2, 90)
    display.text(font2, "hum=" + "{:.2f}".format(hum) + "%", 2, 130)
    display.text(font2,"Pres="+"{:.2f}".format(pressure)+"kPa", 2, 170)
#     display.text(font1, "buttonValuePRESS="+str(buttonValuePRESS), 10, 150)
#     display.text(font1, "buttonValueR="+str(buttonValueR), 10, 170)

主控代码说明

这段代码实现了一个基于ESP32开发板的嵌入式系统,结合了传感器数据读取、LCD显示、按键输入和压力传感器的应用。具体来说,它集成了以下几个功能:

1. 显示模块(ST7789液晶屏):通过SPI接口与一个240x240分辨率的ST7789液晶屏通信,显示一些基本信息,例如温度、湿度和压力数据。

2. 温湿度传感器:通过I2C接口与外部温湿度传感器进行通信,获取环境的温度和湿度信息,并将数据展示在屏幕上。

3. 压力传感器:通过ADC输入读取一个模拟压力传感器的值,并计算出压力(单位:kPa)。

4. 按键输入:系统通过读取多个按键的状态(例如buttonMbuttonSbuttonPRESS 等)来进行用户交互。

具体实现的功能和模块

1.初始化液晶显示屏

Plain Text
pythonCopy Code
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)

在这段代码中,我们使用st7789 库初始化了一个240x240像素的液晶屏。通过SPI接口与显示屏通信,能够实现图形和文本的显示。显示屏在启动时会显示一些基本文本信息,如"EETREE"和网址"www.eetree.cn"

2.读取传感器数据

 压力传感器:使用ADC模块读取模拟压力传感器的电压值,并通过公式转换为压力(单位:kPa)。公式使用了两个常量 A B,这些常量应该根据传感器的文档进行调整。

 pythonCopy Code
adc_value = adc.read_u16()
adc_value = adc_value * conversion_factor
pressure = (adc_value / 5B) / A

 温湿度传感器:通过I2C接口与温湿度传感器通信,读取温度和湿度数据。具体操作是通过发送特定命令启动传感器采集数据,然后读取6字节数据来获取温度和湿度信息。

Plain Text
pythonCopy Code
data = i2c.readfrom(I2C_ADDRESS, 6)
temp = (data[0] << 8) | data[1]
hum = (data[3] << 8) | data[4]

3.按键输入处理(这部分是DEMO代码里面的 其实我没用到)

系统读取多个按键的状态,通过Pin 类的value() 方法获取每个按键的按下状态。通过这些按键,用户可以进行交互操作,代码中包含了多个按键如buttonMbuttonS 等,它们被用作输入的方式。

Plain Text
pythonCopy Code
buttonValueM = buttonM.value()
buttonValueS = buttonS.value()

4.数据显示

系统将读取到的温度、湿度和压力数据实时显示在液晶屏上。数据显示的格式为:

 温度(单位:

 湿度(单位:%

 压力(单位:kPa

这些数据通过display.text() 方法显示在屏幕上的不同位置。

Plain Text
pythonCopy Code
display.text(font2, "temp=" + "{:.2f}".format(temp) + "C", 2, 90)
display.text(font2, "hum=" + "{:.2f}".format(hum) + "%", 2, 130)
display.text(font2, "Pres=" + "{:.2f}".format(pressure) + "kPa", 2, 170)

5.主循环

代码的主体是在while True 循环中执行的,循环不断地读取传感器数据并更新显示屏上的内容。每隔0.5秒读取一次压力传感器和温湿度传感器的数据,并在屏幕上更新相应的信息。

C++
pythonCopy Code
while True:
    adc_value = adc.read_u16()
    temp, hum = read_sensor_data()
显示数据
    display.text(font2, "temp=" + "{:.2f}".format(temp) + "C", 2, 90)
    display.text(font2, "hum=" + "{:.2f}".format(hum) + "%", 2, 130)
    display.text(font2, "Pres=" + "{:.2f}".format(pressure) + "kPa", 2, 170)
    time.sleep(0.5)

 

代码总结

这段代码的主要功能是通过传感器获取实时的温度、湿度和压力数据,并将这些信息通过SPI接口显示在ST7789显示屏上。同时,通过按键输入,用户可以与系统进行交互,可能用于触发某些特定的操作(虽然此处按键的具体操作还没有实现)。系统通过I2C总线与温湿度传感器通信,利用ADC模块获取模拟压力传感器的值,最终实现了一个完整的环境监测系统。

代码迭代

增加背景图片,并通过按键进行切换

 

显示曲线,并绘制示波器

 

总结:

本项目成功设计并实现了基于纳芯微NSHT30-QDNRNSPAS3NII5RPAI芯片的环境监测系统。通过温湿度和压力传感器的采集,实时展示环境数据,为用户提供了精准的温湿度和大气压力监控解决方案。

1. 硬件设计:完成了主控芯片、传感器、显示模块的选型与集成,保证了数据采集的准确性和稳定性。I2C接口的应用确保了温湿度传感器的高效通信。

2. 数据处理:温湿度数据通过I2C协议获取,压力数据通过模拟信号采样并转换为大气压力。处理流程顺畅,数据精度达到设计要求。

3. 界面展示:采用LCD屏幕展示实时数据,界面简洁易读,符合用户需求。

4. 问题解决:成功解决了传感器焊接、压力传感器电压范围和I2C通信稳定性问题,保证了系统的稳定性与可靠性。

项目心得:

1. 硬件与软件的结合:硬件设计的稳定性是系统成功的关键,尤其是在传感器的选择与布局上。软件方面,数据采集与显示需要充分考虑实际使用场景,确保用户体验。

2. 调试的重要性:传感器接口的调试非常耗时,尤其是I2C协议和模拟信号的转换。调试过程中要细心,避免信号干扰和电压不匹配的问题。

3. 系统扩展性:项目设计时已考虑到未来扩展功能,如数据存储与分析、无线传输等,可以在后期继续优化和提升系统功能。

总的来说,本项目不仅实现了预期目标,还积累了丰富的硬件开发和嵌入式系统经验,为后续类似项目打下了坚实基础。

 

KiCad文件
使用说明
全屏
附件下载
main_SN.zip
PCB KICAD.zip
团队介绍
NA
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号