WeDesign项目--基于纳芯微NSHT30温湿度传感器的3D打印机耗材干燥箱
该项目使用了Kicad软件、Arduino程序、NSHT30温湿度传感器,实现了3D耗材干燥箱功能的设计,它的主要功能为:基于纳芯微NSHT30温湿度传感器的干燥箱,温度能够达到40℃以上,湿度能够保持在20%之内,UI界面操作简单。。
标签
接口
USB
NSHT30温湿度传感器
WeDesign
lin9an
更新2024-12-27
重庆电力高等专科学校
47

一、项目需求

基本任务:

  • 能够读取温度、湿度,并能够在屏幕中显示

额外任务参考:(可完成全部额外任务,或者其中部分,也可以自行扩展,参与大奖评选)

  • 添加UI界面
  • 自制箱体并设计结构:
    • 能够使箱内湿度降低到20%RH以下
    • 能够加热箱内温度至少40度以上并温度可控
    • 能够将湿润物体(如纸巾)烘干后,自动排出水汽并保持湿度在20%RH以下

二、项目设计思路:

  1. 温湿度控制
    • 目标温度设定:用户可以通过控制面板(OLED屏,按键,电位器)设定目标温湿度。
    • 温湿度传感器:使用高精度的温湿度传感器(纳芯微电子NSHT30传感器)实时监测箱内温湿度。
    • 加热元件:使用加热片(230摄氏度)作为加热元件,确保温度均匀分布。
    • 除湿系统:采用加热除湿开孔,确保湿度达到设定值。
  2. 用户界面
    • 显示屏幕:使用OLED显示屏,显示当前温度、湿度、设定值和工作状态。
    • 按键操作:提供简单的按键操作,方便用户设置和控制。

硬件电路搭建

  1. 主控芯片
    • 使用乐鑫ESP32负责整个系统的控制和数据处理。
  2. 温度控制电路
    • 温度传感器接口:连接NSHT30温度传感器的VCC、GND、SCL、SDA到乐鑫ESP32的引脚,读取温度数据。
    • 加热元件驱动:使用继电器驱动加热元件,根据温度传感器反馈调整加热功率。
  3. 用户界面电路
    • 显示屏幕:连接LED显示屏到乐鑫ESP32,显示系统状态。
    • 按键接口:连接按键到乐鑫ESP32的GPIO引脚,实现用户操作。

基于纳芯微电子NSHT30传感器的温湿度传感器模块特写与实物照片

三、软硬件框图

软件层级框图

软件逻辑框图

硬件电气连接图

硬件通信连接图


四、主控及传感器模块的原理图和PCB

纳芯微电子NSHT30温湿度传感器模块的原理图

image.png

ESP32主控的原理图

image.png

纳芯微电子NSHT30温湿度传感器模块的PCB

image.png

ESP32主控的PCB

image.png


五、关键代码

