基于纳芯微温度传感器NST112x、温湿度传感器NSHT30、压力传感器NSPAS3设计的环境检测桌搭
项目介绍
基于STM32为主控,通过硬件I2C和软件I2C还有ADC采集压力传感器,实现我们的数据显示到OLED屏幕上展示我们的当前桌面环境的温湿度和压强。
项目设计思路
主控选择:STM32F103C8T6
传感器选择:温度传感器:NST112x
温湿度传感器:NSHT30
压力传感器:NSPAS3
屏幕选择:0.96寸的OLED显示屏
基于这三种传感器和主控通过杜邦线连接,通过使用对应的芯片协议,根据芯片协议由主控来获取外部传感器的数据,显示到我们搭载的OLED屏幕上,从而显示我们当前周围的温湿度环境的情况。
程序设计的框图
设计思路
软件设计:之前接触过STM32开发,对于其中的HAL库开发较为熟悉,基于在电子森林中提供的哪芯微提供的芯片手册,不断了解到其中开发的过程,将其中的代码移植到STM32中就能正常驱动该程序,其中的过程不断阅读官方的数据手册和对应的查找资料。
PCB设计:在设计的过程中其中的芯片手册很贴心的提供了PCB的原理图,画板的原理图也有提供,根据其中提供的资料,使用Kid CAD进行画板,成功将三块芯片的PCB画出来并且打板成功,成功验证了其中的功能。
遇到的问题
软件:在设计NSHT30,在使用硬件I2C时,发现传感器的数据无法获取,不断的Debug,缺发现能查找得到I2C的设备地址,可以得知板子在焊接过程中没有损坏。之后通过在每一个程序中,添加串口打印,来分析I2C哪里出现了问题,最后通过在网上查找得到:STM32F103的I2C设计为了加快数据读取速度,在读取一个数据后,如果没有检测到NACK信号的话,会多读取一个数据,即多发送一个字节的时钟去读取数据,但是由于其中过程太快,如果想在接收到最后一个字节后再去发送NACK,那么下一个时钟已经出去了,导致NACK和STOP信号都没发出去,也就导致了总线死锁。
最后的解决方法是,根据数据手册上选择相同的软件I2C成功解决了问题。
硬件:在焊接NST112x的时候,芯片的封装特别小,导致在焊接的过程中不断的出现问题,一开始使用热风枪的方法,发现芯片太小,一吹会导致芯片飞出去,之后改进方法,使用加热台,先将焊盘挂一层锡,然后将芯片对准,放到加热台焊接,最后要用小镊子轻推一下实现焊盘的归位,最后实现我们的芯片安装成功,最后也是使用I2C地址扫描成功验证。
关键代码说明
NST112温度读取字节转换
// 读取温度数据
void NST112_Read_Temperature(double *temperature)
{
uint8_t temp_data[2];
int16_t temp_value;
HAL_StatusTypeDef status;
// 读取温度寄存器
status = HAL_I2C_Mem_Read(&hi2c1, NST112_I2C_ADDRESS, TEMP_REG, I2C_MEMADD_SIZE_8BIT, temp_data, 2, HAL_MAX_DELAY);
if (status != HAL_OK)
{
printf("Error: Failed to read temperature register, status: %d\r\n", status);
return;
}
// 组合高低字节并转换为温度值
temp_value = (int16_t)((temp_data[0] << 8) | temp_data[1]);
*temperature = temp_value / 256.0; // 转换为摄氏度
}
NSPAS3气压值计算
float Value = HAL_ADC_GetValue(&hadc1);//获取ADC转换的结果
//根据读取的结果转化为电压值
float Vout = Value/4096.0*3.3;
//通过公式计算出我们的气压值
float Pa = Vout/0.0267135+0.1173;
NSHT30温湿度代码转换
HAL_StatusTypeDef read_temp_rh_ch(uint8_t addr, double *pout)
{
uint8_t dat[6];
uint16_t tem,hum;
nsht30_read_raw_single(addr,0x240b,dat);// single mode
tem = ((uint16_t)dat[0]<<8) | dat[1];
hum = ((uint16_t)dat[3]<<8) | dat[4];
if((nst3x_crc_check(dat,2,dat[2])) && (nst3x_crc_check(dat+3,2,dat[5])))
{
pout[0] = -45.0 + 175.0 * (double)tem / 65535.0;
pout[1] = 100.0 * (double)hum / 65535.0;
return HAL_OK;
}
else
{
return HAL_ERROR;
}
}
实现效果
通过OLED显示第一条就是我们的NSPAS3压力传感器的数据,第二条就是温度传感器的数据NST112x,第三条就是NST112x温湿度传感器的数据。
PCB制版效果展示
根据数据手册来设计我们相关的PCB,打板测试成功,注意温度传感器封装很小,需要使用加热台。