Variable Scope & Qualifiers
Dưới đây là mô tả, giải thích và ví dụ về các Variable Scope & Qualifiers trong Arduino:
1. const
(Constant)
- Mô Tả: Từ khóa
const
được sử dụng để khai báo một biến có giá trị không thay đổi trong suốt quá trình chạy của chương trình. Biến này có thể làint
,float
, hoặc bất kỳ kiểu dữ liệu nào. - Giải Thích: Khi khai báo một biến với
const
, bạn không thể thay đổi giá trị của nó sau khi đã gán giá trị ban đầu. Điều này giúp tránh việc thay đổi giá trị của biến một cách vô tình, giữ cho chương trình ổn định hơn. -
Ví Dụ:
const int ledPin = 13; // Đặt giá trị cho biến ledPin là 13, không thể thay đổi void setup() { pinMode(ledPin, OUTPUT); // Sử dụng ledPin như một chân đầu ra } void loop() { digitalWrite(ledPin, HIGH); // Bật đèn LED delay(1000); digitalWrite(ledPin, LOW); // Tắt đèn LED delay(1000); }
Trong ví dụ trên,
ledPin
được khai báo làconst
, vì vậy bạn không thể thay đổi giá trị của nó trong suốt chương trình.
2. Scope (Phạm Vi Biến)
-
Mô Tả:
Scope
của một biến xác định khu vực trong chương trình mà biến đó có thể được truy cập và sử dụng. Biến có thể có phạm vi toàn cục (global) hoặc phạm vi cục bộ (local).- Global Scope: Biến khai báo bên ngoài tất cả các hàm có phạm vi sử dụng toàn chương trình.
- Local Scope: Biến khai báo trong một hàm chỉ có thể được sử dụng trong hàm đó.
-
Giải Thích:
- Biến toàn cục được khai báo bên ngoài bất kỳ hàm nào và có thể được truy cập từ bất kỳ hàm nào trong chương trình.
- Biến cục bộ được khai báo trong một hàm và chỉ có thể được sử dụng trong hàm đó.
-
Ví Dụ:
int globalVar = 10; // Biến toàn cục void setup() { Serial.begin(9600); Serial.println(globalVar); // Có thể truy cập globalVar } void loop() { int localVar = 5; // Biến cục bộ Serial.println(localVar); // Chỉ có thể sử dụng localVar trong hàm loop delay(1000); }
Trong ví dụ trên:
globalVar
có thể được truy cập từ cảsetup()
vàloop()
.localVar
chỉ có thể được sử dụng trong hàmloop()
.
3. static
-
Mô Tả: Từ khóa
static
được sử dụng để khai báo một biến có phạm vi cục bộ, nhưng giữ lại giá trị của nó giữa các lần gọi hàm. -
Giải Thích: Biến
static
chỉ được khởi tạo một lần và sẽ không bị xóa khi hàm kết thúc. Nó giữ lại giá trị của mình giữa các lần gọi hàm. Đây là một cách để theo dõi hoặc lưu trữ thông tin trong nhiều lần gọi mà không cần sử dụng biến toàn cục. -
Ví Dụ:
void countUp() { static int counter = 0; // Biến static counter++; Serial.println(counter); } void setup() { Serial.begin(9600); } void loop() { countUp(); // Gọi hàm countUp liên tục, giá trị của counter sẽ được lưu lại delay(1000); }
Trong ví dụ trên, biến
counter
sẽ không bị khởi tạo lại mỗi lần gọi hàmcountUp()
, mà sẽ giữ giá trị từ lần gọi trước đó. Kết quả in ra sẽ là một chuỗi các giá trị tăng dần.
4. volatile
- Mô Tả: Từ khóa
volatile
được sử dụng để khai báo một biến có thể thay đổi bất cứ lúc nào, ngoài sự kiểm soát của chương trình (ví dụ, khi có ngắt, phần cứng thay đổi giá trị biến, hoặc thay đổi bởi một quá trình khác). - Giải Thích: Khi khai báo một biến là
volatile
, nó thông báo cho trình biên dịch rằng giá trị của biến có thể thay đổi bất kỳ lúc nào, vì vậy trình biên dịch sẽ không tối ưu hóa mã liên quan đến biến đó. -
Ví Dụ:
volatile int interruptFlag = 0; // Biến volatile void setup() { Serial.begin(9600); attachInterrupt(digitalPinToInterrupt(2), interruptHandler, FALLING); // Ngắt trên chân 2 } void loop() { if (interruptFlag == 1) { Serial.println("Interrupt occurred!"); interruptFlag = 0; // Reset flag sau khi xử lý ngắt } } void interruptHandler() { interruptFlag = 1; // Cập nhật giá trị khi có ngắt }
Trong ví dụ trên,
interruptFlag
được khai báo làvolatile
vì nó có thể thay đổi bất ngờ khi có ngắt. Nếu không có từ khóavolatile
, trình biên dịch có thể tối ưu hóa mã và không phát hiện sự thay đổi của biến này trong hàmloop()
.