当前位置: 首页 > article >正文

基于STM32的智能床垫控制系统的Proteus仿真

文章目录

  • 一、智能床垫控制系统
    • 1.题目要求
    • 2.思路
    • 3.电路仿真
      • 3.1 未仿真
      • 3.2 开始仿真,显示屏显示智能床垫
      • 3.3 模拟红外按键1按下,显示屏显示模式1,床垫温度,后背舵机,腿部舵机转动模式1设置的角度
      • 3.3 模拟红外按键2按下,显示屏显示模式2,床垫温度,后背舵机,腿部舵机转动模式2设置的角度
      • 3.4 模拟红外按键3按下,显示屏显示加热时间和按摩时间
      • 3.5 模拟红外按键4按下,单独对背部舵机进行角度控制
      • 3.6 模拟红外按键5按下,单独对腿部舵机进行角度控制
      • 3.7 模拟红外按键6按下,开启按摩模式,按摩时间到自动退出
      • 3.8 模拟红外按键7按下, 开启加热模式,按摩时间到自动退出
      • 3.9 模拟红外按键8按下, 一键躺平,舵机恢复初始状态
      • 3.10 模拟红外按键9按下,设置床垫的倾斜
      • 3.11 温度超过阈值28度,声光报警
    • 4.仿真程序
      • 4.1 程序说明
      • 4.2 程序说明
      • 4.3 OLED显示
      • 4.4 红外遥控
  • 二、总结



一、智能床垫控制系统

1.题目要求

智能床垫主要应用于家庭或高档宾馆,该系统下位机用红外遥控设定床垫固定模式(至少2种模式),另外
可以单独可以对后背和腿部位置进行升降控制,可以一键躺平控制。其中床垫的部分升降可以通过控制电机的战斗感来传动床垫的升降部件机械结构。下位机可显示当前床垫的状态。红外遥控器可以进行加热和按摩功能,可设定加热和按摩的时间。

实物演示视频上传一直失败,所以我大概描述下具体的功能把。

实物演示视频:

开机屏幕显示智能床垫(第二行)
按下按键1,屏幕显示模式1(第二行),床垫温度(第三行) ,舵机转动一定的角度,再次按下恢复显示智能床垫,舵机恢复原来的角度
按下按键2,屏幕显示模式2(第二行),床垫温度(第三行) ,舵机转动一定的角度,再次按下恢复显示智能床垫,舵机恢复原来的角度
按下按键3,屏幕显示加热时间:010←(第一行),按摩时间:010←(第二行),按阈值加减按键可以对时间进行加减,按切换按键可以从加热时间切换为按摩时间,同样的也能进行加减,再次按下按键3,显示屏恢复原来显示智能床垫
按下按键4,单独对背部舵机进行角度控制
按下按键5,单独对腿部舵机进行角度控制
按下按键6,显示屏显示按摩(第二行),单独对按摩舵机进行角度控制,来回摆动,到达按摩时间舵机停止,恢复初始角度
按下按键7,单独对继电器进行加热,显示屏显示加热(第二行),到达加热时间加热停止,显示屏恢复显示智能床垫。
按下按键8,进行一键躺平,舵机恢复初始状态
按下按键9,步进电机转动,进行床垫的升降,床垫倾斜:180(60->120->180),按4下退出恢复显示智能床垫。
当温度过高,蜂鸣器会进行报警,这里设置的温度阈值为28.

原理图如下:

在这里插入图片描述

框图如下:

在这里插入图片描述

2.思路

由上面的功能需求,我们大概知道有这些东西,3舵机,1步进电机,1显示屏,1温度传感器,1蜂鸣器,1继电器,1红外遥控,1电源模块等等。

这里红外遥控比较有歧义,本来想直接用按键的,但是又需要很多按键,如果采用矩阵按键虽然也行,但是操作起来比较繁琐,但是如果用串口发指令就简单许多了。

单片机STM32F103C8T6:

在这里插入图片描述

3舵机(SG90):

在这里插入图片描述

1步进电机(ULN2003驱动):

在这里插入图片描述

1显示屏(OLED显示):

在这里插入图片描述

1温度传感器(DS18B20):

在这里插入图片描述

1蜂鸣器(BUZZER):

在这里插入图片描述

1继电器

在这里插入图片描述

1红外遥控

在这里插入图片描述

1电源模块

在这里插入图片描述

3.电路仿真

3.1 未仿真

在这里插入图片描述

3.2 开始仿真,显示屏显示智能床垫

在这里插入图片描述

3.3 模拟红外按键1按下,显示屏显示模式1,床垫温度,后背舵机,腿部舵机转动模式1设置的角度

