基于32单片机的智能语音家居
一、主要功能介绍
以STM32F103C8T6单片机为控制核心,设计一款智能远程家电控制系统,该系统能实现如下功能:
1、可通过语音命令控制照明灯、空调、加热器、窗户及窗帘的开关;
2、可通过手机显示和控制照明灯、空调、窗户及窗帘的开关;
3、可利用传感器检测光照强度,并根据光强控制窗帘开关;
4、可利用传感器检测是否下雨并根据是否下雨控制窗户开关;5、根据不同的气候环境显示对应的天气;
6、分自动模式、手动模式、以及app控制,自动模式下实时检测传感器数据并根据设置的阈值做出自动操作,如温度过低、室内加热;手动模式下可以手动查看每个传感器检测的数据和手动打开相关的开关,app模式下,可以通过手机远程查看数据和操控照明灯、空调等开关。
其中:空调、加热器用继电器+LED进行模拟。
二、主要模块讲解
2.1 步进电机模拟窗帘的打开和关闭
步进电机的主要特性:1、 步进电机必须加驱动才可以运转, 驱动信号必须为脉冲信号,没有脉冲的时候,步进电机静止, 如果加入适当的脉冲信号, 就会以一定的角度(称为步角)转动。转动的速度和脉冲的频率成正比。2、 28BYJ48 5V 驱动的 4 相 5 线的步进电机,而且是减速步进电机,减 速比为 1:64,步进角为 5.625/64 度。如果需要转动 1 圈,那 么需要 360/5.625*64=4096 个脉冲信号。3、 步进电机具有瞬间启动和急速停止的优越特性。4、 改变脉冲的顺序, 可以方便的改变转动的方向。28BYJ48 、步进电机、单片机三者之间连接原理图
代码演示
.c文件
#include "BUJ.h" u8 dir;//电机转动方向 u8 dis;//电机转动距离 void TIM2_Int_Init(u16 arr,u16 psc) {TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500msTIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM2中断,允许更新中断NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器TIM_Cmd(TIM2, ENABLE); //使能TIMx外设 }//定时器1MS //TIM2_Int_Init(19,7199);//2MS系统定时//步进电机IO初始化 void BUJ_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开AFIO时钟GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//完全关闭JTAG-DP 开启SW-DPGPIO_InitStructure.GPIO_Pin = BUJ1_GPIOPin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BUJ1_GPIOX, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = BUJ2_GPIOPin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BUJ2_GPIOX, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = BUJ3_GPIOPin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BUJ3_GPIOX, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = BUJ4_GPIOPin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BUJ4_GPIOX, &GPIO_InitStructure); TIM2_Int_Init(19,7199);//2MS系统定时 }/*********************** 函数名:Stepmotor_BeatSwitch 函数功能:节拍切换函数 形参:u8 dir 电机转向 LEFT RIGHT 返回值:void 函数说明: ************************/void Stepmotor_BeatSwitch(u8 dir) {static u8 cnt=0;if(dir == LEFT){switch(++cnt){case 1:BEAT1;break;case 2:BEAT2;break;case 3:BEAT3;break;case 4:BEAT4;break; }}if(dir == RIGHT){switch(++cnt){case 1:BEAT4;break;case 2:BEAT3;break;case 3:BEAT2;break;case 4:BEAT1;break; }}cnt %=4; }/*********************** 函数名:Stepmotor_Stop 函数功能:步进电机停转 形参:void 返回值:void 函数说明: ************************/void Stepmotor_Stop(void) {BUJ1=0; BUJ2=0; BUJ3=0;BUJ4=0; }/*********************** 函数名:Stepmotor_Control 函数功能:步进电机控制函数 形参:s8 distance 返回值:void 函数说明: 1、distance = 0 电机停转 TIM2关闭 2、distance > 0 电机左转 TIM2开启 3、distance < 0 电机右转 TIM2开启 u8 dir;//电机转动方向 u8 dis;//电机转动距离 ************************/ u8 curtain=0;//窗帘标志位 void Stepmotor_Control(s8 distance) {if(distance == 0){TIM_Cmd(TIM2, DISABLE);//失能定时器Stepmotor_Stop();//停止转动}else if(distance>0){TIM_Cmd(TIM2, ENABLE);//使能定时器dir=LEFT;//左转dis=distance;curtain = 1;}else if(distance<0){TIM_Cmd(TIM2, ENABLE);//使能定时器dir=RIGHT;//右转转dis=-distance;curtain = 0;}}/*中断标志必须清除,否则程序卡死*/ //2ms更新一次 //定时器2中断服务程序 void TIM2_IRQHandler(void) //TIM3中断 {if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 {TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源static u16 num=0;//记录更新次数Stepmotor_BeatSwitch(dir);num++;//计算行程if(num >= dis*32){num=0;TIM_Cmd(TIM2, DISABLE);//失能定时器Stepmotor_Stop();//停止转动}} }
.h文件
#ifndef __BUJ_H #define __BUJ_H #include "includes.h"#define BUJ1_GPIOX GPIOA #define BUJ1_GPIOPin GPIO_Pin_12 //4#define BUJ2_GPIOX GPIOA #define BUJ2_GPIOPin GPIO_Pin_15 //3#define BUJ3_GPIOX GPIOB #define BUJ3_GPIOPin GPIO_Pin_3 //2#define BUJ4_GPIOX GPIOB #define BUJ4_GPIOPin GPIO_Pin_4 //1#define BUJ1 PAout(12) #define BUJ2 PAout(15) #define BUJ3 PBout(3) #define BUJ4 PBout(4)//节拍宏定义 #define BEAT1 {BUJ1=1; BUJ2=0; BUJ3=0;BUJ4=0;} #define BEAT2 {BUJ1=0; BUJ2=1; BUJ3=0;BUJ4=0;} #define BEAT3 {BUJ1=0; BUJ2=0; BUJ3=1;BUJ4=0;} #define BEAT4 {BUJ1=0; BUJ2=0; BUJ3=0;BUJ4=1;}#define LEFT 7 //左转 #define RIGHT 8 //右转extern u8 dir;//电机转动方向 extern u8 curtain; void BUJ_Init(void);//初始化 void TIM2_Int_Init(u16 arr,u16 psc); void Stepmotor_Control(s8 distance);#endif
2.2 光敏电阻、雨滴传感器讲解
2、1 模块特性
1. 光敏电阻模块对环境光线最敏感,一般用来检测周围环境的光线的亮度,触发单片机或继电器模块等;
2. 模块在环境光线亮度达不到设定阈值时,DO 端输出高电平,当外界环境光线亮度超过设定阈值时,DO
端输出低电平;
3. DO 输出端可以与单片机直接相连,通过单片机来检测高低电平,由此来检测环境的光线亮度改变;
4. DO 输出端可以直接驱动继电器模块,由此可以组成一个光控开关。
2.2 接口说明
VCC:外接3.3V-5.0V
GND:接地
DO:开关信号输出(0和1)
AO:模拟电压输出
三、转换公式
通过adc模数转化,获取到采样值,然后通过占比,获取到我们电压值,亦可将3.3换为100,将光照强度转化为百分比。
三、原理图
四、PCB
相关文章:

