STM32智能门锁学习一,按键解锁,蓝牙解锁、oled显示,步进电机
经历了电脑重装系统之后的第一篇博客==
这一章主要介绍薄膜按键,蓝牙模块,oled显示屏,还有步进电机的学习。(板子型号是stm32f103c8t6,基于HAL库)
目录
一.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 ),然后串口就没什么用了,串口是电脑和单片机通讯,蓝牙是手机和单片机通讯,其实本质是一样的。