*Key1X 设置模式1开启/关闭 X取值为1(开启)和0(关闭)

在这里插入图片描述

3.3 模拟红外按键2按下,显示屏显示模式2,床垫温度,后背舵机,腿部舵机转动模式2设置的角度

*Key2X 设置模式2开启/关闭 X取值为1(开启)和0(关闭)

在这里插入图片描述

3.4 模拟红外按键3按下,显示屏显示加热时间和按摩时间

*Key3XHHH 设置模式3设置加热时间/按摩时间/退出 X取值为2(按摩)和1(加热)以及0(退出),后面的HHH则为时间,比如010即设置为10秒钟,如果是0则不考虑后面的时间

*Key31010 设定加热时间为10s

在这里插入图片描述

*Key32012 设定按摩时间为12s

在这里插入图片描述

3.5 模拟红外按键4按下,单独对背部舵机进行角度控制

*Key4 单独对背部舵机进行角度控制

在这里插入图片描述

3.6 模拟红外按键5按下,单独对腿部舵机进行角度控制

*Key5 单独对腿部舵机进行角度控制

在这里插入图片描述

3.7 模拟红外按键6按下,开启按摩模式,按摩时间到自动退出

*Key6 开启按摩模式,按摩时间到自动退出

在这里插入图片描述

3.8 模拟红外按键7按下, 开启加热模式,按摩时间到自动退出

*Key7 开启加热模式,按摩时间到自动退出

在这里插入图片描述

3.9 模拟红外按键8按下, 一键躺平,舵机恢复初始状态

*Key8 一键躺平,舵机恢复初始状态

在这里插入图片描述

3.10 模拟红外按键9按下,设置床垫的倾斜

*Key9X 设置床垫的升降/退出 X取值为1(开启)和0(关闭)

倾斜角度:60

在这里插入图片描述

倾斜角度:120

在这里插入图片描述

倾斜角度:180

3.11 温度超过阈值28度,声光报警

a1f.png)

4.仿真程序

4.1 程序说明

主控芯片:STM32F103C8
HSI:64MHZ
Systick: 1ms

加热继电器:RELAY(PA0)

DS18B20温度传感器:DAT(PA4)

模拟红外遥控模块(Uart1):9600(PA9:tx1,PA10:rx1)

声光报警:BUZZER(PA15)

步进电机(ULN2003驱动):
IN1(PB0)
IN2(PB1)
IN3(PB2)
IN4(PB3)

舵机:
背部舵机PWM1:(PB6)
腿部舵机PWM2:(PB7)
按摩舵机PWM3:(PB8)

OLED显示屏:SCL(PB14),SDA(PB15)

在这里插入图片描述

红外遥控协议(串口协议):
举例如发送*Key11,即设置为开启模式1
*Key1X 设置模式1开启/关闭 X取值为1(开启)和0(关闭)
*Key2X 设置模式2开启/关闭 X取值为1(开启)和0(关闭)
*Key3XHHH 设置模式3设置加热时间/按摩时间/退出 X取值为2(按摩)和1(加热)以及0(退出),后面的HHH则为时间,比如010即设置为10秒钟,如果是0则不考虑后面的时间
*Key4 单独对背部舵机进行角度控制
*Key5 单独对腿部舵机进行角度控制
*Key6 开启按摩模式,按摩时间到自动退出
*Key7 开启加热模式,按摩时间到自动退出
*Key8 一键躺平,舵机恢复初始状态
*Key9X 设置床垫的升降/退出 X取值为1(开启)和0(关闭)

4.2 程序说明

/* Includes ------------------------------------------------------------------*/
#include "Drv_UserSystem.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
/**
  * @brief  main function.
  * @param  none
  * @retval none
  */
int main(void)
{
	UserSystemInit();//用户配置初始化		
	while (1)
	{			
			if(stSysTime.flg._100ms + BEST_MILLISECOND < Time_millis()) //100ms
			{
				stSysTime.flg._100ms = Time_millis();		
                Receive_data_Handel();//数据接收判断	
                DS18B20_Collect_data();//DS18B20采集温湿度数据				
 				OLED_Handel();//OLED显示					
				IWDG_ReloadCounter();//清开门狗 				
			}	
			if(stSysTime.flg._1s + THOUSAND_MILLISECOND < Time_millis()) //1s
			{	
				stSysTime.flg._1s = Time_millis();					
                Time_Handel();//时间任务				
			}				
    }
}

4.3 OLED显示

