基于STM32的智能加湿器设计(新版本)

目录

1、设计要求

2、系统功能

3、演示视频和实物

4、系统设计框图

5、软件设计流程图

6、原理图

7、主程序

8、总结


🤞大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是加湿器。设备的详细功能见网盘中的文章《12、基于STM32的智能加湿器设计(新版本)》:

链接:https://pan.baidu.com/s/1uWSZX2zbZwy9sYwwnvyktQ?pwd=5132

提取码:5132

     欢迎大家定制,非诚勿扰!

1、设计要求

智能加湿器作为智能家居生态系统的一部分,可以与其他智能设备(如智能灯泡、智能窗帘等)进行联动,实现全屋智能化控制,提升家居生活的智能化水平。该项目的成功实施可以为其他智能家居产品的开发提供技术参考和示范,推动智能家居技术的普及和应用。

2、系统功能

本设计是基于STM32单片机的智能加湿器系统设计,主要内容如下:

(1) 主控芯片,主控芯片采用的STM32F103C8T6,通过此芯片实现加湿器传感器信息的采集以及外设的控制。

(2) DHT11温湿度传感器,通过本传感器可以检测室内的湿度信息。

(3) 加湿模块,通过继电器控制加湿模块。

(4) HC-05蓝牙模块,实现远程控制加湿模块。

(5) 语音识别模块。语音识别模块核心芯片采LD3320芯片,是一种非特定人“语音识别”专用芯片。通“启动加湿器”和“关闭加湿器”等关键语句实现对加湿模块的语音控制。

(6) 时钟模块。实现定时功能加湿功能。

(7) OLED显示模块。OLED显示模块采用0.96寸液晶显示屏,该模块用来实时显示室内湿度和加湿器的工作状态

(8) 按键模块。按键模块用来控制模式选择和控制加湿器的开启与关闭。可通过单片机上按键设置湿度的上下限报警值并具有掉电保存功能,保存在单片机内部,上电无需重新设置参数。

(9)  蜂鸣器模块。湿度太低和太高报警。

3、演示视频和实物

基于STM32的智能加湿器控制系统设计(语音控制+蓝牙控制)

4、系统设计框图

5、软件设计流程图

加湿器控制系统设计的主程序主要是对相关硬件环境初始化,只有在系统硬件环境初始化成功后,系统才能够正常的工作。初始化过程涵盖了多个方面主要包括蓝牙通信模块初始化、语音识别模块初始化、外部中断初始化、采集模块初始化、输入模块初始化和显示模块初始化,程序完成初始化后,单片机将采集到温湿度的值显示在OLED屏幕上,显示完成后单片机会将当前湿度值与设置的湿度阈值进行比较,控制加湿器。

6、原理图

7、主程序

