这个基于STM32的WiFi远程温控风扇系统是我去年指导的一个本科生毕业设计项目,从选题到实现花了整整三个月时间。本质上它是一个典型的物联网终端设备,通过温度传感器采集环境数据,经过STM32处理后再通过WiFi模块上传到手机APP,用户可以在任何地方远程查看温度并控制风扇转速。
这个系统最吸引人的地方在于它完美结合了嵌入式开发、无线通信和移动应用三大技术领域。对于电子类专业的学生来说,做这样一个项目能全面锻炼硬件设计、嵌入式编程和物联网应用开发能力。实际测试中,系统响应速度相当不错,在20米范围内温控延迟不超过2秒,完全能满足普通家庭或办公室的使用需求。
整个系统采用三层架构:
这种架构最大的优势是各模块分工明确,开发时可以分阶段实现。我们先用USB转TTL模块单独调试ESP8266的AT指令,等通信稳定后再与STM32联调,大大降低了调试难度。
主控选择STM32F103C8T6是因为:
WiFi模块选用ESP8266-01S主要考虑:
温度传感器选择DS18B20的原因是:
系统采用5V USB供电,通过AMS1117-3.3转换为3.3V给各模块供电。特别注意:
实际调试中发现,如果不加足够的滤波电容,ESP8266在发送数据时会引起电源波动,导致STM32意外复位。
DS18B20采用寄生供电模式,接线方案:
这种设计节省了一个电源引脚,但要注意:
ESP8266通过串口与STM32通信:
调试时发现的关键点:
使用STM32的TIM2定时器产生精确的1ms时基,DS18B20驱动程序主要包含:
c复制// 复位脉冲
void DS18B20_Reset(void) {
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
delay_us(480);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
delay_us(60);
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
自定义了简单的JSON格式协议:
json复制{
"type": "status",
"temp": 26.5,
"fan_speed": 3
}
STM32通过串口中断接收处理AT指令:
c复制void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if(huart->Instance == USART2) {
if(strstr((char*)rx_buffer, "OK")) {
wifi_ready = 1;
}
HAL_UART_Receive_IT(&huart2, rx_buffer, 1);
}
}
采用PID控制算法调节PWM占空比:
c复制float PID_Control(float set_temp, float real_temp) {
static float err_sum = 0, last_err = 0;
float err = set_temp - real_temp;
err_sum += err;
float output = KP * err + KI * err_sum + KD * (err - last_err);
last_err = err;
return output > 100 ? 100 : (output < 0 ? 0 : output);
}
参数整定经验:
使用Android Studio开发,主要界面包括:
关键代码片段:
java复制public class MainActivity extends AppCompatActivity {
private MqttAndroidClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
client = new MqttAndroidClient(this, "tcp://broker.hivemq.com:1883", "android_client");
client.setCallback(new MqttCallbackExtended() {
@Override
public void connectComplete(boolean reconnect, String serverURI) {
subscribeToTopic("fan/control");
}
});
}
}
采用MQTT协议实现双向通信:
选择MQTT而非HTTP的原因是:
WiFi频繁断连:
温度读数异常:
APP控制无响应:
降低功耗:
提高响应速度:
增强稳定性:
这个基础系统还可以进一步扩展:
实际测试中发现,在封闭小空间内,将温度采样间隔设为3秒、PID参数KP=6.5/KI=0.2/KD=1.2时,系统能将温度波动控制在±0.3℃以内,完全达到设计预期。整个项目的物料成本约120元,非常适合作为电子类学生的综合实训项目。