基于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度,声光报警
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仿真。
感谢你的观看!