#include "stm32f10x.h" 
//定制单片机联系VX:lwfw123456789   
#include <stdio.h>
#include <string.h>
#include "sys.h"
#include "delay.h"
#include "OLED.h"
#include "Key.h"
#include "OLED.h"
#include "Serial.h"
#include "Serial3.h"
#include "LED.h"
#include "Buzzer.h"
#include "MyRTC.h"
#include "string.h"
#include "dht11.h"
#include "Serial2.h"uint16_t RTC_Time1[] = {7, 0, 0};    //3个定时时间
uint16_t RTC_Time2[] = {11, 0, 0};
uint16_t RTC_Time3[] = {19, 0, 0};uint8_t KeyNum;      //存储按键值
uint8_t RxData;      //蓝牙接收到的数据uint32_t bufe[4];     //存储温湿度
u8 temp, humi;
u8 t = 0;          //温湿度读取值的间隔u8 state = 1;  //设备开关
u8 state1 = 1; //模式选择
u8 state2,state3,state4,state5; //模式选择u8 ShiYu_Xia=20,ShiYu_Shang=60;     //湿度阈值设置void Jia_ON(void)
{JiaShi_ON();LED1_ON();
}void Jia_OFF(void)
{JiaShi_OFF();LED1_OFF();
}void YuYingMode()   //先说小杰唤醒,然后说打开窗户和关闭窗户
{if (Serial2_RxFlag == 1)        //串口接收到数据包的标志位,若是收到数据包,会置1{if (strcmp(Serial2_RxPacket, "JIASHI_ON") == 0){Jia_ON();}else if (strcmp(Serial2_RxPacket, "JIASHI_OFF") == 0){Jia_OFF();}Serial2_RxFlag = 0; //将标志位清零,不清零就接收不到下一个数据包了}
}void ctrlue()
{if(bufe[1]<ShiYu_Xia){Jia_ON();}else{Jia_OFF();}if(bufe[1]>ShiYu_Shang){Buzzer_Turn();LED2_ON();}else{Buzzer_OFF();LED2_OFF();}if (KeyNum == 2 )            //阈值设置{delay_ms(20);if (KeyNum == 2){state3++;if (state3 > 1){state3 = 0;}}}if (state3 == 0)                {if(KeyNum == 3) ShiYu_Xia++;if(KeyNum == 4) ShiYu_Xia--;}if (state3 == 1)                   {if(KeyNum == 3) ShiYu_Shang++;if(KeyNum == 4) ShiYu_Shang--;			 } 		
}void shoudong()
{Buzzer_OFF();	 if (KeyNum == 2 )            //手动模式控制{delay_ms(20);if (KeyNum == 2){state2++;if (state2 > 1){state2 = 0;}}}if (state2 == 1)                {Jia_ON();}if (state2 == 0)                   {Jia_OFF();} 		
}	void LanYa()
{if (Serial_GetRxFlag() == 1)      //蓝牙接收部分{RxData = Serial_GetRxData();     //蓝牙接收switch (RxData)        //蓝牙控制选择{case 1:Jia_ON();break;case 2:Jia_OFF();break;case 3:Buzzer_ON();break;case 4:Buzzer_OFF();case 5:ShiYu_Xia++;break;case 6:ShiYu_Xia--;break;case 7:ShiYu_Shang++;break;case 8:ShiYu_Shang--;break;  				default:break;}}
}void dingshi()
{if ((MyRTC_Time[3] == RTC_Time1[0]) && (MyRTC_Time[4] == RTC_Time1[1]) && (MyRTC_Time[5] == RTC_Time1[2]))//开启时间{Jia_ON();}if ((MyRTC_Time[3] == RTC_Time3[0]) && (MyRTC_Time[4] == RTC_Time3[1]) && (MyRTC_Time[5] == RTC_Time3[2])) //关闭时间{Jia_OFF();}
}int main(void)     //主函数
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   // 设置中断优先级分组为组2:2位抢占优先级,2位响应优先级delay_init();      //延时函数初始化SystemInit();Key_Init();    //按键初始化LED_Init();OLED_Init();Buzzer_Init();DHT11_Init();OLED_ShowString(1, 5, "XX:XX:XX");    //显示时间OLED_ShowChinese(2, 3, 3); //显示湿度OLED_ShowChinese(2, 4, 4);OLED_ShowString(2, 9, ":");OLED_ShowChinese(4, 1, 2);     //显示温度OLED_ShowChinese(4, 2, 4);OLED_ShowString(4, 5, ":");MyRTC_Init();Serial_Init();   //串口1初始化(蓝牙)Serial3_Init();   //串口2初始化(语音)Serial2_Init();   //串口2初始化(语音识别模块)while (1){	MyRTC_ReadTime();OLED_ShowNum(1, 5, MyRTC_Time[3], 2);OLED_ShowNum(1, 8, MyRTC_Time[4], 2);OLED_ShowNum(1, 11, MyRTC_Time[5], 2);if (t % 10 == 0){DHT11_Read_Data(&temp, &humi);  //读取温湿度并显示在OLED上bufe[0] = temp;     //温度bufe[1] = humi;    //湿度OLED_ShowNum(2, 10, bufe[1], 2);OLED_ShowString(2, 12, "%");OLED_ShowNum(4, 6, bufe[0], 2);OLED_ShowString(4, 8, "%");printf("\r\nWen=%d", bufe[0]);   //蓝牙上传数据printf("\r\nShi=%d\r\n", bufe[1]);								}OLED_ShowString(3, 2, "S_X:");				OLED_ShowNum(3, 6, ShiYu_Xia, 2);OLED_ShowString(3, 10, "S_S:");	OLED_ShowNum(3, 14, ShiYu_Shang, 2);KeyNum = Key_GetNum();               //按键检查if (KeyNum == 1 ) {delay_ms(20);if (KeyNum == 1){state1++;if (state1 > 4){state1 = 0;}}}if (state1 == 1)                //自动模式{ctrlue();   // 开OLED_ShowChinese(4, 7, 30);OLED_ShowChinese(4, 8, 31);}if (state1 == 0)                   //手动模式{shoudong();OLED_ShowChinese(4, 7, 29);OLED_ShowChinese(4, 8, 31);}if (state1 == 2)                     //定时模式{dingshi();OLED_ShowChinese(4, 7, 68);OLED_ShowChinese(4, 8, 69);}	if (state1 == 3)                     //蓝牙模式{LanYa();OLED_ShowChinese(4, 7, 62);OLED_ShowChinese(4, 8, 63);}if (state1 == 4)                     //语音模式{YuYingMode();OLED_ShowChinese(4, 7, 54);OLED_ShowChinese(4, 8, 55);}}
}

