news 2026/6/10 15:52:51

毕设 stm32 wifi远程温控风扇系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
毕设 stm32 wifi远程温控风扇系统

文章目录

  • 0 前言
  • 1 主要功能
  • 2 系统架构
  • 3 核心软件设计
      • 3.3.2 初始化
      • 3.3.3 温度采集与显示
  • 4 实现效果
  • 5 最后

0 前言

🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩毕业设计 stm32 wifi远程温控风扇系统

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

🧿项目分享:见文末!

实物演示效果

毕业设计 stm32 wifi远程温控风扇系统 - 单片机 嵌入式 物联网

1 主要功能

按照时间规划和目标进度完成开发基于STM32远程智能降温系统的电路设计、程序设计、程序调试、软硬结合调试,从而实现风扇降温系统的自动智能模式和远程手动模式。

(1)自动智能模式
自动智能模式可根据设备的温湿度传感器进行时实数据检测,进行自动反馈达到自动开启风扇降温。

(2)远程手动模式
在自动智能模式中无法满足降温特殊需求情况,可根据特殊需求切换远程手动模式,在开发已有的客户端上发送降温命令,从而实现根据特殊需求情况降温的远程手动模式。

2 系统架构

(1)空气温湿度传感器

DHT11 是一款湿温度一体化的数字传感器。该传感器包括一个电阻式测湿元件和一个 NTC测温元件,并与一个高性能 8 位单片机相连接。通过单片机等微处理器简单的电路连接就能够实时的采集本地湿度和温度。DHT11 与单片机之间能采用简单的单总线进行通信,仅仅需要一个 I/O 口。传感器内部湿度和温度数据 40Bit 的数据一次性传给单片机,数据采用校验和方式进行校验,有效的保证数据传输的准确性。DHT11 功耗很低,5V 电源电压下,工作平均最大电流 0.5mA。

(2)光照强度传感器
光照强度的监测采用的是bh1750光照强度传感器。有接近视觉灵敏度的光谱灵敏度特性,支持I2CBUS接口,支持1.8v逻辑输入接口。传感器有两种可选的I2Cslave地址,无需其他外部件。光源依赖性弱,受红外线影响很小。传感器通过降低功率功能,实现低电流化。通过50Hz/60Hz除光噪音功能实现稳定的测定,最小误差变动在±20%。

(3)WiFi通信模块
ESP8266是一款高性能的无线 WIFI模块。ESP8266 模块采用串口(LVTTL)与 MCU(或其他串口设备)通信,内置 TCP/IP协议栈,能够实现串口与 WIFI 之间的转换。通过ESP8266模块,传统的串口设备只是需要简单的串口配置,即可通过网络(WIFI)传输自己的数据。
ATK-ESP8266 模块支持 LVTTL 串口,兼容 3.3V 和 5V 单片机系统,可以很方便的与你的产品进行连接。模块支持串口转 WIFI STA、串口转 AP 和 WIFI STA+WIFI AP 的模式,从而快速构建串口-WIFI 数据传输方案。

使用到的硬件器件

  • STM32F103RCT6开发板 * 1
  • DHT11温湿度传感器 * 1
  • 继电器模块 * 1
  • Wifi - ESP01S * 1
  • 1.44寸液晶屏(SPI接口) * 1
  • 小风扇模块 * 1
  • 杜邦线若干

3 核心软件设计

控制系统软件使用 C 语言编程。

使用模块化设计, 除主程序外, 还有各功能子程序, 分别执行直流电机驱动调速及温度采集、 显示等功能, 编辑环境采用集成开发环环境 Keil。

程序总体运行流程图如下:

3.3.2 初始化

系统初始化包括 STM32 系统定时器初始化, GPIO 口初始化以及 LCD1602 初始化等。

3.3.3 温度采集与显示

DS18B20 温度传感器进行温度采集时, 要依次进行初始化, ROM 操作指令, 存储器操作指令, 数据传输等操作

篇幅有限,不过多复述详细设计细节,详细的设计分享在论文中。。。

关键代码

