【Proteus仿真】【51单片机】智能语音家居陪护机器人

文章目录


一、功能简介

本项目使用Proteus8仿真51单片机控制器,使用OLED液晶、按键、蜂鸣器、DS18B20温度传感器、人体红外传感器、语音识别模块、继电器、风扇、LED等。

主要功能:

系统运行后,OLED显示动画效果,一段时间后静止。当到达指定时间时开启闹钟,系统需感应到有人后,此时可通过K4键或语音关闭闹铃。

系统感应到有人后,OLED显示测量的人体体温、时间、LED和风扇的开关状态;此时可通过语音开关LED和风扇;可通过按键K3进入闹钟设置界面,通过K3键切换不同时间位置,K1和K2键加减调节,设置后按下K4键保存并退出,返回测温和时钟显示界面。

语音识别指令(十六进制数):

开灯-->0X01

关灯-->0X02

开风扇-->0X11

关风扇-->0X12

关闹铃-->0X22


二、软件设计

c 复制代码
/*
作者:嗨小易(QQ:3443792007)

*/

//系统数据参数显示界面
void sys_parm_show(void)
{
	OLED_Clear();
	//温度:
	OLED_ShowCHinese(0,0,0);
	OLED_ShowCHinese(1*16,0,1);
	OLED_ShowCHinese(2*16,0,5);
	//时间:
	OLED_ShowCHinese(0,2,2);
	OLED_ShowCHinese(1*16,2,3);
	OLED_ShowCHinese(2*16,2,5);
	//灯:
	OLED_ShowCHinese(0,4,4);
	OLED_ShowCHinese(1*16,4,5);
	OLED_ShowString(2*16,4,"   ",16);
	//风扇:
	OLED_ShowCHinese(3*16+8*1,4,16);
	OLED_ShowCHinese(4*16+8*1,4,17);
	OLED_ShowCHinese(5*16+8*1,4,5);
	OLED_ShowString(6*16+8*1,4,"   ",16);
}


//系统数据设置
void sys_data_set(void)
{
	u8 key=0;
	static u8 oneflag=0;
	//有人的时候
	if(sys_ctrl.window==1)
	{
		key=key_scan(0);
		//语音识别
		if(UART_RX_BUF[0]==LED_ON_CMD)//开灯
		{
			UART_RX_BUF[0]=0;
			LED=0;
			sys_ctrl.led=1;	
		}
		else if(UART_RX_BUF[0]==LED_OFF_CMD)//关灯
		{
			UART_RX_BUF[0]=0;
			LED=1;
			sys_ctrl.led=0;	
		}
		else if(UART_RX_BUF[0]==MOTOR_ON_CMD)//开风扇
		{
			UART_RX_BUF[0]=0;
			MOTOR=0;
			sys_ctrl.motor=1;	
		}
		else if(UART_RX_BUF[0]==MOTOR_OFF_CMD)//关风扇
		{
			UART_RX_BUF[0]=0;
			MOTOR=1;
			sys_ctrl.motor=0;
		}
		else if(UART_RX_BUF[0]==ALARM_OFF_CMD)//关闹铃
		{
			UART_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;
	sys_parm_init();//系统参数初始化
	OLED_Init();
	ds18b20_init();
	UART_Init();//串口初始化9600
	UART_SendString("UART Init OK...\r\n");
	//读取温度数据,等待稳定
	while(i--)
	{
		sys_ctrl.temp=ds18b20_read_temperture()*10;
		delay_ms(100);	
	}
	sys_open_show();//系统开机界面显示
	time0_init();//定时器初始化
	TR0=1;//开启定时器

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

相关推荐
水圈模拟2 小时前
世界模型:让 AI 预判水怎么流
人工智能·机器人
深圳多奥智能一卡(码、脸)通系统2 小时前
实现机器人、梯控与电梯的无缝对接,成为了一个亟待解决的痛点
机器人·agv·机器狗·门禁·梯控·amr
做个有深度的老李2 小时前
中小机加工车间协作机器人落地难点|从集成交付能力角度选型
大数据·人工智能·机器人·自动化·柔性机器人
创界工坊工作室3 小时前
21-基于单片机的智能窗帘与光照联动控制系统设计
stm32·单片机·嵌入式硬件·proteus
数智工坊4 小时前
视觉SLAM第2讲|初识SLAM:经典框架、传感器选型与工程环境全梳理
人工智能·深度学习·数码相机·机器人
PascalXie4 小时前
地面机器人VSLAM技术调研与实现方案参考:算法、硬件平台与工程落地
算法·机器人
数智工坊17 小时前
视觉SLAM第12讲|地图构建:单目稠密重建、RGB-D点云与八叉树地图全解析
人工智能·深度学习·矩阵·机器人
鲁邦通物联网19 小时前
绿色建筑场景下的机器人梯控设计:任务调度与运行优化方法
机器人·巡检机器人·机器人梯控·非侵入式采集·配送机器人·机器人乘梯·机器人自主乘梯
微咣科技19 小时前
2026 深圳工业机器人电池厂商巡礼:深圳市惠德技术科技,AGV 与移动装备定制锂电池供应商深度评析
科技·机器人
cnbestec21 小时前
当 65 个传感器铺满一只手套:TactileGlove 触觉数据手套如何支撑康复与具身智能研究
机器人·具身智能·pps·pps触觉传感器·人形机器人触觉传感器