基于32单片机的智能语音家居
一、主要功能介绍 以STM32F103C8T6单片机为控制核心,设计一款智能远程家电控制系统,该系统能实现如下功能: 1、可通过语音命令控制照明灯、空调、加热器、窗户及窗帘的开关; 2、可通过手机显示和控制照明灯、空调、窗户及窗帘的开…...

VScode怎么重启
原文链接:【vscode】vscode重新启动 键盘按下 Ctrl Shift p 打开命令行,如下图: 输入Reload Window,如下图:...

分析服务器 systemctl 启动gozero项目报错的解决方案
### 分析 systemctl start beisen.service 报错 在 Linux 系统中,systemctl 是管理系统和服务的主要工具。当我们尝试重启某个服务时,如果服务启动失败,systemctl 会输出错误信息,帮助我们诊断和解决问题。 本文将通过一个实际的…...
大模型LLM-Prompt-OPTIMAL
1 OPTIMAL OPTIMAL 具体每项内容解释如下: Objective Clarity(目标清晰):明确定义任务的最终目标和预期成果。 Purpose Definition(目的定义):阐述任务的目的和它的重要性。 Information Gat…...

3. 多线程(1) --- 创建线程,Thread类
文章目录 前言1. API2. 创建线程2.1. 继承 Thread类2.2. 实现 Runnable 接口2.3. 匿名内部类2.4. lambda2.5.其他方法 3. Thread类及其常见的方法和属性3.1. Thread 的常见构造方法3.2. Thread 的常见属性3.3. start() --- 启动一个线程3.4. 中断一个线程3.5. 等待线程3.6. 休眠…...