#include"stm32f10x.h"#include"bsp_SysTick.h"#include<LCD1602.h>#include"bsp_ds18b20.h"intmain(){intPWM,low,zhouqi;floatwendu;intwendu1;zhouqi=500;low=zhouqi-PWM;SysTick_Init();init1602();lcdpos(1,0);writestring("TEM: 00.0");GPIO_SetBits(GPIOB,GPIO_Pin_0);while(DS18B20_Init()){lcdpos(0,0);writestring(" no ds18b20 exit");}lcdpos(0,0);writestring("ds18b20 exit");for(;;){DS18B20_Get_Temp(wendu);if(wendu<0){lcdpos(1,4);writestring("-");}wendu1=wendu*100;lcdpos(1,5);write_dat(wendu1/10000+0x30);lcdpos(1,6);write_dat(wendu1%10000/1000+0x30);lcdpos(1,7);write_dat(wendu1%1000/100+0x30);lcdpos(1,9);write_dat(wendu1%100/10+0x30);lcdpos(1,10);write_dat(wendu1%10+0x30);Delay_ms(2000);if(wendu1>30){low=500;GPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(PWM);}if(wendu1<15){low=0;GPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(PWM);}if(wendu1>=15&wendu1<20){low=100;GPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(PWM);GPIO_ResetBits(GPIOB,GPIO_Pin_0);Delay_ms(low);}if(wendu1>=20&wendu1<25){low=200;GPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(PWM);GPIO_ResetBits(GPIOB,GPIO_Pin_0);Delay_ms(low);}if(wendu1>=25&wendu1<30){low=300;GPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(PWM);GPIO_ResetBits(GPIOB,GPIO_Pin_0);Delay_ms(low);}}}2.DS18B20 子程序#include"bsp_ds18b20.h"/* * 函数名: DS18B20_GPIO_Config * 描述 : 配置 DS18B20 用到的 I/O 口 * 输入 : 无 * 输出 : 无 */staticvoidDS18B20_GPIO_Config(void){/*定义一个 GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启 DS18B20_PORT 的外设时钟*/RCC_APB2PeriphClockCmd(DS18B20_CLK,ENABLE);/*选择要控制的 DS18B20_PORT 引脚*/GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;/*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;/*设置引脚速率为 50MHz */GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;/*调用库函数, 初始化 DS18B20_PORT*/GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);GPIO_SetBits(DS18B20_PORT,DS18B20_PIN);}/* * 函数名: DS18B20_Mode_IPU * 描述 : 使 DS18B20-DATA 引脚变为输入模式 * 输入 : 无 * 输出 : 无 */staticvoidDS18B20_Mode_IPU(void){GPIO_InitTypeDef GPIO_InitStructure;/*选择要控制的 DS18B20_PORT 引脚*/GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;/*设置引脚模式为浮空输入模式*/GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;/*调用库函数, 初始化 DS18B20_PORT*/GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);}/* * 函数名: DS18B20_Mode_Out_PP * 描述 : 使 DS18B20-DATA 引脚变为输出模式 * 输入 : 无 * 输出 : 无 */staticvoidDS18B20_Mode_Out_PP(void){GPIO_InitTypeDef GPIO_InitStructure;/*选择要控制的 DS18B20_PORT 引脚*/GPIO_InitStructure.GPIO_Pin=DS18B20_PIN;/*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;/*设置引脚速率为 50MHz */GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;/*调用库函数, 初始化 DS18B20_PORT*/GPIO_Init(DS18B20_PORT,&GPIO_InitStructure);}/* *主机给从机发送复位脉冲 */staticvoidDS18B20_Rst(void){/* 主机设置为推挽输出 */DS18B20_Mode_Out_PP();DS18B20_DATA_OUT(LOW);/* 主机至少产生 480us 的低电平复位信号 */Delay_us(750);/* 主机在产生复位信号后, 需将总线拉高 */DS18B20_DATA_OUT(HIGH);Delay_us(15);}/* * 检测从机给主机返回的存在脉冲 * 0: 成功 * 1: 失败 */staticuint8_tDS18B20_Presence(void){uint8_tpulse_time=0;/* 主机设置为上拉输入 */DS18B20_Mode_IPU();while(DS18B20_DATA_IN()&&pulse_time<100){pulse_time++;Delay_us(1);}/*经过100us 后, 存在脉冲都还没有到来*/if(pulse_time>=100)return1;elsepulse_time=0;/* 存在脉冲到来, 且存在的时间不能超过 240us */while(!DS18B20_DATA_IN()&&pulse_time<240){pulse_time++;Delay_us(1);}if(pulse_time>=240)return1;elsereturn0;}/* * 从 DS18B20 读取一个 bit */staticuint8_tDS18B20_Read_Bit(void){uint8_tdat;/* 读 0 和读 1 的时间至少要大于 60us */DS18B20_Mode_Out_PP();/* 读时间的起始: 必须由主机产生 >1us <15us 的低电平信号 */DS18B20_DATA_OUT(LOW);Delay_us(10);/*设置成输入, 释放总线, 由外部上拉电阻将总线拉高*/DS18B20_Mode_IPU();//Delay_us(2);if(DS18B20_DATA_IN()==SET)dat=1;elsedat=0;/* 这个延时参数请参考时序图 */Delay_us(45);returndat;}/* * 从 DS18B20 读一个字节, 低位先行 */uint8_tDS18B20_Read_Byte(void){uint8_ti,j,dat=0;for(i=0;i<8;i++){j=DS18B20_Read_Bit();dat=(dat)|(j<<i);}returndat;}/* * 写一个字节到 DS18B20, 低位先行 */voidDS18B20_Write_Byte(uint8_tdat){uint8_ti,testb;DS18B20_Mode_Out_PP();for(i=0;i<8;i++){testb=dat&0x01;dat=dat>>1;/* 写 0 和写 1 的时间至少要大于 60us */if(testb){DS18B20_DATA_OUT(LOW);/* 1us < 这个延时 < 15us */Delay_us(8);DS18B20_DATA_OUT(HIGH);Delay_us(58);}else{DS18B20_DATA_OUT(LOW);/* 60us < Tx 0 < 120us */Delay_us(70);DS18B20_DATA_OUT(HIGH);/* 1us < Trec(恢复时间) < 无穷大*/Delay_us(2);}}}voidDS18B20_Start(void){DS18B20_Rst();DS18B20_Presence();DS18B20_Write_Byte(0XCC);/* 跳过 ROM */DS18B20_Write_Byte(0X44);/* 开始转换 */}uint8_tDS18B20_Init(void){DS18B20_GPIO_Config();DS18B20_Rst();returnDS18B20_Presence();}floatDS18B20_Get_Temp(floatf_tem){uint8_ttpmsb,tplsb;shorts_tem;DS18B20_Rst();DS18B20_Presence();DS18B20_Write_Byte(0XCC);/* 跳过 ROM */DS18B20_Write_Byte(0X44);/* 开始转换 */DS18B20_Rst();DS18B20_Presence();DS18B20_Write_Byte(0XCC);/* 跳过 ROM */DS18B20_Write_Byte(0XBE);/* 读温度值 */tplsb=DS18B20_Read_Byte();tpmsb=DS18B20_Read_Byte();s_tem=tpmsb<<8;s_tem=s_tem|tplsb;If(s_tem<0)/* 负温度 */f_tem=(~s_tem+1)*0.0625;elsef_tem=s_tem*0.0625;returnf_tem;}

