【Proteus仿真】【STM32单片机】智能语音家居陪护机器人
文章目录
- 一、功能简介
- 二、软件设计
- 三、实验现象
- 联系作者
一、功能简介
本项目使用Proteus8仿真STM32单片机控制器,使用OLED显示模块、红外传感器、蜂鸣器、DS18B20温度传感器,风扇LED、语音识别模块等。
主要功能:
系统运行后,OLED显示动画效果,一段时间后静止。当到达指定时间时开启闹钟,系统需感应到有人后,此时可通过K4键或语音关闭闹铃。系统感应到有人后,OLED显示测量的人体体温、时间、LED和风扇的开关状态;此时可通过语音开关LED和风扇;可通过按键K3进入闹钟设置界面,通过K3键切换不同时间位置,K1和K2键加减调节,设置后按下K4键保存并退出,返回测温和时钟显示界面。
语音识别指令(十六进制数):
开灯–>0X01
关灯–>0X02
开风扇–>0X11
关风扇–>0X12
关闹铃–>0X22
二、软件设计
/*
作者:嗨小易(QQ:3443792007)*///系统数据获取
void sys_data_get(void)
{static u8 i=0;static u8 oneflag=1;while(1){ //人体红外检测if(IRED==0){//温度获取i++;if(i%1==0){TIM_Cmd(TIM2,DISABLE); //关闭定时器sys_ctrl.temp=DS18B20_GetTemperture()*10;TIM_Cmd(TIM2,ENABLE); //打开定时器}sys_ctrl.man=1;}else sys_ctrl.man=0;//界面状态显示if(sys_ctrl.man==0){sys_ctrl.window=0;if(oneflag==0){oneflag=1;sys_open_show();//系统开机界面显示 } }else {sys_ctrl.window=1;if(oneflag==1){oneflag=0;sys_parm_show();//系统数据参数显示界面 } } break;}
}//系统数据显示
void sys_data_show(void)
{u8 buf[9];while(1){ //显示数据界面if(sys_ctrl.window==1){ //正常模式下if(sys_ctrl.mode==0){//温度显示buf[0]=sys_ctrl.temp/100+0x30;buf[1]=sys_ctrl.temp%100/10+0x30;buf[2]='.';buf[3]=sys_ctrl.temp%100%10+0x30;buf[4]='C';buf[5]='\0';OLED_ShowString(3*16,0,buf,16); //时间显示buf[0]=sys_ctrl.hour/10+0x30;buf[1]=sys_ctrl.hour%10+0x30;buf[2]=':';buf[3]=sys_ctrl.min/10+0x30;buf[4]=sys_ctrl.min%10+0x30;buf[5]=':';buf[6]=sys_ctrl.sec/10+0x30;buf[7]=sys_ctrl.sec%10+0x30;buf[8]='\0';OLED_ShowString(3*16,2,buf,16);//灯状态显示if(sys_ctrl.led==1)OLED_ShowString(2*16,4,"ON ",16);else OLED_ShowString(2*16,4,"OFF",16);//风扇状态显示if(sys_ctrl.motor==1)OLED_ShowString(6*16+8*1,4,"ON ",16);else OLED_ShowString(6*16+8*1,4,"OFF",16);}//时间设置模式下else{//吃药时间显示buf[0]=sys_ctrl.stime[0][0]/10+0x30;buf[1]=sys_ctrl.stime[0][0]%10+0x30;buf[2]=':';buf[3]=sys_ctrl.stime[0][1]/10+0x30;buf[4]=sys_ctrl.stime[0][1]%10+0x30;buf[5]=':';buf[6]=sys_ctrl.stime[0][2]/10+0x30;buf[7]=sys_ctrl.stime[0][2]%10+0x30;buf[8]='\0';OLED_ShowString(3*16,0,buf,16);//运动时间显示buf[0]=sys_ctrl.stime[1][0]/10+0x30;buf[1]=sys_ctrl.stime[1][0]%10+0x30;buf[2]=':';buf[3]=sys_ctrl.stime[1][1]/10+0x30;buf[4]=sys_ctrl.stime[1][1]%10+0x30;buf[5]=':';buf[6]=sys_ctrl.stime[1][2]/10+0x30;buf[7]=sys_ctrl.stime[1][2]%10+0x30;buf[8]='\0';OLED_ShowString(3*16,3,buf,16);//休息时间显示buf[0]=sys_ctrl.stime[2][0]/10+0x30;buf[1]=sys_ctrl.stime[2][0]%10+0x30;buf[2]=':';buf[3]=sys_ctrl.stime[2][1]/10+0x30;buf[4]=sys_ctrl.stime[2][1]%10+0x30;buf[5]=':';buf[6]=sys_ctrl.stime[2][2]/10+0x30;buf[7]=sys_ctrl.stime[2][2]%10+0x30;buf[8]='\0';OLED_ShowString(3*16,6,buf,16);switch(sys_ctrl.mode){case 1://吃药-时OLED_ShowString(3*16,0," ",16);delay_ms(50);buf[0]=sys_ctrl.stime[0][0]/10+0x30;buf[1]=sys_ctrl.stime[0][0]%10+0x30;buf[2]='\0';OLED_ShowString(3*16,0,buf,16);break;case 2://吃药-分OLED_ShowString(3*16+3*8,0," ",16);delay_ms(50);buf[0]=sys_ctrl.stime[0][1]/10+0x30;buf[1]=sys_ctrl.stime[0][1]%10+0x30;buf[2]='\0';OLED_ShowString(3*16+3*8,0,buf,16);break;case 3://吃药-秒OLED_ShowString(3*16+6*8,0," ",16);delay_ms(50);buf[0]=sys_ctrl.stime[0][2]/10+0x30;buf[1]=sys_ctrl.stime[0][2]%10+0x30;buf[2]='\0';OLED_ShowString(3*16+6*8,0,buf,16);break;case 4://运动-时OLED_ShowString(3*16,3," ",16);delay_ms(50);buf[0]=sys_ctrl.stime[1][0]/10+0x30;buf[1]=sys_ctrl.stime[1][0]%10+0x30;buf[2]='\0';OLED_ShowString(3*16,3,buf,16);break;case 5://运动-分OLED_ShowString(3*16+3*8,3," ",16);delay_ms(50);buf[0]=sys_ctrl.stime[1][1]/10+0x30;buf[1]=sys_ctrl.stime[1][1]%10+0x30;buf[2]='\0';OLED_ShowString(3*16+3*8,3,buf,16);break;case 6://运动-秒OLED_ShowString(3*16+6*8,3," ",16);delay_ms(50);buf[0]=sys_ctrl.stime[1][2]/10+0x30;buf[1]=sys_ctrl.stime[1][2]%10+0x30;buf[2]='\0';OLED_ShowString(3*16+6*8,3,buf,16);break;case 7://休息-时OLED_ShowString(3*16,6," ",16);delay_ms(50);buf[0]=sys_ctrl.stime[2][0]/10+0x30;buf[1]=sys_ctrl.stime[2][0]%10+0x30;buf[2]='\0';OLED_ShowString(3*16,6,buf,16);break;case 8://休息-分OLED_ShowString(3*16+3*8,6," ",16);delay_ms(50);buf[0]=sys_ctrl.stime[2][1]/10+0x30;buf[1]=sys_ctrl.stime[2][1]%10+0x30;buf[2]='\0';OLED_ShowString(3*16+3*8,6,buf,16);break;case 9://休息-秒OLED_ShowString(3*16+6*8,6," ",16);delay_ms(50);buf[0]=sys_ctrl.stime[2][2]/10+0x30;buf[1]=sys_ctrl.stime[2][2]%10+0x30;buf[2]='\0';OLED_ShowString(3*16+6*8,6,buf,16);break;}} }break; }
}//系统数据设置
void sys_data_set(void)
{u8 key=0;static u8 oneflag=0;//有人的时候if(sys_ctrl.window==1){key=KEY_Scan(1);//语音识别if(USART1_RX_BUF[0]==LED_ON_CMD)//开灯{USART1_RX_BUF[0]=0;LED=0;sys_ctrl.led=1; }else if(USART1_RX_BUF[0]==LED_OFF_CMD)//关灯{USART1_RX_BUF[0]=0;LED=1;sys_ctrl.led=0; }else if(USART1_RX_BUF[0]==MOTOR_ON_CMD)//开风扇{USART1_RX_BUF[0]=0;MOTOR=0;sys_ctrl.motor=1; }else if(USART1_RX_BUF[0]==MOTOR_OFF_CMD)//关风扇{USART1_RX_BUF[0]=0;MOTOR=1;sys_ctrl.motor=0;}else if(USART1_RX_BUF[0]==ALARM_OFF_CMD)//关闹铃{USART1_RX_BUF[0]=0;sys_ctrl.alarm=0;OLED_ShowString(0,6," ",16);} } //模式设置if(key==KEY3_PRESS){sys_ctrl.mode++;if(sys_ctrl.mode>9)sys_ctrl.mode=1; if(oneflag==0)//时间设置界面仅显示1次{oneflag=1;sys_time_set_show();//系统时间设置界面显示 }}//在设置模式下,加else if(key==KEY1_PRESS){switch(sys_ctrl.mode){case 1://吃药-时sys_ctrl.stime[0][0]++;if(sys_ctrl.stime[0][0]>23)sys_ctrl.stime[0][0]=0; break;case 2://吃药-分sys_ctrl.stime[0][1]++;if(sys_ctrl.stime[0][1]>59)sys_ctrl.stime[0][1]=0; break;case 3://吃药-秒sys_ctrl.stime[0][2]++;if(sys_ctrl.stime[0][2]>59)sys_ctrl.stime[0][2]=0; break;case 4://运动-时sys_ctrl.stime[1][0]++;if(sys_ctrl.stime[1][0]>24)sys_ctrl.stime[1][0]=0; break;case 5://运动-分sys_ctrl.stime[1][1]++;if(sys_ctrl.stime[1][1]>59)sys_ctrl.stime[1][1]=0; break;case 6://运动-秒sys_ctrl.stime[1][2]++;if(sys_ctrl.stime[1][2]>59)sys_ctrl.stime[1][2]=0; break;case 7://休息-时sys_ctrl.stime[2][0]++;if(sys_ctrl.stime[2][0]>24)sys_ctrl.stime[2][0]=0; break;case 8://休息-分sys_ctrl.stime[2][1]++;if(sys_ctrl.stime[2][1]>59)sys_ctrl.stime[2][1]=0; break;case 9://休息-秒sys_ctrl.stime[2][2]++;if(sys_ctrl.stime[2][2]>59)sys_ctrl.stime[2][2]=0; break; } }//在设置模式下,减else if(key==KEY2_PRESS){switch(sys_ctrl.mode){case 1://吃药-时sys_ctrl.stime[0][0]--;if(sys_ctrl.stime[0][0]<0)sys_ctrl.stime[0][0]=23; break;case 2://吃药-分sys_ctrl.stime[0][1]--;if(sys_ctrl.stime[0][1]<0)sys_ctrl.stime[0][1]=59; break;case 3://吃药-秒sys_ctrl.stime[0][2]--;if(sys_ctrl.stime[0][2]<0)sys_ctrl.stime[0][2]=59; break;case 4://运动-时sys_ctrl.stime[1][0]--;if(sys_ctrl.stime[1][0]<0)sys_ctrl.stime[1][0]=23; break;case 5://运动-分sys_ctrl.stime[1][1]--;if(sys_ctrl.stime[1][1]<0)sys_ctrl.stime[1][1]=59; break;case 6://运动-秒sys_ctrl.stime[1][2]--;if(sys_ctrl.stime[1][2]<0)sys_ctrl.stime[1][2]=59; break;case 7://休息-时sys_ctrl.stime[2][0]--;if(sys_ctrl.stime[2][0]<0)sys_ctrl.stime[2][0]=23; break;case 8://休息-分sys_ctrl.stime[2][1]--;if(sys_ctrl.stime[2][1]<0)sys_ctrl.stime[2][1]=59; break;case 9://休息-秒sys_ctrl.stime[2][2]--;if(sys_ctrl.stime[2][2]<0)sys_ctrl.stime[2][2]=59; break; } }//确定else if(key==KEY4_PRESS){ if(oneflag==1){sys_ctrl.mode=0;oneflag=0;sys_parm_show();//系统数据参数显示界面 }//闹铃if(sys_ctrl.alarm==1){sys_ctrl.alarm=0;OLED_ShowString(0,6," ",16); } }
}//应用控制系统
void appdemo_show(void)
{u8 i=10;KEY_Init();ctrl_pin_init();BEEP_Init();DS18B20_Init();//等待温度数据稳定while(i--){sys_ctrl.temp=DS18B20_GetTemperture()*10;delay_ms(100); }OLED_Init();USART1_Init(9600);printf("USART1_Init OK\r\n");TIM2_Init(400-1,70);//定时10mssys_parm_init();//系统参数初始化sys_open_show();//系统初始界面显示TIM_Cmd(TIM2,ENABLE); //打开定时器while(1){sys_data_get();//系统数据获取sys_data_show();//系统数据显示sys_data_set();//系统数据设置sys_fun_ctrl();//系统功能控制 }
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619





联系作者
视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。
相关文章:
【Proteus仿真】【STM32单片机】智能语音家居陪护机器人
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用OLED显示模块、红外传感器、蜂鸣器、DS18B20温度传感器,风扇LED、语音识别模块等。 主要功能: 系统运行后,…...
C#上位机序列10: 批量读写+点对点更新+数据类型处理
一、源码结构 二、运行效果 三、源码解析 PLC批量读写点对点更新数据类型处理 优点:根据数据类型,判定监听的地址范围(40120_int 监听两个word:40120 40121;40130_long 监听四个word:40130 40131 40132 4…...
MySQL 概述 数据库表操作 数据增删改
目录 MySQL概述前言安装与配置MySQL登录与卸载 数据模型概述SQL简介SQL通用语法简介SQL分类 数据库设计(数据库操作)-DDL数据库操作查询数据库 show databases、select database()创建数据库 create database使用数据库 use删除数据库 drop database 图形化工具连接数据库操作数…...
存储器概述
一、存储系统基本概念...
Fabric.js 使用自定义字体
本文简介 点赞 关注 收藏 学会了 如果你使用 Fabric.js 做编辑类的产品,有可能需要给用户配置字体。 这次就讲讲在 Fabric.js 中创建文本时怎么使用自定义字体、在项目运行时怎么修改字体、以及推荐一个精简字体库的工具。 学习本文前,你必须有一点…...
【C++项目】高并发内存池第七讲性能分析
目录 1.测试代码2.代码介绍3.运行结结果 1.测试代码 #include"ConcurrentAlloc.h" #include"ObjectPool.h" #include"Common.h" void BenchmarkMalloc(size_t ntimes, size_t nworks, size_t rounds) {std::vector<std::thread> vthread(…...
【JavaScript】快速学习JS
JS区分大小写,后面的分号可有可无; 输出语句 window.alter() // 写入警告框;在浏览器中的警告弹窗输出 document.write() // 写入html输出;在html页面中输出 console.log() // 写入浏览器控制台;在控制台输出 变量…...
控制输入流,从控制台打印到文件中,更改输出的位置
public static void main(String[] args) throws IOException {PrintStream printStream System.out;//在默认情况下,PrintStream 输出数据的位置 标准输出,即显示器printStream.print("Tom,hello");/*public void print(String s) {if (s n…...
计算线阵相机 到 拍摄产品之间 摆放距离?(隐含条件:保证图像不变形)
一物体被放置在传送带上,转轴的直径为100mm。已知线阵相机4K7u(一行共4096个像素单元,像素单元大小7um),镜头35mm,编码器2000脉冲/圈。保证图像不变形的条件下,计算相机到产品之间 摆放距离&…...
【网络】详解http协议
目录 一、认识URLurlencode和urldecode 二、HTTP协议HTTP协议格式HTTP的方法HTTP的状态码HTTP常见Header 一、认识URL URL叫做统一资源定位符,也就是我们平时俗称的网址,是因特网的万维网服务程序上用于指定信息位置的表示方法。 urlencode和urldecode …...
1819_ChibiOS的互斥信号与条件变量
全部学习汇总: GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 1. 关于会吃信号与条件变量的全局配置提供了4个配置信息,分别是互斥信号的使能、互斥信号的递归支持、条件变量的使能、条件变量的超时使…...
CSDN学院 < 华为战略方法论进阶课 > 正式上线!
目录 你将收获 适用人群 课程内容 内容目录 CSDN学院 作者简介 你将收获 提升职场技能提升战略规划的能力实现多元化发展综合能力进阶 适用人群 主要适合公司中高层、创业者、产品经理、咨询顾问,以及致力于改变现状的学员。 课程内容 本期课程主要介绍华为…...
电商接口api数据比价接口推荐
当前,受诸多因素的影响,经济下行,在日趋激烈的市场竞争中,很多企业也都面临着越来越大的生存压力,企业的盈利空间也逐渐被压缩。因此,越来越多的企业在控制成本方面更下功夫,这也就对企业采购提…...
读取Excel的工具类——ExcelKit
文章目录 ExcelKit工具类1、准备工作1.1、SheetInfoVo1.2、BizException 2、读取xlsx3、读取xls4、完整的ExcelKit.java源码 ExcelKit工具类 1、准备工作 1.1、SheetInfoVo import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import …...
vscode连接服务器一直retry
解决方法 打开vscode控制面板,输入命令remote-ssh: kill vs code server on host 选择一直连接不上的服务器端口 重新连接...
Spring Cloud Sentinel整合Nacos实现配置持久化
sentinel配置相关配置后无法持久化,服务重启之后就没了,所以整合nacos,在nacos服务持久化,sentinel实时与nacos通信获取相关配置。 使用上一章节Feign消费者服务实现整合。 版本信息: nacos:1.4.1 Sentinel 控制台 …...
STM32F4VGT6-DISCOVERY:uart1驱动
对于这款板子,官方并没有提供串口例程,只能自行添加。 一、PA9/PA10复用成串口1功能不可用 驱动测试代码如下: main.c: #include "main.h" #include <stdio.h>void usart1_init(void) {GPIO_InitTypeDef GPIO_InitStruct…...
C语言之 结构体,枚举,联合
目录 1.结构体 1.1结构的基础知识 1.2结构的声明 1.3 特殊的声明 1.4 结构的自引用 1.5 结构体变量的定义和初始化 1.6 结构体内存对齐 1.7 修改默认对齐数 1.8 结构体传参 2. 位段 2.1 什么是位段 2.2位段的内存分配 2.3 位段的跨平台问题 3. 枚举 3.1 枚举类型…...
红米电脑硬盘剪切
Redmi R14 2023版固态硬盘剪切 工具准备操作结尾语 首先要说明,本文所说的操作不一定适合你的电脑,因为电子产品更新换代过快,你的硬盘不一定能剪切,在操作前一定要仔细观察硬盘的型号,是否为同款,我上了图…...
微信小程序在线预览PDF文件
需求:微信小程序在线预览PDF合同文件,加载完成后强制阅读10秒才可点击同意按钮 H5代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" cont…...
别再只调RGB了!用HSV给你的WS2812灯带调出更自然的彩虹渐变(附Arduino代码)
别再只调RGB了!用HSV给你的WS2812灯带调出更自然的彩虹渐变(附Arduino代码) 每次看到WS2812灯带突然跳变的颜色,总觉得少了点优雅。RGB数值的直接操控就像用扳手调钢琴——理论上可行,但实际操作起来总差那么点意思。上…...
高效制作IO通道测试表:从位号表到VLOOKUP函数实战
1. 为什么需要IO通道测试表? 在工业自动化项目中,IO通道测试表是FAT(工厂验收测试)环节的必备工具。想象一下你正在调试一个化工厂的DCS系统,面对成百上千个温度、压力、流量信号,如果没有一个清晰的测试清…...
ARM单片机位带操作原理与应用详解
1. ARM单片机位带操作基础回顾在嵌入式开发中,位带操作(Bit-Banding)是Cortex-M系列处理器提供的一个非常实用的功能特性。简单来说,它允许开发者通过访问特定内存地址的方式,直接操作某个寄存器的单个比特位,而无需进行传统的&qu…...
OpenClaw本地知识库构建:Qwen2.5-VL-7B处理扫描版PDF与图片资料
OpenClaw本地知识库构建:Qwen2.5-VL-7B处理扫描版PDF与图片资料 1. 为什么选择OpenClaw搭建个人知识管理系统 去年搬家时,我翻出了三大箱纸质资料——从学生时代的课堂笔记到工作后的技术手册,全都堆在角落积灰。这些资料里藏着不少珍贵内容…...
号令天下专业版手机尾号是五鬼好吗
在数字能量学的趣味研究领域中,手机号码的数字组合被赋予了各种独特的意义,其中“尾号五鬼”的磁场组合常常引发人们的关注。在数字能量学的认知体系里,“尾号五鬼”被视作一种带有负面能量的磁场组合,通常与不稳定、变化频繁、财…...
OpenClaw语音交互方案:千问3.5-27B对接Whisper实现听写
OpenClaw语音交互方案:千问3.5-27B对接Whisper实现听写 1. 为什么需要语音交互自动化 上个月帮朋友整理一场3小时的行业访谈录音时,我对着逐字稿反复暂停播放、标记重点、提炼观点,整整花了6小时才完成笔记。这种机械劳动让我开始思考&…...
千问3.5-9B镜像一键调用:OpenClaw自动化办公实战
千问3.5-9B镜像一键调用:OpenClaw自动化办公实战 1. 为什么选择OpenClaw千问3.5-9B组合? 去年冬天,我发现自己每天要花2小时处理邮件归档和会议记录整理。当我尝试用传统RPA工具时,发现它们对非结构化文本的处理能力有限——直到…...
到底什么是 TCP 连接:从三次握手到四次挥手,从数据结构到状态机
到底什么是 TCP 连接:从三次握手到四次挥手,从数据结构到状态机01. 前言:每天都在用,却说不清它是什么02. 一句话定义03. TCP 连接不是物理的,而是逻辑的04. TCP 连接的核心标识:四元组05. TCP 连接在内核中…...
2026届最火的六大降重复率神器实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 目前人工智能生成内容大范围运用的情形下,致使 AIGC 检测识别率降低的工具适时出…...
剧本杀app2025推荐,多类型剧本体验与社交互动优势
剧本杀app2025推荐,多类型剧本体验与社交互动优势在当今娱乐多元化的时代,剧本杀凭借其独特的角色扮演和推理乐趣,成为了众多年轻人喜爱的社交娱乐方式。据《2025 年中国剧本杀行业发展报告》显示,2025 年剧本杀市场规模持续增长&…...