//显示UI界面
void get_Display() {
  Humid();//显示箱内实时温湿度
  //  tft.setSwapBytes(true);             //使图片颜色由RGB->BGR
  showMyFonts(0, 5, "箱内温度", TFT_WHITE);  //在(0,5)处显示“箱内温度”
  showMyFonts(112, 5, "℃", TFT_WHITE);       //在(112,5)处显示“箱内温度”
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setCursor(70, 0, 4);  //设置起始坐标(70, 0),4号字体
  tft.println(":");


  showMyFonts(0, 25, "箱内湿度", TFT_WHITE);  //在0,25)处显示“箱内湿度”
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setCursor(112, 25, 2);  //设置起始坐标(70, 70),4号字体
  tft.println("%");
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setCursor(70, 20, 4);  //设置起始坐标(70, 20),4号字体
  tft.println(":");


  showMyFonts(0, 55, "设置温度", TFT_WHITE);  //在(0,55)处显示“设置温度”
  showMyFonts(112, 55, "℃", TFT_WHITE);       //在(112,5)处显示“箱内温度”
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setCursor(70, 50, 4);  //设置起始坐标(70, 50),4号字体
  tft.println(":");
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setCursor(85, 55, 2);  //设置起始坐标(70, 0),1号字体
  tft.println(set_temp);


  showMyFonts(0, 75, "设置湿度", TFT_WHITE);  //在(0,75)处显示“设置湿度”
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setCursor(112, 75, 2);  //设置起始坐标(70, 70),4号字体
  tft.println("%");
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setCursor(70, 70, 4);  //设置起始坐标(70, 70),4号字体
  tft.println(":");
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setCursor(85, 75, 2);  //设置起始坐标(70, 0),1号字体
  tft.println(set_humi);


  showMyFonts(0, 105, "工作状态", TFT_WHITE);  //在(0,105)处显示“工作状态”
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setCursor(70, 100, 4);  //设置起始坐标(70, 100),4号字体
  tft.println(":");
}
//显示设置界面
void get_SetDisplay()
{
  showMyFonts(0, 0, "选项设置", TFT_WHITE);  //在(0,0)处显示“选项设置”
  showMyFonts(20, 35, "温度", TFT_WHITE);  //在(0,55)处显示“设置温度”
  showMyFonts(85, 35, "℃", TFT_WHITE);       //在(112,5)处显示“箱内温度”
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setCursor(50, 30, 4);  //设置起始坐标(70, 50),4号字体
  tft.println(":");
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setCursor(60, 35, 2);  //设置起始坐标(70, 0),1号字体
  tft.println(set_temp);


  showMyFonts(20, 75, "湿度", TFT_WHITE);  //在(0,75)处显示“设置湿度”
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setCursor(85, 75, 2);  //设置起始坐标(70, 70),4号字体
  tft.println("%");
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setCursor(50, 70, 4);  //设置起始坐标(70, 70),4号字体
  tft.println(":");
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setCursor(60, 75, 2);  //设置起始坐标(70, 0),1号字体
  tft.println(set_humi);
  showMyFonts(20, 115, "退出", TFT_WHITE);  //在(20, 115)处显示“工作状态”
  if(i==2){
  //显示标号1  
   tft.fillTriangle(0, 32, 0, 52, 15, 42, TFT_MAGENTA);//选择标号1
   tft.fillTriangle(0, 72, 0, 92, 15, 82, TFT_BLACK);//选择标号2
   tft.fillTriangle(0, 112, 0, 132, 15, 122, TFT_BLACK);//选择标号3
   set_temp= map(analogRead(potPin), 0, 4095, 30, 70);
  }
  else if(i==3){
  //显示标号2
   tft.fillTriangle(0, 32, 0, 52, 15, 42, TFT_BLACK);//选择标号1
   tft.fillTriangle(0, 72, 0, 92, 15, 82, TFT_MAGENTA);//选择标号2
   tft.fillTriangle(0, 112, 0, 132, 15, 122, TFT_BLACK);//选择标号3
   set_humi= map(analogRead(potPin), 0, 4095, 10, 80);
  }
  else if(i>=4){
  //显示标号3
   tft.fillTriangle(0, 32, 0, 52, 15, 42, TFT_BLACK);//选择标号1
   tft.fillTriangle(0, 72, 0, 92, 15, 82, TFT_BLACK);//选择标号2
   tft.fillTriangle(0, 112, 0, 132, 15, 122, TFT_MAGENTA);//选择标号3
  }
}
//显示箱内实时温湿度
void Humid()
{
  if (sht3x.measure()) {
    Serial.print("Temperature: ");
    Serial.print(sht3x.temperature(), 1);
    Serial.print(" *C\tHumidity: ");
    Serial.print(sht3x.humidity(), 1);
    Serial.print(" %RH");
    Serial.println();
  } else {
    Serial.println("SHT3x read error");
  }
  delay(2000);
  temp=sht3x.temperature();
  humi=sht3x.humidity();
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setCursor(85, 5, 2);  //设置起始坐标(70, 0),1号字体
  tft.println(temp);                                                      
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.setCursor(85, 25, 2);  //设置起始坐标(70, 0),1号字体
  tft.println(humi);
}
//中断
void ISR() {
  flag = true;
}
 
