一、 作品简介
WeDesign第6期基于树莓派RP2040的环境检测桌搭设计
项目基于树莓派RP2040微控制器,利用纳芯微传感器构建一个环境检测系统,实时获取并显示环境的温度、湿度、气压及角度数据。系统数据通过RP2040的TFT屏实时显示,并能够上传至电脑输出实时的采集数据与信息。
软硬件简介:
温度传感器 NST112D-CWLR
用于获取当前环境的温度数据,采用IIC通信协议进行数据传输。读取地址0x4b。
温湿度传感器 NSHT30
用于获取环境的温湿度数据,采用IIC通信协议。读取地址0x44。
压力传感器 NSPAS3
用于监测环境的气压变化,数据通过ADC通道进行读取。压力量程10kPa~400kPa。
角度传感器 NSM3013
用于检测设备或桌面角度变化,数据通过ADC通道读取。将两极磁铁的角度位置信息通过内部DSP解算,转化成模拟电压,PWM,SPI等各种输出形式。
TFT显示屏
实时显示温度、湿度、气压、角度等数据,并根据数据变化更新界面;采用SPI通信,屏的型号是st7789。
数据上传PC
通过USB接口,将实时采集到的数据通过RP2040的通信接口上传至电脑,使用串口、USB加TYPE C线与电脑相连接。
二、 系统框图
设计思路
数据采集
RP2040通过I2C和ADC与各个传感器通信,实时获取数据。考虑到RP2040的I2C和ADC接口支持,可以高效地与每个传感器进行数据交换。
显示
考虑到是做的桌搭,那肯定是需要把所有的数据都需要显示,所以TFT屏幕就可以用来显示环境的实时数据,通过颜色、或文本呈现不同的数值。可以根据需要查看不同的环境参数。
数据上传
数据上传部分可以通过RP2040的USB端口直接与电脑连接,直接用十二指神探串口进行上传,通过串口助手打印出来,以便在电脑上实时查看监测数据,也是方便调试。
三、硬件功能说明
传感器转接板PCB图
左上角的为压力传感器:压力传感器 NSPAS3
左下角的为压力传感器:角度传感器 NSM3013
右上角的为压力传感器:温度传感器 NST112D-CWLR
右下角的为压力传感器:温湿度传感器 NSHT30
传感器板与十指神探对接接口图:
使用的IIC引脚是CH0、CH1,用于采集温度与湿度传感器。
CH6、CH8使用ADC来读取压力与磁角度的值,用的ADC分别是ADC0,ADC2。
各个传感器的原理图:
温湿度传感器 NSHT30:
温度传感器 NST112D-CWLR:
角度传感器 NSM3013:
压力传感器 NSPAS3:
四、 作品源码
STEP中的代码:
tft.init();
uint16_t transp = 0xFFFF; // 无透明色(全不透明)
pinMode(22, OUTPUT);
digitalWrite(22, HIGH);
tft.fillScreen(TFT_BLACK);
tft.setRotation(0);
tft.begin();
tft.setSwapBytes(true);
tft.pushImage(0, 0, img1_width, img1_height, img1); // FIRST LOGO
Serial.begin(115200);
//tft.pushImage(0, 0, 240, 240, img1);
delay(1000);
tft.drawString("环境检测桌搭", 30, 215);
Serial.print(" 环境检测桌搭 ");
delay(100);
tft.setTextSize(0);
tft.fillRect(0, 210, 240, 30, TFT_WHITE); //显示白色条杠
tft.setTextColor(TFT_BLACK); // Adding a background colour erases previous text automatically
tft.setTextFont(4);//设置显示字体
tft.drawString("`C", 185, 35);
tft.drawString("`C", 180, 70);
tft.drawString("Pa", 165, 108);
tft.drawString("Mg", 185, 148);
tft.drawString("%", 195, 183);
tft.setTextColor(TFT_BLACK); // Adding a background colour erases previous text automatically
tft.fillRect(0, 0, 240, 30, TFT_WHITE);
tft.drawString("www.eetree.cn Task3", 0, 215);
tft.drawString("WeDesign6 RP2040 ", 0, 2);
init_nst112(); //初始化温度计
if (sht.init())
{
Serial.print("init(): success\n");
}
else
{
Serial.print("init(): failed\n");
}
sht.setAccuracy(SHTSensor::SHT_ACCURACY_MEDIUM); // only supported by SHT3x
上面的代码:
初始化TFT显示屏:
使用tft.init();初始化TFT显示屏。
设置显示屏旋转角度为0度。
使用tft.fillScreen(TFT_BLACK);填充整个屏幕为黑色。
通过tft.pushImage()函数在显示屏上显示一个图像(img1),图像的位置和尺寸由img1_width和img1_height确定。
在显示屏上显示文本“环境检测桌搭”,并调整文本的位置和颜色。
在特定位置显示一些符号和字母(~C, Pa, Mg, %),用于表示环境参数(温度、压力、质量、湿度)的单位。
mgValue = analogRead(mgPin);
paValue = analogRead(paPin);
Serial.print("pa: ");
Serial.print(paValue);
Serial.print(" v: ");
Serial.print(float(paValue)*3.3/4095.0/0.617977528);
Serial.print(" 气压: ");
Serial.print(((float(paValue)*3.3/4095.0/0.617977528/5.0)-(-0.008095))/0.008095);
float temperature = ((float(paValue) * 3.3 / 4095.0 / 0.617977528 / 5.0) - (-0.008095)) / 0.008095;
// sprintf(temperatureStr, "bmp: %2f", temperature); // 将温度转换为字符串
sprintf(prestress, "NSPAS3: %.2f", temperature); // 将温度转换为字符串
tft.fillRect(100, 108, 60, 20, TFT_RED);//刷新局部红色显示
tft.drawString(prestress, 0,108); // 在屏幕上显示温度字符串
//磁力计
Serial.print(" mg: ");
Serial.print(mgValue);
Serial.print(" v: ");
Serial.print(float(mgValue)*3.3/4095.0/0.617977528);
Serial.println();
float magnetismStr = (float(mgValue)*3.3/4095.0/0.617977528);
// magnetism[20] = mgValue;
sprintf(magnetism, "NSM3013: %d", mgValue); // 将温度转换为字符串
tft.fillRect(100, 148, 80, 20, TFT_RED);//刷新局部红色显示
tft.drawString(magnetism, 0, 148); // 在屏幕上显示温度字符串
//温度计
float temp;
char temptemperaturevale[20],tempflat[20],humidity[20];
if (sht.readSample())
{
//ht30
// Serial.print("SHT: ");
Serial.print(" RH: ");
Serial.print(sht.getHumidity(), 2);
float humvale = sht.getHumidity();
sprintf(humidity, "HT30hum: %0.2f", humvale); // 将温度转换为字符串
tft.fillRect(100, 183, 85, 20, TFT_RED);//刷新局部红色显示
tft.drawString(humidity, 0, 183); // 在屏幕上显示温度字符串
Serial.print(" T: ");
Serial.print(sht.getTemperature(), 2);
// char temperaturead = sht.getHumidity();
float temperaturead = sht.getTemperature();
sprintf(temptemperaturevale, "NSHT30: %0.2f", temperaturead); // 将温度转换为字符串
//st112x
Serial.print(" T: ");
Serial.print(temp, 2);
Serial.print("\n");
float tempst12flat = readTemperatureC();
sprintf(tempflat, "NST112X: %0.2f", tempst12flat); // 将温度转换为字符串
tft.fillRect(100, 35, 80, 20, TFT_RED);//刷新局部红色显示
tft.drawString(tempflat, 0, 35); // 在屏幕上显示温度字符串
这段代码读取来自不同传感器的数据,并在TFT显示屏以及串行监视器上显示这些数据。
五、实际效果
实际显示界面:
显示采集的参数界面:
通过电脑上传到电脑采集的数据:
六、功能总结
通过这次的项目,实现了通过RP2040实时读取环境数据并通过屏幕显示,通过串口将数据上传至电脑,电脑端可以实时监控和绘制数据图表。
可视化界面提供直观的温湿度、压力、角度数据展示,便于实时监控。从中有了收获,提升了对RP2040的应用,也对纳芯微传感器的实测和性能的认可。