news 2026/4/16 12:36:16

STM32项目分享:智能热水器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32项目分享:智能热水器

目录

一、前言

二、项目简介

1.功能详解

2.主要器件

三、原理图设计

四、PCB硬件设计

PCB图

五、程序设计

六、实验效果 ​

七、包含内容

项目分享


一、前言

项目成品图片:

哔哩哔哩视频链接:

https://www.bilibili.com/video/BV1vPiCBKE6j/?spm_id_from=333.337.search-card.all.click&vd_source=a90461cae133c0c360a3780433efae62

(资料分享见文末)

二、项目简介

1.功能详解

基于STM32的智能热水器

功能如下:

  1. 环境采集:采集环境光照强度、水位、水温
  2. 显示功能:屏幕显示当前时间、光照强度、热水器水位、水温;第二页显示定时开始时间和结束时间
  3. 模式切换:可以通过按键切换自动模式和手动模式
  4. 自动模式:当前时间处于定时工作时间内:光照小于光照阈值时开启照明灯,水位小于最低水位时开启进水水泵加水且此时蜂鸣器报警提醒;水位超过最大水位时开启排水水泵放水;温度低于最低温度时蜂鸣器报警并开启加热片加热水直到温度达到最高温度时停止加热; 当水位过低时加热功能不启动;当时间处于定时时间外则热水器不自动工作,只能通过手动模式控制。
  5. 手动模式:通过按键控制LED照明灯、加水、放水、加热
  6. 阈值调节:可通过按键设置当前时间、温度上限、温度下限、光照阈值、水位上限、水位下限、定时开始时间和结束时间
  7. 蓝牙APP:通过连接蓝牙APP,可以查看信息数据和控制指令下发,包括模式切换、手动外设控制

2.主要器件

  • STM32F103C8T6最小系统板
  • OLED显示屏(4针IIC协议)
  • 光敏传感器
  • 水位传感器
  • DS18B20温度传感器
  • 大功率LED灯模块
  • PTC加热片
  • 继电器
  • 水泵模块
  • 有源蜂鸣器

三、原理图设计

四、PCB硬件设计

PCB图

五、程序设计

