Skip to content

Commit 2cca67e

Browse files
committed
Add section button
Add editorconfig file
1 parent 6ee2eee commit 2cca67e

File tree

2 files changed

+96
-1
lines changed

2 files changed

+96
-1
lines changed

.editorconfig

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# EditorConfig helps developers define and maintain consistent
2+
# coding styles between different editors and IDEs
3+
# http://editorconfig.org
4+
5+
root = true
6+
7+
[*]
8+
indent_style = space
9+
indent_size = 4
10+
end_of_line = lf
11+
charset = utf-8
12+
trim_trailing_whitespace = true
13+
insert_final_newline = true
14+
15+
[*.md]
16+
trim_trailing_whitespace = false
17+
18+
[*Makefile*]
19+
indent_style = tab
20+
indent_size = 2
+76-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,76 @@
1-
# Nút nhấn
1+
# Nút nhấn
2+
3+
Mã nguồn copy toàn bộ tự dự án trước, bao gồm các file `Makefile`, `main.c`, `rf_init.c`, `user_config.h`. Tuy nhiên chỉ thay đổi nội dung file `main.c`
4+
5+
Bạn có thể tải và biên dịch trực tiếp từ github:
6+
7+
```
8+
git clone https://github.com/esp8266vn/eps-iot-button
9+
cd eps-iot-button
10+
make
11+
```
12+
13+
```c
14+
//esp-button/main.c
15+
#include "osapi.h"
16+
#include "user_interface.h"
17+
#include "gpio.h"
18+
#define BTN_PIN 0 //GPIO0
19+
static int led_value = 0;
20+
void key_intr_handler(void *args); //Khai báo `prototype`
21+
void app_init()
22+
{
23+
//Cấu hình chân GPIO16 là ngõ ra, điều khiển đèn LED
24+
WRITE_PERI_REG(PAD_XPD_DCDC_CONF, (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | (uint32_t)0x1);
25+
26+
//Cấu hình chân GPIO16 là ngõ ra, điều khiển đèn LED
27+
WRITE_PERI_REG(RTC_GPIO_CONF, (READ_PERI_REG(RTC_GPIO_CONF) & (uint32_t)0xfffffffe) | (uint32_t)0x0);
28+
WRITE_PERI_REG(RTC_GPIO_ENABLE,(READ_PERI_REG(RTC_GPIO_ENABLE) & (uint32_t)0xfffffffe) | (uint32_t)0x1);
29+
30+
//Cấu hình `key_intr_handler` là hàm xử lý ngắt GPIO
31+
ETS_GPIO_INTR_ATTACH(key_intr_handler, NULL);
32+
33+
//Vô hiệu hóa ngắt GPIO để việc cấu hình không ảnh hưởng
34+
ETS_GPIO_INTR_DISABLE();
35+
36+
//Lựa chọn chức năng cho GPIO0 sử dụng In/Out Logic
37+
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0);
38+
39+
//Cấu hình GPIO0 hoạt động như ngõ vào (Input)
40+
gpio_output_set(0, 0, 0, GPIO_ID_PIN(BTN_PIN));
41+
gpio_register_set(GPIO_PIN_ADDR(BTN_PIN), GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE)
42+
| GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE)
43+
| GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE));
44+
45+
//Xóa cờ ngắt GPIO
46+
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(BTN_PIN));
47+
48+
//Cấu hình ngắt GPIO0 cạnh xuống
49+
gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_PIN), GPIO_PIN_INTR_NEGEDGE);
50+
51+
//Cho phép ngắt GPIO
52+
ETS_GPIO_INTR_ENABLE();
53+
}
54+
void user_init(void)
55+
{
56+
system_init_done_cb(app_init);
57+
}
58+
void key_intr_handler(void *args)
59+
{
60+
//Đọc trạng thái ngắt GPIO hiện tại
61+
uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
62+
if (gpio_status & BIT(BTN_PIN)) { //Chắc chắn rằng ngắt xuất phát từ GPIO0
63+
//Ghi giá trị đảo để hiển thị LED
64+
led_value ^= 0x01;
65+
led_value ^= 0x01;
66+
WRITE_PERI_REG(RTC_GPIO_OUT, (READ_PERI_REG(RTC_GPIO_OUT) & (uint32_t)0xfffffffe) | (uint32_t)(led_value & 1));
67+
}
68+
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(BTN_PIN)); //Xóa ngắt GPIO
69+
}
70+
```
71+
72+
Nút nhấn sẽ giúp việc ESP8266 khởi động một hành động nào đó khi cần thiết. Trong nhiều ứng dụng chúng ta hầu như đều cần những kích hoạt từ bên ngoài. Xuyên suốt cuốn sách này, sẽ dùng nút nhấn để kích hoạt chạy các ứng dụng mẫu cũng như đèn LED để thông báo các trạng thái. Trong phần này, nhấn nút đèn LED sẽ chuyển trạng thái (từ sáng -> tắt và ngược lại).
73+
74+
Đây là ví dụ đơn giản, trong thực tế việc xử lý nút nhấn khá phiền phức. Bởi vì nút nhấn vật lý khi được nhấn sẽ tạo ra hàng loạt các xung lên xuống (nhiễu, bouncing...). Thường thì chỉ cần đảm bảo mức Logic của chân đo được đã được giữ ổn định trong khoảng 100 mili giây là được xem đã ổn định.
75+
76+
Ngoài cách dùng ngắt để xác định nút nhấn có được nhấn hay không - cách này sẽ tiết kiệm tài nguyên tính toán của CPU, nó chỉ được gọi khi có sự kiện sảy ra, thì còn một cách nữa là hỏi vòng: Cách này đỏi hỏi CPU liên tục kiểm tra xem mức Logic của nút nhấn. Đồng thời việc đáp ứng cũng không nhanh bằng sử dụng ngắt.

0 commit comments

Comments
 (0)