【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…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...