/*******************************************************************************
 * 函数名:OLED_Handel
 * 描述  :OLED显示
 * 输入  :void
 * 输出  :void
 * 调用  :初始化
 * 备注  :100ms
*******************************************************************************/
void OLED_Handel(void)
{  	
	if(key_mode == 0)
	{
		OLED_Show_Character(2,3,0,16);//智
		OLED_Show_Character(2,4,1,16);//能		
		OLED_Show_Character(2,5,2,16);//床
		OLED_Show_Character(2,6,3,16);//垫			
	}
	else if(key_mode == 1)
	{
		OLED_Show_Character(2,1,4,16);//模
		OLED_Show_Character(2,2,5,16);//式		
        OLED_ShowString(2, 5, "1");		
		
		OLED_Show_Character(3,1,6,16);//床
		OLED_Show_Character(3,2,7,16);//垫		
		OLED_Show_Character(3,3,8,16);//温
		OLED_Show_Character(3,4,9,16);//度	
		OLED_Show_Character(3,5,10,16);//:	
		
		OLED_ShowNum(3,11,Temp_High,2);	
	}	
	else if(key_mode == 2)
	{
		OLED_Show_Character(2,1,4,16);//模
		OLED_Show_Character(2,2,5,16);//式		
        OLED_ShowString(2, 5, "2");		
		
		OLED_Show_Character(3,1,6,16);//床
		OLED_Show_Character(3,2,7,16);//垫		
		OLED_Show_Character(3,3,8,16);//温
		OLED_Show_Character(3,4,9,16);//度	
		OLED_Show_Character(3,5,10,16);//:	
		
		OLED_ShowNum(3,11,Temp_High,2);	
	}
	else if(key_mode == 3)
	{
		OLED_Show_Character(1,1,11,16);//加
		OLED_Show_Character(1,2,12,16);//热	
		OLED_Show_Character(1,3,13,16);//时
		OLED_Show_Character(1,4,14,16);//间	
		OLED_Show_Character(1,5,10,16);//:	
		
		OLED_ShowNum(1,11,Heating_time,3);			
		
		OLED_Show_Character(2,1,16,16);//按
		OLED_Show_Character(2,2,17,16);//摩	
		OLED_Show_Character(2,3,18,16);//时
		OLED_Show_Character(2,4,19,16);//间	
		OLED_Show_Character(2,5,10,16);//:	
		
		OLED_ShowNum(2,11,Massage_time,3);	

        if(Select_flag)
		{
            OLED_Part_Clear(1,14,16);			
			OLED_Show_Character(2,8,15,16);//←			
		}
        else
		{
	  	    OLED_Show_Character(1,8,15,16);//←	
            OLED_Part_Clear(2,14,16);					
		}			
	}
	else if(key_mode == 4)
	{
		OLED_Show_Character(2,4,16,16);//按
		OLED_Show_Character(2,5,17,16);//摩	
	}	
	else if(key_mode == 5)
	{
		OLED_Show_Character(2,4,11,16);//加
		OLED_Show_Character(2,5,12,16);//热	
	}	
	else if(key_mode == 6)
	{
		OLED_Show_Character(2,1,6,16);//床
		OLED_Show_Character(2,2,7,16);//垫
		OLED_Show_Character(2,3,20,16);//倾
		OLED_Show_Character(2,4,21,16);//斜
		OLED_Show_Character(2,5,10,16);//:	

        if(motor_count == 1)
		{
           OLED_ShowString(2, 12, "60");		
		}		
        else if(motor_count == 2)
		{
          OLED_ShowString(2, 12, "120");		
		}	
        else if(motor_count == 3)
		{
          OLED_ShowString(2, 12, "180");		
		}			
	}		
}

4.4 红外遥控

/*******************************************************************************
 * 函数名:Send_Cmd1
 * 描述  :遥控指令解析
 * 输入  :void
 * 输出  :void
 * 调用  :需要时调用
 * 备注  :举例如发送*Key11,即设置为开启模式1
 *******************************************************************************/