/*******************************************************************
篇幅有限,只展示部分代码
********************************************************************/

4 实现效果

演示视频

毕业设计 stm32 wifi远程温控风扇系统 - 单片机 嵌入式 物联网

5 最后

包含内容

🧿项目分享:见文末!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:59:25

12、探秘 Wi-Fi 网络的趣味玩法

探秘 Wi-Fi 网络的趣味玩法 在网络世界中,我们常常希望能更深入地了解自己的网络环境,知晓网络中各设备的状态,以及监控网络流量。下面为大家介绍一些实用的网络工具和操作方法。 Nmap 扫描网络主机 List Scan 能告知我们 IP 地址与主机名的对应关系,但无法确定计算机当…

作者头像 李华
网站建设 2026/6/9 7:29:16

13、探索网络:Wi-Fi 技巧全攻略

探索网络:Wi-Fi 技巧全攻略 在网络技术的领域中,我们常常希望能够突破本地网络的限制,让设备如树莓派(Pi)在互联网上也能发挥更大的作用。同时,掌握一些网络工具的使用方法,对于网络探索和管理至关重要。下面将详细介绍 Wireshark 的运行方法、动态 DNS 的设置、端口转…

作者头像 李华
网站建设 2026/6/10 14:07:37

jmeter接口测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 今天笔者呢&#xff0c;想给大家聊聊Jmeter接口测试流程详解&#xff0c;废话不多说直接进入正题。一、jmeter简介Jmeter是由Apache公司开发的java开源项目&am…

作者头像 李华
网站建设 2026/6/10 14:10:45

TVM算子验证实战:构建可靠的深度学习编译器测试体系

TVM算子验证实战&#xff1a;构建可靠的深度学习编译器测试体系 【免费下载链接】tvm Open deep learning compiler stack for cpu, gpu and specialized accelerators 项目地址: https://gitcode.com/gh_mirrors/tvm/tvm 在深度学习模型部署的实践中&#xff0c;你是否…

作者头像 李华
网站建设 2026/6/10 14:08:08

神经网络算法初探

神经网络算法初探简介神经网络优化一、优化算法二、正则化技术三、超参数调优四、模型压缩实例代码神经网络算法应用简介 神经网络算法是模拟生物神经系统工作机制的计算模型&#xff0c;兼具逻辑推理与直观思维双重特性。其逻辑性体现在建立符号化规则体系进行串行推理&#…

作者头像 李华
网站建设 2026/6/10 14:04:30

毕业设计 stm32人脸识别快递柜系统(源码+硬件+论文)

文章目录 0 前言1 主要功能2 硬件设计(原理图)3 核心软件设计4 实现效果5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉…

作者头像 李华