简介:专为FDM-3D打印机设计的全手搓耗材干燥箱,PID恒温控制,0.91寸OLED温湿度显示,热风循环烘干耗材。外壳结构均可使用合适的材料3D打印出来。温控板程序简单修改还可用于鸡鸭鹅蛋等孵化控制器。
我将针对这款FDM-3D打印机耗材干燥箱,从需求分析到系统实现,再到测试验证和维护升级,详细阐述如何构建一个可靠、高效、可扩展的系统平台。
关注微信公众号,提前获取相关推文
一、 需求分析
-
核心功能:
- 恒温控制: 使用PID算法精确控制干燥箱内部温度,确保耗材在最佳环境下干燥。
- 热风循环: 通过风扇产生热风循环,均匀加热箱内耗材,避免局部温度过高或过低。
- 温湿度显示: 使用0.91寸OLED屏幕实时显示箱内温度和湿度。
- 用户交互: 简单的按键操作,用于设置目标温度,以及查看当前状态。
-
扩展需求:
- 多档温度设置: 提供多档预设温度,适应不同耗材的干燥需求。
- 定时功能: 可以设置定时烘干时间,避免长时间加热。
- 异常报警: 当温度过高或过低时发出报警。
- 自适应PID: PID参数可以根据实际环境进行自适应调整。
- 远程监控: 可选,未来可增加WiFi模块实现远程监控。
-
可靠性要求:
- 安全可靠: 系统运行稳定,避免过热、短路等安全隐患。
- 精度要求: 温度控制精度在±1℃内。
- 长时间运行: 能够长时间稳定工作。
-
可扩展性要求:
- 软件架构: 软件架构模块化、易于扩展和维护。
- 硬件接口: 预留足够的硬件接口,方便添加新功能。
二、 系统架构设计
-
硬件架构:
- 主控芯片: 选择低功耗的单片机,如STM32F103C8T6(或ESP32等),具有足够的处理能力和外设接口。
- 温度传感器: 使用高精度温湿度传感器,如DHT22或SHT30。
- 加热模块: 使用PTC加热片或加热丝,配合PWM调速控制加热功率。
- 风扇: 使用直流风扇,配合PWM调速控制风速。
- OLED显示屏: 使用0.91寸I2C OLED显示屏。
- 按键: 若干按键用于用户交互。
- 电源模块: 为整个系统提供稳定的电源。
-
软件架构:
- 分层架构: 采用分层架构,将系统划分为硬件抽象层(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. 驱动层
- 目的: 封装