#include "stm32f10x.h" #include "led.h" #include "beep.h" #include "usart.h" #include "usart2.h" #include "usart3.h" #include "delay.h" #include "ds18b20.h" #include "LDR.h" #include "oled.h" #include "key.h" #include "Modules.h" #include "TIM2.h" #include "TIM3.h" #include "adcx.h" #include "flash.h" #include "JDQ.h" #include "MyRTC.h" #include "stm32f10x_iwdg.h" /****************异方辰电子工作室******************* STM32 *项目 : STM32智能热水器 *版本 : V1.0 *MCU : TM32F103C8T6 *接口 : 见代码 *BILIBILI : 异方辰电子 *小红书 : 异方辰电子 *CSDN : 异方辰电子 *授权IP : 辰哥单片机设计、异方辰、YFC电子、北海单片机设计 **********************BEGIN***********************/ SensorModules sensorData; //声明传感器数据结构体变量 SensorThresholdValue Sensorthreshold; //声明传感器阈值结构体变量 DriveModules driveData; //声明驱动器状态结构体变量 uint16_t time_num = 0; //10ms计时 static uint8_t app_cmd = 0; // 0 无指令 3 开 4 关 uint8_t mode = 0; //系统模式 1自动 2手动 3设置 u8 Flag_setTime = 0; u8 setTime_Type = 0; // 时间设置临时变量 uint16_t tempTime[3]; // 当前时间临时变量 uint16_t tempTime_start[3]={0,0,0}; // 开始时间临时变量 uint16_t tempTime_end[3]={1,1,1}; // 结束时间临时变量 uint8_t timeFieldIndex = 0; uint8_t lastTimeFieldIndex = 0; extern uint8_t usart2_buf[256]; //串口2接收数组 char display_buf[16]; //显示数组 //系统静态变量 static uint8_t count_a = 1; //自动模式按键数 uint8_t count_m = 1; //手动模式按键数 static uint8_t count_s = 1; //设置模式按键数 int main(void) { SystemInit(); //配置系统时钟为72M delay_init(72); //传感器初始化 DS18B20_Init(); //ds18b20初始化 LDR_Init(); //光敏电阻初始化 //执行器初始化 LED_Init(); //大功率LED灯初始化 BUMP1_Init(); //抽水水泵初始化 BUMP2_Init(); //放水水泵初始化 JRP_Init(); //加热片初始化 BEEP_Init(); //蜂鸣器初始化 Key_Init(); //按键初始化 OLED_Init(); //OLED初始化 MyRTC_Init(); //RTC时钟初始化 USART1_Config();//串口1初始化 USART2_Config();//串口2初始化 USART3_Config();//串口3初始化 TIM2_Init(72,1000-1); TIM3_Int_Init(1000-1,72-1); //定时1ms中断 OLED_Clear(); delay_ms(300); FLASH_ReadThreshold(); MyRTC_SetTime(); while (1) { SensorScan(); //获取传感器数据 Bluetooth_Control();//蓝牙控制函数 // 将数据存入Flash FLASH_W(FLASH_START_ADDR,Sensorthreshold.luxValue, Sensorthreshold.tempValue_MIN ,Sensorthreshold.tmepValue_MAX , Sensorthreshold.waterleveVlaue_MAX,Sensorthreshold.waterleveVlaue_MIN , MyRTC_Time[3],MyRTC_Time[4],MyRTC_Time[5], tempTime_start[0],tempTime_start[1],tempTime_start[2], tempTime_end[0],tempTime_end[1],tempTime_end[2]); MyRTC_ReadTime(); switch(mode) { case AUTO_MODE: if(SetAuto() ==1) { OLED_autoPage1(); //显示主页面1固定信息 SensorDataDisplay1(); //显示传感器1数据 } else { OLED_autoPage2(); //显示主页面2固定信息 SensorDataDisplay2(); //显示传感器2数据 } AutoControl(); /*按键1按下时切换模式*/ if (KeyNum == KEY_1) //系统模式mode 1自动 2手动 3设置 { KeyNum = 0; mode = MANUAL_MODE; count_m = 1; OLED_Clear(); } if (KeyNum == KEY_Long1) { KeyNum = 0; mode = SETTINGS_MODE; count_s = 1; OLED_Clear(); } Control_Manager(); break; case MANUAL_MODE: OLED_manualOption(SetManual()); ManualControl(SetManual()); OLED_manualPage1(); ManualSettingsDisplay1(); if (KeyNum == KEY_1) //系统模式mode 0手动 1自动(默认) { KeyNum = 0; mode = AUTO_MODE; count_a = 1; OLED_Clear(); } Control_Manager(); break; case SETTINGS_MODE: OLED_settingsOption(SetSelection()); //实现阈值设置页面的选择功能 ThresholdSettings(SetSelection()); //实现阈值调节功能 if(Flag_setTime == 0) { if (SetSelection() <= 4) { OLED_settingsPage1(); //显示阈值设置界面1固定信息 SettingsThresholdDisplay1(); //显示传感器阈值1数据 } else //否则显示设置页面2 { OLED_settingsPage2(); //显示阈值设置界面2固定信息 SettingsThresholdDisplay2(); //显示传感器阈值2数据 } } //判断是否退出阈值设置界面 if (KeyNum == KEY_1) { KeyNum = 0; mode = AUTO_MODE; //跳转到主界面 count_a = 1; OLED_Clear(); //清屏. // 将修改好的阈值存入Flash中 FLASH_W(FLASH_START_ADDR,Sensorthreshold.luxValue, Sensorthreshold.tempValue_MIN ,Sensorthreshold.tmepValue_MAX , Sensorthreshold.waterleveVlaue_MAX,Sensorthreshold.waterleveVlaue_MIN , MyRTC_Time[3],MyRTC_Time[4],MyRTC_Time[5], tempTime_start[0],tempTime_start[1],tempTime_start[2], tempTime_end[0],tempTime_end[1],tempTime_end[2]); } break; case TIME_SET_MODE: switch(setTime_Type) { case 5: // 修改当前时间 if (Flag_setTime == 1) { for (int i = 0; i < 3; i++) { tempTime[i] = MyRTC_Time[i+3]; } Flag_setTime = 2; timeFieldIndex = 0; lastTimeFieldIndex = 0; } OLED_ShowChinese(32,0,20,16,1); //当 OLED_ShowChinese(48,0,21,16,1); //前 OLED_ShowChinese(64,0,22,16,1); //时 OLED_ShowChinese(80,0,23,16,1); //间 OLED_ShowChar(96,0,':',16,1); OLED_TIME_SET_MODE(tempTime); // 显示时间设置模式 TimeSettings(tempTime); // 时间设置函数 break; case 6: // 修改开始时间 OLED_ShowChinese(32,0,24,16,1); //开 OLED_ShowChinese(48,0,8,16,1); //始 OLED_ShowChinese(64,0,22,16,1); //时 OLED_ShowChinese(80,0,23,16,1); //间 OLED_ShowChar(96,0,':',16,1); OLED_TIME_SET_MODE(tempTime_start); // 显示时间设置模式 TimeSettings(tempTime_start); // 时间设置函数 break; case 7: // 修改结束时间 OLED_ShowChinese(32,0,12,16,1); //结 OLED_ShowChinese(48,0,13,16,1); //束 OLED_ShowChinese(64,0,22,16,1); //时 OLED_ShowChinese(80,0,23,16,1); //间 OLED_ShowChar(96,0,':',16,1); OLED_TIME_SET_MODE(tempTime_end); // 显示时间设置模式 TimeSettings(tempTime_end); // 时间设置函数 break; } if (KeyNum == KEY_1) { KeyNum = 0; if(Flag_setTime == 2) { for (int i = 0; i < 3; i++) { MyRTC_Time[i+3] = tempTime[i]; } } MyRTC_SetTime(); // RTC设置时间 mode = SETTINGS_MODE; count_a = 1; Flag_setTime = 0; OLED_Clear(); } break; default: break; } } }

