Arduino cung cấp bốn chức năng thao tác thời gian khác nhau
Không. | Mô tả chức năng |
1 | hàm delay () Cách hoạt động của hàm delay () khá đơn giản. Nó chấp nhận một đối số số nguyên (hoặc số). Con số này đại diện cho thời gian (được đo bằng mili giây). |
2 | Hàm delayMicroseconds () Hàm delayMicroseconds () chấp nhận một đối số số nguyên (hoặc số). Có một nghìn micro giây trong một phần nghìn giây và một triệu micro giây trong một giây. |
3 | hàm millis () Hàm này dùng để trả về số mili giây tại thời điểm board Arduino bắt đầu chạy chương trình hiện tại. |
4 | hàm micros () Hàm micros () trả về số micro giây kể từ thời điểm, bảng Arduino bắt đầu chạy chương trình hiện tại. Con số này tràn tức là trở về 0 sau khoảng 70 phút. |
Arduino – hàm delay ()
Cách hoạt động của hàm delay () khá đơn giản. Nó chấp nhận một đối số số nguyên (hoặc số). Con số này đại diện cho thời gian (được đo bằng mili giây). Chương trình nên đợi cho đến khi chuyển sang dòng mã tiếp theo khi nó gặp chức năng này. Tuy nhiên, vấn đề là, hàm delay () không phải là một cách tốt để khiến chương trình của bạn phải chờ, vì nó được biết đến như một hàm “chặn”.
Cú pháp của hàm delay ()
delay (ms) ;
trong đó, ms là thời gian tính bằng mili giây để tạm dừng (dài không dấu).
Thí dụ
/* Flashing LED
* ------------
* Turns on and off a light emitting diode(LED) connected to a digital
* pin, in intervals of 2 seconds. *
*/
int ledPin = 13; // LED connected to digital pin 13
void setup() {
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop() {
digitalWrite(ledPin, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delay(1000); // waits for a second
}
Arduino – hàm delayMicroseconds ()
Hàm delayMicroseconds () chấp nhận một đối số số nguyên (hoặc số). Con số này đại diện cho thời gian và được đo bằng micro giây. Có một nghìn micro giây trong một phần nghìn giây và một triệu micro giây trong một giây.
Hiện tại, giá trị lớn nhất có thể tạo ra độ trễ chính xác là 16383. Điều này có thể thay đổi trong các bản phát hành Arduino trong tương lai. Đối với độ trễ lâu hơn vài nghìn micro giây, bạn nên sử dụng hàm delay () để thay thế.
Cú pháp hàm delayMicroseconds ()
delayMicroseconds (us) ;
trong đó, chúng tôi là số micro giây để tạm dừng (unsigned int)
Thí dụ
/* Flashing LED
* ------------
* Turns on and off a light emitting diode(LED) connected to a digital
* pin, in intervals of 1 seconds. *
*/
int ledPin = 13; // LED connected to digital pin 13
void setup() {
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop() {
digitalWrite(ledPin, HIGH); // sets the LED on
delayMicroseconds(1000); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delayMicroseconds(1000); // waits for a second
}
Hàm này dùng để trả về số mili giây tại thời điểm board Arduino bắt đầu chạy chương trình hiện tại. Con số này tràn tức là trở về 0 sau khoảng 50 ngày.
Cú pháp hàm millis ()
millis () ;
Hàm này trả về mili giây kể từ khi bắt đầu chương trình.
Thí dụ
unsigned long time; void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("Time:"); time = millis();
//prints time since program started
Serial.println(time);
// wait a second so as not to send massive amounts of data
delay(1000);
}
Arduino – hàm micros ()
Hàm micros () trả về số micro giây kể từ thời điểm, bảng Arduino bắt đầu chạy chương trình hiện tại. Con số này tràn tức là trở về 0 sau khoảng 70 phút. Trên bo mạch Arduino 16 MHz (ví dụ: Duemilanove và Nano), chức năng này có độ phân giải bốn micro giây (tức là giá trị trả về luôn là bội số của bốn). Trên bo mạch Arduino 8 MHz (ví dụ như LilyPad), chức năng này có độ phân giải tám micro giây.
Cú pháp hàm micros ()
micros () ;
Hàm này trả về số micro giây kể từ khi chương trình bắt đầu (dài không dấu)
Thí dụ
unsigned long time; void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("Time:");
time = micros(); //prints time since program started
Serial.println(time); // wait a second so as not to send massive amounts of data
delay(1000);
}
Arduino – Mảng
Mảng là một nhóm vị trí bộ nhớ liên tiếp có cùng kiểu. Để tham chiếu đến một vị trí hoặc phần tử cụ thể trong mảng, chúng ta chỉ định tên của mảng và số vị trí của phần tử cụ thể trong mảng.
Hình minh họa dưới đây cho thấy một mảng số nguyên được gọi là C chứa 11 phần tử. Bạn tham chiếu đến bất kỳ phần tử nào trong số các phần tử này bằng cách đặt tên mảng theo sau là số vị trí của phần tử cụ thể trong dấu ngoặc vuông ([]). Số vị trí được gọi chính thức hơn là chỉ số con hoặc chỉ số (số này chỉ định số phần tử từ đầu mảng). Phần tử đầu tiên có chỉ số dưới 0 (không) và đôi khi được gọi là phần tử số không.
Do đó, các phần tử của mảng C là C [0] (phát âm là “C phụ 0”), C [1], C [2], v.v. Chỉ số con cao nhất trong mảng C là 10, nhỏ hơn 1 so với số phần tử trong mảng (11). Tên mảng tuân theo các quy ước tương tự như các tên biến khác.
Chỉ số con phải là một số nguyên hoặc biểu thức số nguyên (sử dụng bất kỳ kiểu tích phân nào). Nếu một chương trình sử dụng một biểu thức làm chỉ số con, thì chương trình sẽ đánh giá biểu thức để xác định chỉ số con. Ví dụ, nếu chúng ta giả sử rằng biến a bằng 5 và biến b bằng 6, thì câu lệnh thêm 2 vào phần tử mảng C [11].
Tên mảng được chỉ định con là một giá trị, nó có thể được sử dụng ở phía bên trái của một phép gán, giống như các tên biến không phải là mảng có thể.
Chúng ta hãy kiểm tra mảng C trong hình đã cho, kỹ hơn. Tên của toàn bộ mảng là C. 11 phần tử của nó được gọi là C [0] đến C [10]. Giá trị của C [0] là -45, giá trị của C [1] là 6, giá trị của C [2] là 0, giá trị của C [7] là 62 và giá trị của C [10] là 78.
Để in ra tổng các giá trị có trong ba phần tử đầu tiên của mảng C, chúng ta sẽ viết:
Serial.print (C[ 0 ] + C[ 1 ] + C[ 2 ] );
Để chia giá trị của C [6] cho 2 và gán kết quả cho biến x, chúng ta sẽ viết:
x = C[ 6 ] / 2;
Khai báo Mảng
Mảng chiếm không gian trong bộ nhớ. Để chỉ định kiểu của các phần tử và số phần tử theo yêu cầu của một mảng, hãy sử dụng một khai báo có dạng:
type arrayName [ arraySize ] ;
Trình biên dịch dự trữ lượng bộ nhớ thích hợp. (Nhớ lại rằng một khai báo, dự trữ bộ nhớ được gọi đúng hơn là một định nghĩa). Kích thước mảng phải là một hằng số nguyên lớn hơn 0. Ví dụ, để yêu cầu trình biên dịch dành 11 phần tử cho mảng số nguyên C, hãy sử dụng khai báo:
int C[ 12 ]; // C is an array of 12 integers
Mảng có thể được khai báo để chứa các giá trị của bất kỳ kiểu dữ liệu không tham chiếu nào. Ví dụ, một mảng kiểu chuỗi có thể được sử dụng để lưu trữ các chuỗi ký tự.
Ví dụ về sử dụng mảng
Phần này đưa ra nhiều ví dụ minh họa cách khai báo, khởi tạo và thao tác với mảng.
Ví dụ 1: Khai báo một mảng và sử dụng một vòng lặp để khởi tạo các phần tử của mảng
Chương trình khai báo một mảng n số nguyên 10 phần tử . Các dòng a – b sử dụng câu lệnh For để khởi tạo các phần tử của mảng thành số không. Giống như các biến tự động khác, mảng tự động không được khởi tạo hoàn toàn bằng 0. Câu lệnh đầu ra đầu tiên (dòng c) hiển thị tiêu đề cột cho các cột được in trong câu lệnh for tiếp theo (dòng d – e), câu lệnh này sẽ in mảng ở định dạng bảng.
Thí dụ
int n[ 10 ] ; // n is an array of 10 integers
void setup () {
}
void loop () {
for ( int i = 0; i < 10; ++i ) // initialize elements of array n to 0 {
n[ i ] = 0; // set element at location i to 0
Serial.print (i) ;
Serial.print (‘\r’) ;
}
for ( int j = 0; j < 10; ++j ) // output each array element's value {
Serial.print (n[j]) ;
Serial.print (‘\r’) ;
}
}
Kết quả – Nó sẽ tạo ra kết quả sau:
Element | Value |
0 1 2 3 4 5 6 7 8 9 | 0 0 0 0 0 0 0 0 0 0 |
Ví dụ 2: Khởi tạo một mảng trong một khai báo với một danh sách bộ khởi tạo
Các phần tử của một mảng cũng có thể được khởi tạo trong khai báo mảng bằng cách theo sau tên mảng với dấu bằng và danh sách bộ khởi tạo được phân tách bằng dấu phẩy được phân tách bằng dấu ngoặc nhọn. Chương trình sử dụng danh sách bộ khởi tạo để khởi tạo một mảng số nguyên có 10 giá trị (dòng a) và in mảng ở định dạng bảng (dòng b – c).
Thí dụ
// n is an array of 10 integers
int n[ 10 ] = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 } ;
void setup () {
}
void loop () {
for ( int i = 0; i < 10; ++i ) {
Serial.print (i) ;
Serial.print (‘\r’) ;
}
for ( int j = 0; j < 10; ++j ) // output each array element's value {
Serial.print (n[j]) ;
Serial.print (‘\r’) ;
}
}
Kết quả – Nó sẽ tạo ra kết quả sau:
Element | Value |
0 1 2 3 4 5 6 7 8 9 | 32 27 64 18 95 14 90 70 60 37 |
Ví dụ 3: Tính tổng các phần tử của một mảng
Thông thường, các phần tử của một mảng đại diện cho một loạt các giá trị được sử dụng trong một phép tính. Ví dụ: nếu các phần tử của một mảng đại diện cho điểm của kỳ thi, giáo sư có thể muốn tính tổng các phần tử của mảng và sử dụng tổng đó để tính điểm trung bình của lớp cho kỳ thi. Chương trình tính tổng các giá trị có trong mảng số nguyên 10 phần tử a .
Thí dụ
const int arraySize = 10; // constant variable indicating size of array
int a[ arraySize ] = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 };
int total = 0;
void setup () {
}
void loop () {
// sum contents of array a
for ( int i = 0; i < arraySize; ++i )
total += a[ i ];
Serial.print (“Total of array elements : ”) ;
Serial.print(total) ;
}
Kết quả – Nó sẽ tạo ra kết quả sau:
Total of array elements: 849
Mảng rất quan trọng đối với Arduino và cần được chú ý nhiều hơn. Các khái niệm quan trọng sau đây liên quan đến mảng phải rõ ràng đối với Arduino:
S.NO. | Khái niệm & Mô tả |
1 | Chuyển Mảng đến Hàm Để truyền đối số mảng cho một hàm, hãy chỉ định tên của mảng mà không có bất kỳ dấu ngoặc nào. |
2 | Mảng đa chiều Mảng có hai thứ nguyên (tức là chỉ số con) thường đại diện cho bảng giá trị bao gồm thông tin được sắp xếp theo hàng và cột. |