【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设计,视频分享,技术交流。

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

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

相关文章

Adversarial attacks and defenses on AI in medical imaging informatics: A survey

Adversarial attacks and defenses on AI in medical imaging informatics: A survey----《AI在医学影像信息学中的对抗性攻击与防御&#xff1a;综述》 背景&#xff1a; 之前的研究表明&#xff0c;人们对医疗DNN及其易受对抗性攻击的脆弱性一直存在疑虑。 摘要&#xff1a;…

大数据之LibrA数据库常见术语(七)

NAME NODE Namenode是hadoop系统中的一个中心服务器&#xff0c;负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。 OLAP Online Analytical Processing&#xff0c;联机分析处理&#xff0c;是数据仓库系统最主要的应用&#xff0c;专门设计用于支持复杂的分…

实时高效获取目标窗口的可见区域

&#xff08;图一&#xff09; 以图一为例&#xff0c;假设窗口1的RECT为Rect1&#xff0c;窗口2的RECT为Rect2&#xff0c;窗口3的RECT为Rect3。那么窗口1的可见区域&#xff08;Region&#xff09;就是Rect1异或&#xff08;XOR&#xff09;Rect2后得到的区域&#xff0c;也…

RT-Thread 8. RT-Thread Studio arm-gcc使用10.2.1编译

1. gcc编译器下载 E:\RT-ThreadStudio\repo\Extract\ToolChain_Support_Packages\ARM\GNU_Tools_for_ARM_Embedded_Processors2. 把5.4.1 改为5.4.11 再“全部构建”&#xff0c;提示错误 3. 把工具链版本改为10.2.1&#xff0c;再“全部构建”

Django的查询所有,根据用户名查询,增加用户操作

1.路由 from meiduo_admin.user.user_views import UsersViewurlpatterns [# 用户操作路由path(users/, UsersView.as_view()), ]2. 序列化器 from rest_framework import serializersfrom meiduo_admin.models import Userclass UsersSerialize(serializers.ModelSerialize…

python版opencv人脸训练与人脸识别

1.人脸识别准备 使用的两个opencv包 D:\python2023>pip list |findstr opencv opencv-contrib-python 4.8.1.78 opencv-python 4.8.1.78数据集使用前一篇Javacv的数据集,网上随便找的60张图片,只是都挪到了D:\face目录下方便遍历 D:\face\1 30张刘德华图片…

Nacos安装指南:windows版本、linux版本

Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos GitHub的Release下载…

Android使用Glide类加载服务器中的图片

Glide类用于从服务器中获取图片并加载进ImageView。 一、添加依赖 Glide为第三方框架&#xff0c;使用时需添加依赖&#xff1a; 在 Gradle Scripts / build.gradle(Module:app) / dependencies方法 中添加 implementation com.github.bumptech.glide:glide:4.12.0 添加后…

【洛谷算法题】P2433-小学数学 N 合一【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P2433-小学数学 N 合一【入门2分支结构】&#x1f30f;题目描述&#x1f319;问题…

在Postgresql中进行关键字查找

在Postgresql中通过关键字查询&#xff0c;一般情况下&#xff0c;利用like语句。比如&#xff1a; select name from poi where name like %key word%. 但是众所周知&#xff0c;这样的匹配率不尽如人意。 本文通过示例&#xff0c;利用pg_trgm扩展进行实现更完美的关键字查询…

JVM(三) 垃圾回收

一、自动垃圾回收 1.1 C/C++的内存管理 在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收,而需要程序员编写代码进行回收的方式为手动回收。 内存泄漏指的是不再使用的对象在系统中…

【蓝桥杯选拔赛真题01】C++参赛建议 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++参赛建议 一、题目要求 1、编程实现 2、输入输出 二、算法分析 <

矩阵的运算

目标&#xff1a;实现一个能进行稀疏矩阵基本运算(包括加、减、乘)的运算器。 &#xff08;1&#xff09;以三元组顺序表表示稀疏矩阵&#xff0c;实现两个矩阵相加、相减、相乘的运算 &#xff08;2&#xff09;稀疏矩阵的输入形式为三元组表示&#xff0c;运算结果则以通常…

函数指针——回调函数、函数Table

目录 一、前言 二、回调函数 三、函数Table 四、高阶用法 一、前言 开发面对对象的C工程和大型复杂工程中面对多事件多状态情况下&#xff0c;使用函数数组将使工程变得简洁、容易维护 二、回调函数 函数指针&#xff1a; 可变参数&#xff1a; 返回类型 函数名&#xf…

简述JVM

文章目录 JVM简介JVM运行时数据区堆(线程共享)方法区/元空间/元数据区(线程共享)栈程序计数器 JVM类加载类加载过程双亲委派模型 垃圾回收机制(GC)判断对象是否为垃圾判断是否被引用指向 如何清理垃圾, 释放对象? JVM简介 JVM 是 Java Virtual Machine 的简称, 意为Java虚拟机…

VSCode:清理ipch缓存

VSCode使用了一段时间&#xff0c;发现有些变慢&#xff0c;电脑管家扫描后&#xff0c;提示“AppData\Local\Microsoft\vscode-cpptools\ipch”目录下有很多缓存文件可以清理。 查询了一下&#xff1a;C/C 扩展常见问题解答 (visualstudio.com) 该件夹内包含缓存的预编译头文…

WSL的秘钥被修改了要怎么弄

WSL的秘钥被修改了要怎么弄 gitgithub.com: Permission denied (publickey).ssh-add -l但是我是想加到github上的guiaguaide1.github.com里面哎&#xff0c;为什么这个是shengyi gitgithub.com: Permission denied (publickey). git push -u origin报错 aaaASUS:~/ML/paper/A…

kibana监控

采取方式 Elastic Agent &#xff1a;更完善的功能 Metricbeat&#xff1a;轻量级指标收集&#xff08;采用&#xff09; 传统收集方法&#xff1a;使用内部导出器收集指标&#xff0c;已不建议 安装 metricbeat Download Metricbeat • Ship Metrics to Elasticsearch | E…

基于Jenkins实现接口自动化持续集成

一、JOB项目配置 1、添加描述 可选选项可填可不填 2、限制项目的运行节点 节点中要有运行环境所需的配置 节点配置教程 3、源码管理 需要将脚本推送到远程仓库中 4、构建触发器 可以选择定时构建和轮询SCM 定时构建&#xff1a;根据设置的定时时间&#xff0c;自动执行定…

c++系列之vector类模拟实现

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; 构造函数 vector() //_begin表示有效成员的开始 //_finish表示有效成员的大小…