8、总结

本次设计采用了一种基于单片机的智能加湿器系统,其以STM32F103C8T6和温湿度传感器DHT11为核心,通过湿度传感器对湿度信号进行采集和转换,然后通过单片机对数据进行分析处理,实现智能切换加湿功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/69115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

21.2.2 保存

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 如果打开某个Excel文件修改后&#xff0c;需要保存到原文件或者用新的文件名保存&#xff0c;在 Excel.Application.Quit() 前使用W…

Deepseek v3R1 学习笔记

o1 o1 模型在训练过程中混合了多种奖励函数的设计方法&#xff0c;并且尝试从结果监督转向过程监督&#xff0c;在中间过程进行打分 使用的搜索策略&#xff1a;基于树的搜索和基于顺序修改的搜索 R1 R1-Zero 是从基础模型开始&#xff0c;完全由强化学习驱动&#xff0c;不…

mybatisgenerator接入

1、引入plugin <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.mybatis.generator</groupId>&l…

NacosRce到docker逃逸实战

NacosRce到docker逃逸实战 1、Nacos Derby Rce打入内存马 这个漏洞的原理大家应该都知道&#xff0c; 2.3.2 < Nacos < 2.4.0版本默认derby接口未授权访问&#xff0c;攻击者可利用未授权访问执行SQL语句加载构造恶意的JAR包导致出现远程代码执行漏洞。 在日常的漏洞挖…

mini-lsm通关笔记Week2Day6

项目地址&#xff1a;https://github.com/skyzh/mini-lsm 个人实现地址&#xff1a;https://gitee.com/cnyuyang/mini-lsm Summary 在本章中&#xff0c;您将&#xff1a; 实现WAL日志文件的编解码 系统重启时使用WAL日志恢复memtable 要将测试用例复制到启动器代码中并运行…

【DeepSeek背后的技术】系列三:强化学习(Reinforcement Learning, RL)

目录 1 简介1.1 强化学习&#xff08;RL&#xff09;简介1.2 基于人类反馈的强化学习 (RLHF) 简介1.2.1 四个重要角色1.2.2 三个步骤 2 强化算法2.1 PPO&#xff08;Proximal Policy Optimization&#xff09;2.1.1 核心思想2.1.2 算法步骤2.1.3 优点2.1.4 缺点2.1.5 应用场景 …

LabVIEW的智能电源远程监控系统开发

在工业自动化与测试领域&#xff0c;电源设备的精准控制与远程管理是保障系统稳定运行的核心需求。传统电源管理依赖本地手动操作&#xff0c;存在响应滞后、参数调节效率低、无法实时监控等问题。通过集成工业物联网&#xff08;IIoT&#xff09;技术&#xff0c;实现电源设备…

SpringBoot开发(四)SpringBoot配置文件

1. SpringBoot配置文件 1.1. 配置端口号和路径 &#xff08;1&#xff09;在application.properties文件下配置端口号和路径。 server.port: 8081 server.servlet.context-path/demo&#xff08;2&#xff09;运行访问。 1.2. 自定义配置 1.2.1. 方式一 &#xff08;1&…

win32汇编环境,窗口程序中自定义工具栏的使用示例

;运行效果 ;win32汇编环境,窗口程序中自定义工具栏的使用示例 ;工具栏一般放在菜单下面&#xff0c;相当于一个个小的对话框&#xff0c;当然你放在其它地方也可以。 ;原理是&#xff0c;创建一张BMP位图&#xff0c;比如下例用一张168*24的图&#xff0c;平均分成7部分&#x…

机器学习专业毕设选题推荐合集 人工智能

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…