// 显示ui加状态
void get_DisplayStatus() {
    if (i==0)
    {
      if(k==1)
      {
            tft.fillScreen(TFT_BLACK);  // 清屏
            k=2;
      }
  get_Display();
  showMyFonts(80, 105, "待机中", TFT_WHITE);  //在(80,105)处显示“工作状态”
    //关闭风扇
  digitalWrite(relayPin2, LOW); // 继电器高电平关闭
  Serial.println("风扇关闭");
    // 关闭发热片
  digitalWrite(relayPin1, LOW); // 继电器低电平关闭
  Serial.println("发热片关闭");
    }
  else
  {
  if (humi>set_humi)
  {
          if(k==2)
      {
            tft.fillScreen(TFT_BLACK);  // 清屏
            k=3;
      }
  get_Display();
  showMyFonts(80, 105, "工作中", TFT_WHITE);  //在(80,105)处显示“工作状态”
  //开启风扇
  digitalWrite(relayPin2, HIGH);  // 继电器触发
  Serial.println("风扇开启");
  }
  if(temp<=set_temp)
  {
  // 开启发热片
  digitalWrite(relayPin1, HIGH);  // 继电器触发
  Serial.println("发热片开启");
  //开启风扇
  digitalWrite(relayPin2, HIGH);  // 继电器触发
  Serial.println("风扇开启");
  }
  else{
  // 关闭发热片
  digitalWrite(relayPin1, LOW); // 继电器低电平关闭
  Serial.println("发热片关闭");
  }
  if (humi<=set_humi) {
    if(k==3)
      {
            tft.fillScreen(TFT_BLACK);  // 清屏
            k=1;
      }
  get_Display();
   //关闭风扇
  digitalWrite(relayPin2, LOW); // 继电器高电平关闭
  Serial.println("风扇关闭");
    // 关闭发热片
  digitalWrite(relayPin1, LOW); // 继电器高电平关闭
  Serial.println("发热片关闭");  
  showMyFonts(80, 105, "完成", TFT_WHITE);  //在(80,105)处显示“工作状态”
  showMyFonts(80, 125, "烘干", TFT_WHITE);  //在(80,125)处显示“工作状态”
//返回待机状态进行下一次工作
    if (flag) {
    unsigned long start = micros();
    unsigned long delayTime = 500000; // 0.5 秒
    while (micros() - start < delayTime) {
      // 按键消抖
    }
    i=0,set_temp=40,set_humi=20;
    flag = false;
  }
  }
  }


}

六、箱体结构展示

七、心得感悟

(一)技术方面

1.硬件与软件的协同

1.在这个项目中,深刻体会到了硬件和软件协同工作的重要性。硬件是软件的基础,软件是硬件功能的体现。只有硬件设计合理,软件才能充分发挥其作用;反之,软件的优化也能够弥补硬件的一些不足。例如,在解决传感器数据不准确的问题时,不仅需要对硬件电路进行改进,还需要调整软件中的采集和处理程序。

2.新技术的学习与应用

1.ESP32作为一款新兴的微控制器,具有很多先进的功能。在项目过程中,不断学习和掌握ESP32的相关知识,如Wi - Fi和蓝牙功能的使用、不同通信协议的实现等。

(二)项目管理方面

1.规划与执行

1.在项目开始之前,制定详细的项目计划是非常必要的。明确项目的各个阶段、任务和时间节点,有助于合理安排资源和控制项目进度。然而,在项目执行过程中,也需要根据实际情况对计划进行调整。例如,在遇到硬件调试问题时,可能会导致软件开发的延迟,此时就需要重新评估项目进度,调整任务的优先级。

2.团队合作

1.团队成员之间的沟通和协作是项目成功的关键。不同成员可能负责不同的模块,如硬件设计、软件开发、测试等,只有保持良好的沟通,才能确保各个模块之间的接口兼容,避免出现互相推诿责任的情况。在本项目中,通过定期的团队会议和即时通讯工具,及时解决了项目中出现的各种问题。

总的来说,基于ESP32的干燥箱项目是一次非常有意义的实践经历。通过这个项目,不仅提高了自己在硬件设计、软件开发和项目管理方面的能力,也对物联网技术在实际产品中的应用有了更深入的了解。在未来的项目中,将继续积累经验,不断提升自己的综合素质。

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