STM32智能门锁学习一,按键解锁,蓝牙解锁、oled显示,步进电机

经历了电脑重装系统之后的第一篇博客==

这一章主要介绍薄膜按键,蓝牙模块,oled显示屏,还有步进电机的学习。(板子型号是stm32f103c8t6,基于HAL库)

目录

一.oled显示屏

二.步进电机

三.薄膜按键

四.蓝牙模块(HC05)


一.oled显示屏

这里建议大家买四针、并且焊好引脚的,这是我买了三个oled总结出来的规律。。

 

 这里主要用到的其实就三个函数,显示中文,显示字符,以及显示数字,还有使用之前要对其进行初始化和清屏,必要函数放在下面:

注意这里要显示的汉字是用字模提取软件得到的,C语言的话选择C51格式。

//初始化oled屏幕
void OLED_Init(void)
{ 	
	HAL_Delay(200);
 
	WriteCmd();
}
//清屏
void OLED_Clear(void)
{
	uint8_t i,n;		    
	for(i=0;i<8;i++)  
	{  
		OLED_WR_CMD(0xb0+i);
		OLED_WR_CMD (0x00); 
		OLED_WR_CMD (0x10); 
		for(n=0;n<128;n++)
			OLED_WR_DATA(0);
	} 
}
//显示汉字
void OLED_ShowCHinese(uint8_t x,uint8_t y,uint8_t no)  
{      			    
	uint8_t t,adder=0;
	OLED_Set_Pos(x,y);	
    for(t=0;t<16;t++)
		{
				OLED_WR_DATA(Hzk[2*no][t]);
				adder+=1;
     }	
		OLED_Set_Pos(x,y+1);	
    for(t=0;t<16;t++)
			{	
				OLED_WR_DATA(Hzk[2*no+1][t]);
				adder+=1;
      }					
}
//显示字符
void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size)  
{      	
	unsigned char c=0,i=0;	
		c=chr-' ';		
		if(x>128-1){x=0;y=y+2;}
		if(Char_Size ==16)
			{
			OLED_Set_Pos(x,y);	
			for(i=0;i<8;i++)
			OLED_WR_DATA(F8X16[c*16+i]);
			OLED_Set_Pos(x,y+1);
			for(i=0;i<8;i++)
			OLED_WR_DATA(F8X16[c*16+i+8]);
			}
			else {	
				OLED_Set_Pos(x,y);
				for(i=0;i<6;i++)
				OLED_WR_DATA(F6x8[c][i]);
				
			}
}

//显示数字
void OLED_ShowNum(uint8_t x,uint8_t y,unsigned int num,uint8_t len,uint8_t size2)
{         	
	uint8_t t,temp;
	uint8_t enshow=0;						   
	for(t=0;t<len;t++)
	{
		temp=(num/oled_pow(10,len-t-1))%10;
		if(enshow==0&&t<(len-1))
		{
			if(temp==0)
			{
				OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
				continue;
			}else enshow=1; 
		 	 
		}
	 	OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2); 
	}
} 

 使用方法也放在这里:

/* USER CODE BEGIN 2 */
	OLED_Init();
	OLED_Clear();
	OLED_ShowCHinese(0,0,0); //门 (初始状态)
	OLED_ShowCHinese(20,0,1);//已
	OLED_ShowCHinese(40,0,2);//上
	OLED_ShowCHinese(60,0,3);//锁
	OLED_ShowChar(80,0,'!',16);//!
	
	OLED_ShowCHinese(0,3,12); //请 
	OLED_ShowCHinese(20,3,13);//输
	OLED_ShowCHinese(40,3,14);//入
	OLED_ShowCHinese(60,3,6);//密
	OLED_ShowCHinese(80,3,7);//码
	OLED_ShowChar(100,3,':',16);//:
	
	OLED_ShowChar (30,6,'*',16);
	OLED_ShowChar (40,6,'*',16);
	OLED_ShowChar (50,6,'*',16);
	OLED_ShowChar (60,6,'*',16);
	
  /* USER CODE END 2 */

二.步进电机

配置四个output输出就好,然后负极接GND,正极接5V,因为它的电压是5V到12V,而板子上最大提供5V,所以就算调到最高速它也没多快,不过这里主要是用它来模拟开门现象,所以速度不重要,并且它还有一个有点就是可以精准控制转过的角度。

1、五线四相步进电机,不同线圈得电会让步进电机的转子转动一个角度,按一定规律给不同的线圈通电,就可以让步进电机连续转动。

2、每走一个位置,都要给一定的延时,不然还没等转子到位,下一个脉冲就进来了,会引起错误,导致电机堵转、异常震动。

3、通过改变延时的时间,就可以控制电机的转速,不能太慢,也不要太快,调试到合理范围就行,转向用了一个枚举类型,控制转向。

4、单片机IO口和电机四条线连接时,一定不能错误,要按照顺序相连接。

5、调换得电的顺序,就可以控制电机的转向。

