基于STM32的学习环境控制系统设计

🤞🤞大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是学习环境控制

设备的详细功能见网盘中的文章《21、基于STM32的学习环境控制系统设计》:

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

提取码:5132

 目录

1、系统功能

2、演示视频和实物

3、系统设计框图

4、软件设计流程图

5、原理图

6、主程序

7、总结


1、系统功能

本次的项目是智能学习环境自动调节系统。
1、元器件采用了STM32F103C8T6作为主控,
2、光敏电阻用来检测环境的光照强度,声音传感器模块用来检测环境的噪声。
3、LED灯用来模拟台灯,通过PWM控制实现亮度的调节。
4、超声波传感器用来检测坐姿。
5、语音识别模块用来识别用户的指令,实现语音控制。
6、hc-05蓝牙模块实现在家远程控制。
7、按键模块实现模式控制和亮度调节。
8、蜂鸣器报警模块,当环境噪声大于设定阈值蜂鸣器报警。
9、OLED液晶显示屏用来显示传感器数据。
控制模式有:手动控制,语音控制,蓝牙控制,自动控制。

2、演示视频和实物

基于STM32的智能学习环境设计(版本1)

3、系统设计框图

4、软件设计流程图

5、原理图

6、主程序

#include "sys.h"    //有定制和购买的,可以联系VX:lwfw123456789
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
/***********************************************************************************************
同学好!我们是5132单片机设计,定制单片机设计,实物和说明书均可定制,欢迎大家咨询。VX:lwfw123456789
其他项目演示视频和说明请大家移步哔哩哔哩、CSDN和公众号等。
哔哩哔哩:5132单片机设计
CSDN:    5132单片机设计
公众号:  5132单片机设计
抖音  :  5132单片机设计
小红书:  5132单片机设计
咸鱼:    5132单片机设计
************************************************************************************************/
u8 hour_h, min_m, sec_s, msec_ms; //秒表---时、分、秒、毫秒
u8 state, state2, state2_1, state3, state4;       //按键状态标志
u8 t = 0;                                     //传感器读取时间间隔
u8 flag;                               //远程控制标志
u8 flag2 = 0, flag1, flag3;
uint16_t RTC_Time[] = {0, 0, 0};
uint16_t RTC_Time1[] = {7, 0, 0};    //定时时间---开
uint16_t RTC_Time2[] = {19, 0, 0};   //定时时间---关
u8 T_state, T_state1, qingping = 1, state_dingshi_yu_guan, state_dingshi_yu_kai, state_dingshi_yu_switch, state3_1;
uint32_t GuangYu1 = 10,GuangYu2 = 30,GuangYu3 = 50,GuangYu4 = 70;  
extern void TimeSet(void);
extern void TimeRead(void);
extern void DingShiMoShi(void);
extern void YuYin(void);
extern void ChuangGan(void);
extern void msec_time(void);
extern void msec_Calcu(void);void MY_Gizwits_Init(void)              //机智云初始化函数
{TIM3_Int_Init(9, 7199); //1MS系统定时usart3_init(9600);//WIFI初始化memset((uint8_t *)&currentDataPoint, 0, sizeof(dataPoint_t)); //设备状态结构体初始化gizwitsInit();//环形缓冲区初始化gizwitsSetMode(2);   //设置模式userInit();
}void shoudong()
{TimeRead();if (KeyNum == 2)        //按键PB0控制窗户开关{delay_ms(20);if (KeyNum == 2){state2++;if (state2 > 5){state2 = 0;}}}switch (state2){case 0:PWM_SetCompare1(0);break;case 1:PWM_SetCompare1(10);break;case 2:PWM_SetCompare1(30);break;case 3:PWM_SetCompare1(50);break;case 4:PWM_SetCompare1(70);break;default:break;}
}
void zhidong()
{switch (state4){case 1:PWM_SetCompare1(0);break;case 2:PWM_SetCompare1(33);break;case 3:PWM_SetCompare1(66);break;case 4:break;      default:break;}  
}int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(9600);       //串口初始化为9600delay_init();      //延时函数初始化Buzzer_Init();             //下面为外设初始化OLED_Init();Key_Init();AD_Init();MyRTC_Init();PWM_Init();MY_Gizwits_Init();   //机智云初始化Serial2_Init();   //串口2初始化(语音识别模块)TIM4_Int_Init(99, 7199);while (1){userHandle();    //数据上传gizwitsHandle((dataPoint_t *)&currentDataPoint);   //后台处理,必须放在while里if (t % 10 == 0){AD0 = AD_GetValue(ADC_Channel_1);    //光照传感器     PA0if (AD0 > 4000)AD0 = 4000;bufe[0] = (u8)(100 - (AD0 / 40));if(bufe[0]<GuangYu1)  state4=4;	else if(bufe[0]<GuangYu2)  state4=3;else if(bufe[0]<GuangYu3)  state4=2;	else if(bufe[0]<GuangYu4)  state4=1;}t++;KeyNum = Key_GetNum();if (KeyNum == 1){qingping = 0;state2 = 0,delay_ms(20);if (KeyNum == 1){state++;if (state > 3){state = 0;}}}if (state == 0)                                //远程模式{if (qingping == 0){OLED_Clear();qingping = 1;}TimeRead();ChuangGan();OLED_ShowChinese(1, 7, 49);OLED_ShowChinese(1, 8, 50);}if (state == 2)                           //自动模式{OLED_ShowChinese(1, 7, 51);OLED_ShowChinese(1, 8, 52);TimeRead();zhidong();ChuangGan();msec_time();}if (state == 1)                           //手动模式{OLED_ShowChinese(1, 7, 18);OLED_ShowChinese(1, 8, 52);ChuangGan();shoudong();}if (state == 3)                           //语音模式{if (qingping == 0){OLED_Clear();qingping = 1;}OLED_ShowChinese(1, 7, 57);OLED_ShowChinese(1, 8, 58);TimeRead();ChuangGan();YuYin();}}
}void TimeSet()           //设置时间
{if (KeyNum == 2)    //PB10{delay_ms(20);if (KeyNum == 2){T_state++;if (T_state > 2){T_state = 0;}}}if (T_state == 0)    //时间显示模式{MyRTC_ReadTime();OLED_ShowNum(1, 5, MyRTC_Time[3], 2);    //时OLED_ShowString(1, 7, ":");OLED_ShowNum(1, 8, MyRTC_Time[4], 2);    //分OLED_ShowString(1, 10, ":");OLED_ShowNum(1, 11, MyRTC_Time[5], 2);   //秒RTC_Time[0] = MyRTC_Time[3];RTC_Time[1] = MyRTC_Time[4];RTC_Time[2] = MyRTC_Time[5];}if (T_state == 1)    //修改时间{if (KeyNum == 5){delay_ms(20);if (KeyNum == 5){T_state1++;if (T_state1 > 2){T_state1 = 0;}}}if (T_state1 == 0)  //修改时{if (KeyNum == 4)RTC_Time[0]++;if (KeyNum == 3)RTC_Time[0]--;if (RTC_Time[0] > 23 & RTC_Time[0] < 100)RTC_Time[0] = 0;if (RTC_Time[0] > 100)RTC_Time[0] = 23;OLED_ShowNum(1, 5, RTC_Time[0], 2);  //时}if (T_state1 == 1)  //修改分{if (KeyNum == 4)RTC_Time[1]++;if (KeyNum == 3)RTC_Time[1]--;if (RTC_Time[1] > 59 & RTC_Time[1] < 100)RTC_Time[1] = 0;if (RTC_Time[1] > 100)RTC_Time[1] = 59;OLED_ShowNum(1, 8, RTC_Time[1], 2);  //时}if (T_state1 == 2)  //修改秒{if (KeyNum == 4)RTC_Time[2]++;if (KeyNum == 3)RTC_Time[2]--;if (RTC_Time[2] > 59)RTC_Time[2] = 0;if (RTC_Time[2] > 59 & RTC_Time[2] < 100)RTC_Time[2] = 0;if (RTC_Time[2] > 100)RTC_Time[2] = 59;OLED_ShowNum(1, 11, RTC_Time[2], 2);  //时}}if (T_state == 2){MyRTC_Time[3] = RTC_Time[0];MyRTC_Time[4] = RTC_Time[1];MyRTC_Time[5] = RTC_Time[2];MyRTC_SetTime();T_state = 0;}
}void TimeRead()
{MyRTC_ReadTime();OLED_ShowNum(1, 5, MyRTC_Time[3], 2);    //时OLED_ShowString(1, 7, ":");OLED_ShowNum(1, 8, MyRTC_Time[4], 2);    //分OLED_ShowString(1, 10, ":");OLED_ShowNum(1, 11, MyRTC_Time[5], 2);   //秒
}void DingShiMoShi()
{TimeRead();//...............................定时模式..................................../if ((MyRTC_Time[3] == RTC_Time1[0]) && (MyRTC_Time[4] == RTC_Time1[1]) && (MyRTC_Time[5] == RTC_Time1[2])){//外设操作}if ((MyRTC_Time[3] == RTC_Time2[0]) && (MyRTC_Time[4] == RTC_Time2[1]) && (MyRTC_Time[5] == RTC_Time2[2])){//外设操作}//...............................修改定时时间..................................../OLED_ShowChinese(3, 1, 31);OLED_ShowString(3, 3, ":");OLED_ShowNum(3, 5, RTC_Time1[0], 2);OLED_ShowString(3, 7, ":");OLED_ShowNum(3, 8, RTC_Time1[1], 2);OLED_ShowString(3, 10, ":");OLED_ShowNum(3, 11, RTC_Time1[2], 2);OLED_ShowChinese(4, 1, 32);OLED_ShowString(4, 3, ":");OLED_ShowNum(4, 5, RTC_Time2[0], 2);OLED_ShowString(4, 7, ":");OLED_ShowNum(4, 8, RTC_Time2[1], 2);OLED_ShowString(4, 10, ":");OLED_ShowNum(4, 11, RTC_Time2[2], 2);if (KeyNum == 5){delay_ms(20);if (KeyNum == 5){state_dingshi_yu_switch++;if (state_dingshi_yu_switch > 2){state_dingshi_yu_switch = 0;}}}if (state_dingshi_yu_switch == 1)    //设置阈值开的时间{if (KeyNum == 2){delay_ms(20);if (KeyNum == 2){state_dingshi_yu_kai++;if (state_dingshi_yu_kai > 2){state_dingshi_yu_kai = 0;}}}if (state_dingshi_yu_kai == 0)    //时{if (KeyNum == 3) RTC_Time2[0]++;if (KeyNum == 4) RTC_Time2[0]--;}if (state_dingshi_yu_kai == 1)//分{if (KeyNum == 3) RTC_Time2[1]++;if (KeyNum == 4) RTC_Time2[1]--;}if (state_dingshi_yu_kai == 2)//秒{if (KeyNum == 3) RTC_Time2[2]++;if (KeyNum == 4) RTC_Time2[2]--;}}else{if (KeyNum == 2){delay_ms(20);if (KeyNum == 2){state_dingshi_yu_guan++;if (state_dingshi_yu_guan > 2){state_dingshi_yu_guan = 0;}}}if (state_dingshi_yu_guan == 0)    //时{if (KeyNum == 3) RTC_Time1[0]++;if (KeyNum == 4) RTC_Time1[0]--;}if (state_dingshi_yu_guan == 1)//分{if (KeyNum == 3) RTC_Time1[1]++;if (KeyNum == 4) RTC_Time1[1]--;}if (state_dingshi_yu_guan == 2)//秒{if (KeyNum == 3) RTC_Time1[2]++;if (KeyNum == 4) RTC_Time1[2]--;}}if (state3_1 == 0)    //时{if (KeyNum == 5) RTC_Time1[0]++;if (KeyNum == 6) RTC_Time1[0]--;}if (state3_1 == 1)//分{if (KeyNum == 5) RTC_Time1[1]++;if (KeyNum == 6) RTC_Time1[1]--;}if (state3_1 == 2)//秒{if (KeyNum == 5) RTC_Time1[2]++;if (KeyNum == 6) RTC_Time1[2]--;}
}void YuYin()
{if (Serial2_RxFlag == 1)        //串口接收到数据包的标志位,若是收到数据包,会置1{if (strcmp(Serial2_RxPacket, "LED_ON") == 0){PWM_SetCompare1(66);;}else if (strcmp(Serial2_RxPacket, "LED_OFF") == 0){PWM_SetCompare1(0);;}Serial2_RxFlag = 0; //将标志位清零,不清零就接收不到下一个数据包了}
}void ChuangGan()
{char time_ms[8] = {0};  //时间缓冲区sprintf(time_ms, "%02d:%02d:%02d:%02d", hour_h, min_m, sec_s, msec_ms);OLED_ShowString(4, 3, time_ms); //oled显示时间delay_ms(10);OLED_ShowChinese(2, 1, 53);OLED_ShowChinese(2, 2, 54);OLED_ShowString(2, 5, ":");OLED_ShowNum(2, 6, bufe[0], 2);OLED_ShowString(2, 8, "%");OLED_ShowString(3, 1, "LED_DU:");OLED_ShowNum(3, 8, state2, 1);
}void msec_time(void)
{switch (KeyNum){case 2:TIM_ITConfig(TIM4, TIM_IT_Update, DISABLE); //关闭更新中断TIM_Cmd(TIM4, DISABLE); //关闭时钟break;case 3:TIM_ITConfig(TIM4, TIM_IT_Update, DISABLE); //关闭更新中断TIM_Cmd(TIM4, DISABLE); //关闭时钟hour_h = 0;min_m = 0;sec_s = 0;msec_ms = 0;break;case 4:TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); //使能时钟,允许更新中断TIM_Cmd(TIM4, ENABLE); //使能时钟break;default:break;}
}void msec_Calcu(void)
{msec_ms++;if (msec_ms == 100){msec_ms = 0;sec_s++;if (sec_s == 60){sec_s = 0;min_m++;if (min_m == 60){min_m = 0;hour_h++;if (hour_h == 60){OLED_Clear(); //OLED清屏OLED_ShowString(2, 2, "overflow");}}}}
}

7、总结

该系统以主控芯片为核心,集环境监测、模式控制与外设驱动于一体。通过光照等传感器采集数据,支持远程、手动、自动、语音四种模式。可切换模式控制 LED 亮度,具备秒表功能,利用 WIFI 与机智云交互,语音模块可实现语音控制。

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

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

相关文章

基于Django以及vue的电子商城系统设计与实现

基于Django以及vue的电子商城系统设计与实现 引言 随着电子商务的快速发展&#xff0c;越来越多的企业和个人选择搭建线上商城&#xff0c;以提供更加便捷的购物体验。本文基于Python开发了一套电子商城系统&#xff0c;后端采用Django框架&#xff0c;前端使用Vue.js&#x…

用语言模型探索语音风格空间:无需情感标签的情 感TTS

用语言模型探索语音风格空间&#xff1a;无需情感标签的情感TTS 原文&#xff1a;Exploring speech style spaces with language models: Emotional TTS without emotion labels 今天我们要说的是 一种无需情感标签的情感TTS。提出了一个基于FastSpeech2的E-TTS框架&#xff0…

Linux网络编程--Udp套接字+实战 (万字详解,超详细!!)

目录 套接字协议&#xff1a; 协议(protocol)&#xff1a; 创建套接字(Create Socket): 绑定服务器地址 开始通信 Udp服务器设计--V1 Udp服务器设计--V2 引入进程池 待更新 套接字协议&#xff1a; 协议(protocol)&#xff1a; 如果2个距离很远的人想要进行交流&#xff…

C# 两种方案实现调用 DeepSeek API

目录 序 开发运行环境 访问API的一个通用方法 原生官网实现 申请 API key 调用实现 调用示例 腾讯云知识引擎原子调用 申请 API key 调用示例 小结 序 DeepSeek&#xff08;深度求索&#xff09; 最近可谓火爆的一塌糊涂&#xff0c;具体的介绍这里不再赘述&#x…

中间件-安装Minio-集成使用(ubantu-docker)

目录 1、安装docer 2、运行以下命令拉取MinIO的Docker镜像 3、检查当前所有Docker下载的镜像 4、创建目录 5、创建Minio容器并运行 6、SDK操作 FileUploader.java 1、安装docer 参考这篇&#xff1a;Linux安装Docker 2、运行以下命令拉取MinIO的Docker镜像 docker pull…

LabVIEW用户界面设计原则

在LabVIEW开发中&#xff0c;用户界面&#xff08;UI&#xff09;设计不仅仅是为了美观&#xff0c;它直接关系到用户的操作效率和体验。一个直观、简洁、易于使用的界面能够大大提升软件的可用性&#xff0c;尤其是在复杂的实验或工业应用中。设计良好的UI能够减少操作错误&am…

使用 Docker 安装 Open WebUI 并集成 Ollama 的 DeepSeek 模型

文章目录 使用 Docker 安装 Open WebUI 并集成 Ollama 的 DeepSeek 模型前提条件1. 安装ollama2. 拉取deepseek的模型3. Open-WebUI 说明4. 启动容器文档的方法如下优化命令&#xff08;可选&#xff09;1. 增加了健康检查机制&#xff08;--health-cmd&#xff09;2. 使 WebUI…

19.4.9 数据库方式操作Excel

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 本节所说的操作Excel操作是讲如何把Excel作为数据库来操作。 通过COM来操作Excel操作&#xff0c;请参看第21.2节 在第19.3.4节【…

算法15(力扣347)——前k个高频元素

1、问题 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 2、示例 &#xff08;1&#xff09; 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2] &#xff08;2&#xff09; 输入: nums [1], k 1 输出: [1…

防御保护-----前言

HCIE安全防御 前言 计算机病毒 ​ 蠕虫病毒----->具备蠕虫特性的病毒&#xff1a;1&#xff0c;繁殖性特别强&#xff08;自我繁殖&#xff09;&#xff1b;2&#xff0c;具备破坏性 蠕虫病毒是一种常见的计算机病毒&#xff0c;其名称来源于它的传播方式类似于自然界中…

IntelliJ IDEA 2024.1.4版无Tomcat配置

IntelliJ IDEA 2024.1.4 (Ultimate Edition) 安装完成后&#xff0c;调试项目发现找不到Tomcat服务&#xff1a; 按照常规操作添加&#xff0c;发现服务插件中没有Tomcat。。。 解决方法 1、找到IDE设置窗口 2、点击Plugins按钮&#xff0c;进入插件窗口&#xff0c;搜索T…

docker compose部署flink集群

本次部署2个jobmanager和3个taskmanager 一、部署zookeeper集群 flink使用zookeeper用作高可用 部署集群参考&#xff1a;docker compose部署zookeeper集群-CSDN博客 二、创建目录及配置文件 创建timezone文件&#xff0c;内容填写Asia/Shanghai 手动创建目录&#xff1a…

XSS 常用标签及绕过姿势总结

XSS 常用标签及绕过姿势总结 一、xss 常见标签语句 0x01. 标签 <a href"javascript:alert(1)">test</a> <a href"x" onfocus"alert(xss);" autofocus"">xss</a> <a href"x" onclickeval(&quo…

【Django】 templates模板与static静态文件

1.templates模板 在app01(你创建的app名称)文件夹下&#xff0c;创建templates文件夹&#xff0c;其中存放想要返回的html文件 对应关系如下 除了上面的方式&#xff0c;还可以在项目根目录下创建templates文件夹&#xff0c;这时需要在settings.py文件中增加一行代码&#xf…

解锁电商数据宝藏:淘宝商品详情API实战指南

在电商蓬勃发展的今天&#xff0c;数据已成为驱动业务增长的核心引擎。对于商家、开发者以及数据分析师而言&#xff0c;获取精准、实时的商品数据至关重要。而淘宝&#xff0c;作为国内最大的电商平台&#xff0c;其海量商品数据更是蕴含着巨大的价值。 本文将带你深入探索淘…

YOLO11 【二】 【速通 训练+推理+导出】

一、 vscode 配置 conda 环境 选择默认配置修改配置文件 %windir%\System32\cmd.exe “/K” D:\Software\Anaconda3\Scripts\activate.bat D:\Software\Anaconda3 将该命令加到配置文件后面 ** “/K” D:\Software\Anaconda3\Scripts\activate.bat D:\Software\Anaconda3 **…

UWB功耗大数据插桩调研

一、摘要 UWB功耗点 插桩点 日志关键字 电流 蓝牙持锁 BatteryStats的锁统计 vendor_bluetooth_lock 30~40mA 测距 UwbSessionManager.startRanging UwbSessionManager.stoptRanging 或接入fadiKey Uwb状态广播 "com.fadiui.dkservice.action.uwb.state.change&q…

开发完的小程序如何分包

好几次了&#xff0c;终于想起来写个笔记记一下 我最开始并不会给小程序分包&#xff0c;然后我就各种搜&#xff0c;发现讲的基本上都是开发之前的小程序分包&#xff0c;可是我都开发完要发布了&#xff0c;提示我说主包太大需要分包&#xff0c;所以我就不会了。。。 好了…

前端vue项目打包部署

一、打包 可以在vscode中输入命令打包&#xff0c;也可以通过vscode的图形化界面打包 打包完成后&#xff0c;目录中&#xff0c;会生成dist文件。打包后&#xff0c;数据占用空间更小&#xff0c;比如把换行都去掉了。 完成打包 二、部署 前端主流部署服务器是 Ngix &#x…

PyTorch 中 `torch.cuda.amp` 相关警告的解决方法

在最近的写代码过程中&#xff0c;遇到了两个与 PyTorch 的混合精度训练相关的警告信息。这里随手记录一下。 警告内容 警告 1: torch.cuda.amp.autocast FutureWarning: torch.cuda.amp.autocast(args...) is deprecated. Please use torch.amp.autocast(cuda, args...) i…