专为FDM-3D打印机设计的全手搓耗材干燥箱,PID恒温控制,0.91寸OLED温湿度显示,热风循环烘干耗材

简介:专为FDM-3D打印机设计的全手搓耗材干燥箱,PID恒温控制,0.91寸OLED温湿度显示,热风循环烘干耗材。外壳结构均可使用合适的材料3D打印出来。温控板程序简单修改还可用于鸡鸭鹅蛋等孵化控制器。
我将针对这款FDM-3D打印机耗材干燥箱,从需求分析到系统实现,再到测试验证和维护升级,详细阐述如何构建一个可靠、高效、可扩展的系统平台。
关注微信公众号,提前获取相关推文
在这里插入图片描述

一、 需求分析

  1. 核心功能:

    • 恒温控制: 使用PID算法精确控制干燥箱内部温度,确保耗材在最佳环境下干燥。
    • 热风循环: 通过风扇产生热风循环,均匀加热箱内耗材,避免局部温度过高或过低。
    • 温湿度显示: 使用0.91寸OLED屏幕实时显示箱内温度和湿度。
    • 用户交互: 简单的按键操作,用于设置目标温度,以及查看当前状态。
  2. 扩展需求:

    • 多档温度设置: 提供多档预设温度,适应不同耗材的干燥需求。
    • 定时功能: 可以设置定时烘干时间,避免长时间加热。
    • 异常报警: 当温度过高或过低时发出报警。
    • 自适应PID: PID参数可以根据实际环境进行自适应调整。
    • 远程监控: 可选,未来可增加WiFi模块实现远程监控。
  3. 可靠性要求:

    • 安全可靠: 系统运行稳定,避免过热、短路等安全隐患。
    • 精度要求: 温度控制精度在±1℃内。
    • 长时间运行: 能够长时间稳定工作。
  4. 可扩展性要求:

    • 软件架构: 软件架构模块化、易于扩展和维护。
    • 硬件接口: 预留足够的硬件接口,方便添加新功能。

二、 系统架构设计

  1. 硬件架构:

    • 主控芯片: 选择低功耗的单片机,如STM32F103C8T6(或ESP32等),具有足够的处理能力和外设接口。
    • 温度传感器: 使用高精度温湿度传感器,如DHT22或SHT30。
    • 加热模块: 使用PTC加热片或加热丝,配合PWM调速控制加热功率。
    • 风扇: 使用直流风扇,配合PWM调速控制风速。
    • OLED显示屏: 使用0.91寸I2C OLED显示屏。
    • 按键: 若干按键用于用户交互。
    • 电源模块: 为整个系统提供稳定的电源。
  2. 软件架构:

    • 分层架构: 采用分层架构,将系统划分为硬件抽象层(HAL)、驱动层、服务层和应用层。
    • 模块化设计: 每个功能模块都是独立的,方便开发和维护。
    • 状态机: 使用状态机管理系统运行状态。
    • 实时操作系统(RTOS): 可以考虑使用 FreeRTOS 或类似 RTOS 来管理任务。

三、 详细的代码设计架构及C代码实现

1. 硬件抽象层 (HAL)

  • 目的: 屏蔽底层硬件差异,提供统一的接口给上层使用。
  • 文件: hal.h, hal.c
// hal.h
#ifndef __HAL_H__
#define __HAL_H__

#include <stdint.h>
#include <stdbool.h>

// GPIO配置
#define HEATER_PIN     // 定义加热器控制引脚
#define FAN_PIN        // 定义风扇控制引脚
#define BUTTON1_PIN   // 定义按键1引脚
#define BUTTON2_PIN   // 定义按键2引脚
#define BUTTON3_PIN  // 定义按键3引脚

// 定义高低电平
#define HIGH 1
#define LOW  0

// 定义引脚模式
typedef enum {
   
    GPIO_MODE_INPUT,
    GPIO_MODE_OUTPUT
} gpio_mode_t;

// 初始化GPIO
void hal_gpio_init(uint16_t pin, gpio_mode_t mode);