我们要用步进电机实现的功能十分简单,所以咱不需要使用定时器啊中断啊之类的,采用八拍的方式控制引脚高低电平,然后将速度值作为控制角度的第三个参数即可。把代码放在这里:

//控制角度
void angle_control(unsigned int dir, double angle, unsigned int speed)
{
	int i;
	for(i=0;i<angle/STEPPER_ANGLE ;i++)
	speed_control (dir ,speed  );
}

 BUJin.h:

#ifndef __BUJIN_H__
#define __BUJIN_H__
#include "main.h"
#include "gpio.h"

#define IN1_H  HAL_GPIO_WritePin (GPIOA ,GPIO_PIN_6 ,GPIO_PIN_SET  )
#define IN1_L  HAL_GPIO_WritePin (GPIOA ,GPIO_PIN_6 ,GPIO_PIN_RESET )

#define IN2_H  HAL_GPIO_WritePin (GPIOA ,GPIO_PIN_7 ,GPIO_PIN_SET  )
#define IN2_L  HAL_GPIO_WritePin (GPIOA ,GPIO_PIN_7 ,GPIO_PIN_RESET )

#define IN3_H  HAL_GPIO_WritePin (GPIOB ,GPIO_PIN_0 ,GPIO_PIN_SET  )
#define IN3_L  HAL_GPIO_WritePin (GPIOB ,GPIO_PIN_0 ,GPIO_PIN_RESET )

#define IN4_H  HAL_GPIO_WritePin (GPIOB ,GPIO_PIN_1 ,GPIO_PIN_SET  )
#define IN4_L  HAL_GPIO_WritePin (GPIOB ,GPIO_PIN_1 ,GPIO_PIN_RESET )

#define STEPPER_ANGLE		0.703125
enum dir{Pos, Neg};   //Pos = 0, Neg = 1  枚举类型控制转向

void speed_control(unsigned int dir, unsigned int speed);
void angle_control(unsigned int dir, double angle, unsigned int speed);

#endif

 使用方法:angle_control(Neg  ,90,1);      

三.薄膜按键

这里建议大家用薄膜按键,因为我一开始买的矩阵按键是不能用的。。而且考虑到节省资源,按键的话我们大多采用中断的方式,薄膜按键的灵敏度还是很高的。附上原理图:

 cube配置如下,中断配置为下降沿触发和上拉电阻,输入模式采用下拉电阻模式,然后不要忘了配置中断优先级设置成3。

配置好之后只需要在GPIO.c里编写回调函数就行,根据行列判断是哪一个按键被按下,再得到按键值作为函数返回值即可,为了后面方便使用,最好是int类型。

四.蓝牙模块(HC05)

蓝牙模块需要先上位机调试,先把蓝牙和CH340连接到电脑,注意这里蓝牙和串口连接的时候蓝牙上的VCC要和串口的5V相连,TX,RX反接。打开串口调试助手,波特率为38400,勾选发送新行,如果没有的话也可以手敲换行符,一连上蓝牙应该是差不多两秒一次的速度闪烁,串口发送AT返回ok说明连接成功,没返回值的话检查一下线连接是否有问题,要不就建议换一个蓝牙模块。然后发送AT+NAME是改名字,AT+UART是改波特率,建议9600。

然后调试完之后就连到单片机上(注意这里连单片机时蓝牙的VCC要连3.3V ),然后串口就没什么用了,串口是电脑和单片机通讯,蓝牙是手机和单片机通讯,其实本质是一样的。

 

 

  • 7
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要实现基于STM32F407的按键解锁,可以按照以下步骤进行: 1. 确定需要使用的按键数量和按键的引脚。 2. 配置STM32F407的GPIO模块,将按键对应的引脚设置为输入模式,并启用上拉或下拉电阻。 3. 在主循环中不断检测按键状态。如果按键被按下,则执行解锁操作。 4. 实现解锁操作,可以通过控制LED灯或者蜂鸣器的状态来表示解锁成功。 下面是一个简单的代码示例,可以作为参考: ```c #include "stm32f4xx.h" #define KEY_GPIO_PORT GPIOA #define KEY_GPIO_PIN GPIO_Pin_0 #define KEY_GPIO_CLK RCC_AHB1Periph_GPIOA #define LED_GPIO_PORT GPIOD #define LED_GPIO_PIN GPIO_Pin_12 #define LED_GPIO_CLK RCC_AHB1Periph_GPIOD void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(KEY_GPIO_CLK, ENABLE); RCC_AHB1PeriphClockCmd(LED_GPIO_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin = KEY_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure); } int main(void) { GPIO_Config(); while (1) { if (GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN) == RESET) { GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN); // 执行解锁操作 } else { GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN); } } } ``` 在这个示例中,我们使用PA0作为按键引脚,PD12作为LED灯引脚。在主循环中,不断检测PA0的状态,如果按键被按下,则点亮PD12表示解锁成功。你可以根据自己的实际需求,进行相应的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值