void Send_Cmd1(void)
{
	uint8_t i = 0;
	if(uart1_rx_buf[i+4] == '1')
	{
		if(uart1_rx_buf[i+5] == '1')
		{
			OLED_Clear();				//OLED清屏
			key_mode = 1;
			Angle1 = 80;
			Angle2 = 80;			
	        Servo1_SetAngle(Angle1);	
	        Servo2_SetAngle(Angle2);				
		}
		else if(uart1_rx_buf[i+5] == '0')
		{
			OLED_Clear();				//OLED清屏
			key_mode = 0;
			Angle1 = 30;
			Angle2 = 30;			
	        Servo1_SetAngle(Angle1);	
	        Servo2_SetAngle(Angle2);				
		}
	}
	else if(uart1_rx_buf[i+4] == '2')
	{
		if(uart1_rx_buf[i+5] == '1')
		{
			OLED_Clear();				//OLED清屏
			key_mode = 2;
			Angle1 = 100;
			Angle2 = 100;			
	        Servo1_SetAngle(Angle1);	
	        Servo2_SetAngle(Angle2);				
		}
		else if(uart1_rx_buf[i+5] == '0')
		{
			OLED_Clear();				//OLED清屏
			key_mode = 0;
			Angle1 = 30;
			Angle2 = 30;			
	        Servo1_SetAngle(Angle1);	
	        Servo2_SetAngle(Angle2);				
		}
	}
	else if(uart1_rx_buf[i+4] == '3')
	{
		if(uart1_rx_buf[i+5] == '2')
		{
			OLED_Clear();				//OLED清屏
			key_mode = 3;
            Select_flag = 1;	
            Massage_time = (AsciiToHex(uart1_rx_buf[i+6]))*100+(AsciiToHex(uart1_rx_buf[i+7]))*10+(AsciiToHex(uart1_rx_buf[i+8]));						
		}
		else if(uart1_rx_buf[i+5] == '1')
		{
			OLED_Clear();				//OLED清屏
			key_mode = 3;	
            Select_flag = 0;	
            Heating_time = (AsciiToHex(uart1_rx_buf[i+6]))*100+(AsciiToHex(uart1_rx_buf[i+7]))*10+(AsciiToHex(uart1_rx_buf[i+8]));			
		}
		else if(uart1_rx_buf[i+5] == '0')
		{
			OLED_Clear();				//OLED清屏
			key_mode = 0;			
		}
	}	
	else if(uart1_rx_buf[i+4] == '4')
	{
		Angle1 = Angle1 + 20;		
	    Servo1_SetAngle(Angle1);			
	}	
	else if(uart1_rx_buf[i+4] == '5')
	{
		Angle2 = Angle2 + 20;		
	    Servo2_SetAngle(Angle2);			
	}	
	else if(uart1_rx_buf[i+4] == '6')
	{
	  OLED_Clear();				//OLED清屏
	  key_mode = 4;		
      Massage_flag = 1;
      variable1 = Massage_time * 10;		
	}	
	else if(uart1_rx_buf[i+4] == '7')
	{
	  OLED_Clear();				//OLED清屏
	  key_mode = 5;		
      Heating_flag = 1;
      variable2 = Heating_time * 10;	
	}	
	else if(uart1_rx_buf[i+4] == '8')
	{
		Angle1 = 30;
		Angle2 = 30;			
		Angle3 = 30;			
	    Servo1_SetAngle(Angle1);	
	    Servo2_SetAngle(Angle2);
	    Servo3_SetAngle(Angle3);			
	}	
	else if(uart1_rx_buf[i+4] == '9')
	{
		if(uart1_rx_buf[i+5] == '1')
		{		
			OLED_Clear();				//OLED清屏
			key_mode = 6;			
            motor_en = 1;
			motor_count++;
		}
        else if(uart1_rx_buf[i+5] == '0')
		{
			OLED_Clear();				//OLED清屏
			key_mode = 0;		
		}			
	}	
}

二、总结

今天主要讲了基于STM32的智能床垫控制系统的Proteus仿真。

感谢你的观看!

在这里插入图片描述


http://www.kler.cn/a/461880.html

相关文章:

  • 什么是.net framework,什么是.net core,什么是.net5~8,版本对应关系
  • springcloud篇3-docker需熟练掌握的知识点
  • 解决 ffmpeg “Unknown encoder ‘hevc_nvenc‘“
  • 【LC】191. 位1的个数
  • 46. Three.js案例-创建颜色不断变化的立方体模型
  • 4. C语言 变量
  • 直流开关电源技术及应用二
  • 麒麟信安云在长沙某银行的应用入选“云建设与应用领航计划(2024)”,打造湖湘金融云化升级优质范本
  • python ai ReAct 代理(ReAct Agent)
  • ulimit命令与nginx的联系
  • 【Linux报告】实训六 重置超级用户密码
  • Docker--Docker Network(网络)
  • Java:认识异常(超详解)
  • Springboot项目:使用MockMvc测试get和post接口(含单个和多个请求参数场景)
  • datax与sqoop的优缺点?
  • 安全见闻(一)
  • 深度学习camp-ResNeXt-50实战解析
  • ffmpeg指令
  • Axure PR 9 Banner 轮播图 设计交互
  • Ps:创建数据驱动的图像
  • 瑞芯微(RK)平台调试MIPI屏幕
  • 力扣2110股票平滑下跌阶段的数目
  • excel操作
  • linux-centos8-安装make
  • Ubuntu20.04安装Foxit Reader 福昕阅读器
  • 展望2025:在创新与协作中创造价值、奉献佳作