备考蓝桥杯嵌入式4:使用LCD显示我们捕捉的PWM波

上一篇博客我们提到了定时器产生PWM波&#xff0c;现在&#xff0c;我们尝试的想要捕获我们的PWM波&#xff0c;测量它的频率&#xff0c;我们应该怎么做呢&#xff1f;答案还是回到我们的定时器上。 我们知道&#xff0c;定时器是一个高级的秒表&#xff08;参考笔者的比喻&a…

ArrayList 扩容机制的源码剖析

在 Java 编程中&#xff0c;ArrayList是一个常用的集合类&#xff0c;它实现了List接口&#xff0c;底层基于数组实现。与普通定长数组不同&#xff0c;ArrayList能够根据元素的添加情况动态调整数组的大小&#xff0c;这就是其扩容机制。下面我们将深入剖析ArrayList扩容机制的…

The specified Gradle distribution ‘gradle-bin.zip‘ does not exist.

The specified Gradle distribution ‘https://services.gradle.org/distributions/gradle-bin.zip’ does not exist. distributionUrl不存在&#xff0c;关联不上&#xff0c;下载不了&#xff0c;那就匹配一个能下载的 distributionUrlhttps://services.gradle.org/distrib…

从零开始实现一个双向循环链表:C语言实战

文章目录 1链表的再次介绍2为什么选择双向循环链表&#xff1f;3代码实现&#xff1a;从初始化到销毁1. 定义链表节点2. 初始化链表3. 插入和删除节点4. 链表的其他操作5. 打印链表和判断链表是否为空6. 销毁链表 4测试代码5链表种类介绍6链表与顺序表的区别7存储金字塔L0: 寄存…

Cesium点集中获取点的id,使用viewer.value.entities.getById报错的解决方法

错误代码&#xff1a; viewer.value.entities.getById(pickedObject.id) 报错&#xff1a; 可以正常获取movement.position但是一直出现如下报错&#xff0c;无法获得航点的id&#xff0c;通过断点定位为 viewer.value.entities.getById(pickedObject.id)导致的报错 解决方…

ARM Linux Qt使用JSON-RPC实现前后台分离

文章目录 1、前言2、解决方案2.1、JSON-RPC2.2、Qt中应用JSON-RPC的框架图2.3、优点2.4、JSON-RPC 1.0 协议规范 3、程序示例3.1、Linux C&#xff08;只例举RPC Server相关程序&#xff09;3.2、Qt程序&#xff08;只例举RPC Client相关程序&#xff09; 4、编译程序4.1、交叉…

教程 | i.MX RT1180 ECAT_digital_io DEMO 搭建(一)

本文介绍 i.MX RT1180 EtherCAT digital io DEMO 搭建&#xff0c;Master 使用 TwinCAT &#xff0c;由于步骤较多&#xff0c;分为上下两篇&#xff0c;本文为第一篇&#xff0c;主要介绍使用 TwinCAT 控制前的一些准备。 原厂 SDK 提供了 evkmimxrt1180_ecat_examples_digit…

ubuntu22.40安装及配置静态ip解决重启后配置失效

遇到这种错误&#xff0c;断网安装即可&#xff01; 在Ubuntu中配置静态IP地址的步骤如下。根据你使用的Ubuntu版本&#xff08;如 Netplan 或传统的 ifupdown&#xff09;&#xff0c;配置方法有所不同。以下是基于 Netplan 的配置方法&#xff08;适用于Ubuntu 17.10及更高版…

【产品经理学习案例——AI翻译棒出海业务】

前言&#xff1a; 本文主要讲述了硬件产品在出海过程中&#xff0c;翻译质量、翻译速度和本地化落地策略是硬件产品规划需要考虑的核心因素。针对不同国家&#xff0c;需要优化翻译质量和算法&#xff0c;关注市场需求和文化差异&#xff0c;以便更好地满足当地用户的需求。同…

CH340G上传程序到ESP8266-01(S)模块

文章目录 概要ESP8266模块外形尺寸模块原理图模块引脚功能 CH340G模块外形及其引脚模块引脚功能USB TO TTL引脚 程序上传接线Arduino IDE 安装ESP8266开发板Arduino IDE 开发板上传失败上传成功 正常工作 概要 使用USB TO TTL&#xff08;CH340G&#xff09;将Arduino将程序上传…