六、实验效果

七、包含内容

项目分享

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

论文AI率98%怎么办?3招帮你降到安全线以下

论文AI率98%怎么办&#xff1f;3招帮你降到安全线以下 TL;DR 太长不看 论文AI率98%不要慌&#xff0c;按这3招来&#xff1a;第一招判断是真AI还是误判&#xff0c;明确目标AI率&#xff1b;第二招用专业工具快速处理&#xff08;推荐比话降AI或嘎嘎降AI&#xff0c;可从98%降到…

作者头像 李华
网站建设 2026/4/16 10:43:36

偏远地区设计学生就业难?远程工作接单,实现高薪自由职业

对于偏远地区的设计专业学生而言&#xff0c;职业起步往往面临多重挑战&#xff1a;本地优质岗位有限、异地求职成本高昂、行业资源相对缺乏。然而&#xff0c;随着数字办公模式的普及&#xff0c;远程接单正为这些同学开辟新的路径——无需离开家乡&#xff0c;也能凭借专业技…

作者头像 李华
网站建设 2026/4/15 22:07:13

《算法竞赛从入门到国奖》算法基础:搜索-DFS初识

&#x1f4a1;Yupureki:个人主页 ✨个人专栏:《C》 《算法》 &#x1f338;Yupureki&#x1f338;的简介: 目录 前言 1. 选数 算法原理 实操代码 2. 飞机降落 算法原理 实操代码 3. 八皇后 Checker Challenge 算法原理 实操代码 前言 DFS全称深度优先搜索&#xff0…

作者头像 李华
网站建设 2026/4/16 12:21:48

知网AIGC检测实测:比话和学术猹谁能降到15%以下

知网AIGC检测实测&#xff1a;比话和学术猹谁能降到15%以下 TL;DR&#xff1a;实测对比比话降AI和学术猹两款8元/千字的工具。学术猹是有道出品&#xff0c;平均AI率可降至14.3%&#xff0c;文科论文表现出色&#xff1b;比话降AI专攻知网&#xff0c;承诺AI率<15%否则退款&…

作者头像 李华
网站建设 2026/4/15 19:58:50

比话降AI vs PaperPass:老牌平台和新锐引擎谁更强

比话降AI vs PaperPass&#xff1a;老牌平台和新锐引擎谁更强 TL;DR&#xff1a;PaperPass是老牌查重平台&#xff0c;运营多年口碑不错&#xff0c;但降AI效果一般&#xff08;实测56%只能降到27.5%&#xff09;。比话降AI是专攻知网的新锐工具&#xff0c;自研Pallas引擎&…

作者头像 李华
网站建设 2026/4/15 21:00:55

学长亲荐!继续教育必备TOP8 AI论文平台深度测评

学长亲荐&#xff01;继续教育必备TOP8 AI论文平台深度测评 学术写作工具测评&#xff1a;2026年继续教育必备AI平台深度解析 在当前快节奏的学术环境中&#xff0c;高效、专业的写作辅助工具已成为研究者和学习者的刚需。尤其是对于继续教育群体而言&#xff0c;如何在繁重的工…

作者头像 李华