简单的jmeter数据请求学习
简单的jmeter数据请求学习 1.需求 我们的流程服务由原来的workflow-server调用wfms进行了优化,将wfms服务操作并入了workflow-server中,去除了原来的webservice服务调用形式,增加了并发处理,现在想测试模拟一下,在一…...
智能水文:ChatGPT等大语言模型如何提升水资源分析和模型优化的效率
大语言模型与水文水资源领域的融合具有多种具体应用,以下是一些主要的应用实例: 1、时间序列水文数据自动化处理及机器学习模型: ●自动分析流量或降雨量的异常值 ●参数估计,例如PIII型曲线的参数 ●自动分析降雨频率及重现期 ●…...

民宿酒店预订系统小程序+uniapp全开源+搭建教程
一.介绍 一.系统介绍 基于ThinkPHPuniappuView开发的多门店民宿酒店预订管理系统,快速部署属于自己民宿酒店的预订小程序,包含预订、退房、WIFI连接、吐槽、周边信息等功能。提供全部无加密源代码,支持私有化部署。 二.搭建环境 系统环境…...

计算机网络掩码、最小地址、最大地址计算、IP地址个数
一、必备知识 1.无分类地址IPV4地址网络前缀主机号 2.每个IPV4地址由32位二进制数组成 3. /15这个地址表示网络前缀有15位,那么主机号32-1517位。 4.IP地址的个数:2**n (n表示主机号的位数) 5.可用(可分配)IP地址个数&#x…...

Mac中配置vscode(第一期:python开发)
1、终端中安装 xcode-select --install #mac的终端中安装该开发工具 xcode-select -p #显示当前 Xcode 命令行工具的安装路径注意:xcode-select --install是在 macOS 上安装命令行开发工具(Command Line Tools)的关键命令。安装的主要组件包括:C/C 编…...

软件项目体系建设文档,项目开发实施运维,审计,安全体系建设,验收交付,售前资料(word原件)
软件系统实施标准化流程设计至关重要,因为它能确保开发、测试、部署及维护等各阶段高效有序进行。标准化流程能减少人为错误,提升代码质量和系统稳定性。同时,它促进了团队成员间的沟通与协作,确保项目按时交付。此外,…...

计算机网络--路由表的更新
一、方法 【计算机网络习题-RIP路由表更新-哔哩哔哩】 二、举个例子 例1 例2...
CDN防御如何保护我们的网络安全?
在当今数字化时代,网络安全成为了一个至关重要的议题。随着网络攻击的日益频繁和复杂化,企业和个人都面临着前所未有的安全威胁。内容分发网络(CDN)作为一种分布式网络架构,不仅能够提高网站的访问速度和用户体验&…...

matlab离线安装硬件支持包
MATLAB 硬件支持包离线安装 本文章提供matlab硬件支持包离线安装教程,因为我的matlab安装的某种原因(破解),不支持硬件支持包的安装,相信也有很多相同情况的朋友,所以记录一下我是如何离线安装的ÿ…...
使用virtualenv创建虚拟环境
下载 virtualenv pip install virtualenv 创建虚拟环境 先进入想要的目录 一般为 /envs virtualenv 文件名 --python解释器的版本 激活虚拟环境 .\虚拟项目的文件夹名称\Scripts\activate 退出虚拟环境 deactivate...

Java链表
链表(Linked List)是一种线性数据结构,它由一系列节点组成,每个节点包含两部分:一部分为用于储存数据元素,另部分是一种引用(指针),指向下一个节点。 这种结构允许动态地添加和删除元素,而不需要像数组那种大规模的数…...

Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s
前言:纯个人记录使用。 搭建 Zero to JupyterHub with Kubernetes 上篇 - Kubernetes 离线二进制部署。搭建 Zero to JupyterHub with Kubernetes 中篇 - Kubernetes 常规使用记录。搭建 Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s。 官方文档…...

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域
解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域 Tomcat 配置允许跨域Web 项目配置允许跨域Tomcat 同时允许静态文件和 Web 服务跨域 偶尔遇到一个 Tomcat 部署项目跨域问题,因为已经处理…...
在C语言中使用伪终端与bash交互
了解伪终端概念: 伪终端(PTY)由一对设备组成:主设备(master)和从设备(slave)。数据写入主设备会出现在从设备,反之亦然。这允许一个进程通过主设备与另一个进程ÿ…...

阿里云 人工智能与机器学习
阿里云的 人工智能(AI)与机器学习(ML) 服务为企业提供了全面的AI解决方案,帮助用户在多个行业实现数据智能化,提升决策效率,推动业务创新。阿里云通过先进的技术和丰富的工具,支持用…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...