潘多拉STM32L4的简单部件控制

通过按键切换点亮的 LED 灯

电路原理

通过电路原理图我们可以看到 R-G-B 三个 LED 灯共用 3.3v 阳极,通过电阻分压到单片机管脚,原理很简单,我们给管脚输出低电平则相应的 LED 点亮。

1
2
3
4
#define LED_PIN_RED  GET_PIN(E, 7)  //定义红灯管脚

rt_pin_mode(LED_PIN_RED, PIN_MODE_OUTPUT); //定义管脚模式为输入
rt_pin_write(LED_PIN_RED, PIN_LOW);  //低电平点亮

按键的线路接法自带上拉电阻,所以我们设置输入模式为 PIN_MODE_INPUT 即可,不需要考虑上下拉输入模式。

按键连接示意图 按键连接示意图

实现代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

#define NULL_LED -1


#define LED_PIN_RED 		GET_PIN(E, 7)  //红灯管脚
#define LED_PIN_GREEN 	    GET_PIN(E, 8)  //绿灯管脚
#define LED_PIN_BLUE 		GET_PIN(E, 9)  //蓝灯管脚

#define KEY_OPEN_RED    GET_PIN(D, 10)  //点亮红灯按钮
#define KEY_OPEN_GREEN  GET_PIN(D, 9)   //点亮绿灯按钮
#define KEY_OPEN_BLUE   GET_PIN(D, 8)   //点亮蓝灯按钮


//根据下标点亮LED
void change_lighting_led(int lightIndex)
{
	  rt_base_t rgbs[] = {LED_PIN_RED, LED_PIN_GREEN, LED_PIN_BLUE};
		for(int i = 0; i < 3; i++)
	  {
				if(i == lightIndex)
				{
						rt_pin_write(rgbs[i], PIN_LOW);
				}
				else
				{
						rt_pin_write(rgbs[i], PIN_HIGH);
				}
		}
}

//读取按键
void read_key_lighting_led()
{
		rt_base_t keys[] = {KEY_OPEN_RED, KEY_OPEN_GREEN, KEY_OPEN_BLUE};
		
		change_lighting_led(NULL_LED); //熄灭所有LED
		
		while (1)
		{
				for(int i = 0; i < 3; i++)
				{
					  if(rt_pin_read(keys[i]) == PIN_LOW)
						{
								change_lighting_led(i);  //切换点亮的LED
						}
				}
				rt_thread_mdelay(50);
    }
}

int main(void)
{

		//设置管脚的模式
        rt_pin_mode(LED_PIN_RED, PIN_MODE_OUTPUT);
		rt_pin_mode(LED_PIN_GREEN, PIN_MODE_OUTPUT);
		rt_pin_mode(LED_PIN_BLUE, PIN_MODE_OUTPUT);
	
		rt_pin_mode(KEY_OPEN_RED, PIN_MODE_INPUT);
		rt_pin_mode(KEY_OPEN_GREEN, PIN_MODE_INPUT);
		rt_pin_mode(KEY_OPEN_BLUE, PIN_MODE_INPUT);

		read_key_lighting_led();
	
	
    return RT_EOK;
}

追加蜂鸣器控制

电路原理图

电路中的 S8050 是贴片三极管,封装引脚说明及外观图如下:(转载请说明出处:https://dp2px.com)

这里简单科普一下三极管的原理,晶体三极管(以下简称三极管)按材料分有两种:锗管和硅管。而每一种又有 NPNPNP 两种结构形式,但使用最多的是硅 NPN 和锗 PNP 两种三极管(其中,N 是负极的意思(代表英文中 Negative),N 型半导体在高纯度硅中加入磷取代一些硅原子,在电压刺激下产生自由电子导电,而P是正极的意思(Positive)是加入硼取代硅,产生大量空穴利于导电)。

在基极 B 补充一个很小的Ib,就可以在集电极 C 上得到一个较大的Ic,这就是所谓电流放大作用,Ic 与 Ib 是维持一定的比例关系:

β1 = Ic / Ib

β1 称为直流放大倍数。

实现代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

#define NULL_LED -1
#define BEEP_TIME 3


#define LED_PIN_RED 		GET_PIN(E, 7)  //红灯管脚
#define LED_PIN_GREEN 	    GET_PIN(E, 8)  //绿灯管脚
#define LED_PIN_BLUE 		GET_PIN(E, 9)  //蓝灯管脚

#define KEY_OPEN_RED    GET_PIN(D, 10)  //点亮红灯按钮
#define KEY_OPEN_GREEN  GET_PIN(D, 9)   //点亮绿灯按钮
#define KEY_OPEN_BLUE   GET_PIN(D, 8)   //点亮蓝灯按钮

#define BEEP_PIN 				GET_PIN(B, 2)   //蜂鸣器控制管脚


//根据下标点亮LED
void change_lighting_led(int lightIndex)
{
	  rt_base_t rgbs[] = {LED_PIN_RED, LED_PIN_GREEN, LED_PIN_BLUE};
		for(int i = 0; i < 3; i++)
	  {
				if(i == lightIndex)
				{
						rt_pin_write(rgbs[i], PIN_LOW);
				}
				else
				{
						rt_pin_write(rgbs[i], PIN_HIGH);
				}
		}
}

//读取按键
void read_key_lighting_led()
{
		int lighting_index = NULL_LED;
		int beep_time_count = 0;
	
		rt_base_t keys[] = {KEY_OPEN_RED, KEY_OPEN_GREEN, KEY_OPEN_BLUE};
		
		rt_pin_write(BEEP_PIN, PIN_LOW);
		
		change_lighting_led(NULL_LED); //熄灭所有LED
		
		while (1)
		{
				for(int i = 0; i < 3; i++)
				{
					  if(rt_pin_read(keys[i]) == PIN_LOW)
						{
								rt_thread_mdelay(50);  //去抖动
								if(rt_pin_read(keys[i]) == PIN_LOW)
								{
										change_lighting_led(i);  //切换点亮的LED
										beep_time_count = 0;
									
										if(beep_time_count < BEEP_TIME)
										{
												rt_pin_write(BEEP_PIN, PIN_HIGH); 
										}
										else
										{
												rt_pin_write(BEEP_PIN, PIN_LOW); 
										}
								}
						}
				}
				beep_time_count++;
				if(beep_time_count >= BEEP_TIME)
				{
						rt_pin_write(BEEP_PIN, PIN_LOW); 
				}
				rt_thread_mdelay(50);
    }
}

int main(void)
{

		//设置管脚的模式
        rt_pin_mode(LED_PIN_RED, PIN_MODE_OUTPUT);
		rt_pin_mode(LED_PIN_GREEN, PIN_MODE_OUTPUT);
		rt_pin_mode(LED_PIN_BLUE, PIN_MODE_OUTPUT);
	
		rt_pin_mode(KEY_OPEN_RED, PIN_MODE_INPUT_PULLUP);
		rt_pin_mode(KEY_OPEN_GREEN, PIN_MODE_INPUT_PULLUP);
		rt_pin_mode(KEY_OPEN_BLUE, PIN_MODE_INPUT_PULLUP);
	
		rt_pin_mode(BEEP_PIN, PIN_MODE_OUTPUT);

		read_key_lighting_led();
	
	
    return RT_EOK;
}

演示视频