// 设置GPIO输出电平
void hal_gpio_set_output(uint16_t pin, uint8_t level);

// 读取GPIO输入电平
uint8_t hal_gpio_get_input(uint16_t pin);

// 延时函数
void hal_delay_ms(uint32_t ms);

// PWM 配置
void hal_pwm_init(uint16_t pin, uint32_t frequency); // 初始化PWM
void hal_pwm_set_duty(uint16_t pin, uint16_t duty); // 设置PWM占空比

// I2C 配置
void hal_i2c_init(); // 初始化I2C
void hal_i2c_write(uint8_t addr, uint8_t reg, uint8_t data); // I2C写入
void hal_i2c_read(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len);  // I2C读取

// ADC 配置
void hal_adc_init(); // 初始化ADC
uint16_t hal_adc_read(uint16_t channel); // ADC读取

//串口配置
void hal_uart_init(uint32_t baudrate); //初始化串口
void hal_uart_send_byte(uint8_t data);  //发送一个字节
void hal_uart_send_string(const char *str); //发送字符串
uint8_t hal_uart_receive_byte();//接收一个字节
#endif

// hal.c
#include "hal.h"
// 包含你使用的单片机特定的头文件,例如
// #include "stm32f10x.h"  // STM32
// #include "esp32/esp32.h" // ESP32

// GPIO 初始化
void hal_gpio_init(uint16_t pin, gpio_mode_t mode) {
   
    // 配置特定单片机的GPIO模式
    // 例如:
    //  if (pin == HEATER_PIN) {
   
    //  } else if (pin == FAN_PIN) {
   
    //  }
     //else if...
    // 根据mode配置输入输出模式
}

// 设置GPIO输出
void hal_gpio_set_output(uint16_t pin, uint8_t level) {
   
    //  配置特定单片机的GPIO输出
    //例如:
    //  if(pin== HEATER_PIN)
    //  {
   
    //       if(level == HIGH)
    //         GPIOA->BSRR = GPIO_BSRR_BS12;   //例如点亮LED
    //      else
    //         GPIOA->BSRR = GPIO_BSRR_BR12; // 例如关闭LED
    //  }
}

// 读取GPIO输入
uint8_t hal_gpio_get_input(uint16_t pin) {
   
    // 读取特定单片机的GPIO输入
   //例如:
    //  if(pin== BUTTON1_PIN)
    //    return (GPIOA->IDR & GPIO_IDR_IDR1);
    //else if ...
     return 0;
}

// 延时函数
void hal_delay_ms(uint32_t ms) {
   
    // 实现延时函数,例如使用单片机的定时器或循环
    for(int i=0;i<ms*1000;i++);
}

// PWM 初始化
void hal_pwm_init(uint16_t pin, uint32_t frequency) {
   
    // 初始化特定单片机的PWM
}

// PWM 设置占空比
void hal_pwm_set_duty(uint16_t pin, uint16_t duty) {
   
    // 设置特定单片机的PWM占空比
}

//I2C 初始化
void hal_i2c_init(){
   
 // 初始化特定单片机的I2C
}
// I2C写入
void hal_i2c_write(uint8_t addr, uint8_t reg, uint8_t data){
   
 // I2C写入
}
// I2C读取
void hal_i2c_read(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len){
   
 // I2C读取
}

// ADC 初始化
void hal_adc_init(){
   
    // 初始化特定单片机的ADC
}

// ADC 读取
uint16_t hal_adc_read(uint16_t channel){
   
    // ADC 读取特定通道的值
    return 0;
}

//串口初始化
void hal_uart_init(uint32_t baudrate){
   
    // 初始化串口
}
//串口发送一个字节
void hal_uart_send_byte(uint8_t data){
   
    // 发送一个字节
}

//串口发送字符串
void hal_uart_send_string(const char *str){
   
    while(*str!='\0'){
   
      hal_uart_send_byte(*str++);
    }
}

//串口接收一个字节
uint8_t hal_uart_receive_byte(){
   
    return 0;//接收一个字节
}

2. 驱动层

  • 目的: 封装
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式程序员小刘

很高兴文章有帮助到你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值