Ngôn ngữ lập trình trên Arduino về cơ bản có thể được chia làm 3 phần:
- Giá trị: biến số (variable) và hằng số (constant) (hằng, biến số, kiểu dữ liệu...)
- Cấu trúc (structure) cấu trúc tuần tự (if, for, while,..), phép toán, toán tử,...
- Hàm và thủ tục (function)
Ở phần 1 và 2 hoàn toàn là ngôn ngữ C nên các bạn tham khảo các bài viết về ngôn ngữ C tại Serial về lập trình C. Chỉ riêng phần 3 là Hàm và thủ tục là các hàm dành riêng cho ngôn ngữ lập trình trên Arduino nên các bạn chỉ cần học them phần này sẽ lập trình được. Lưu ý những hàm giới thiệu bên dưới là những gì cơ bản nhất.
==========================================================================
3. Hàm thời gian
3.1 millis()
Giới thiệu
millis() có nhiệm vụ trả về một số - là thời gian (tính theo mili giây) kể từ lúc mạch Arduino bắt đầu chương trình của bạn. Nó sẽ tràn số và quay số 0 (sau đó tiếp tục tăng) sau 50 ngày.
Tham số
không
Trả về
một số nguyên kiểu unsigned long là thời gian kể từ lúc thương trình Arduino được khởi động
Ví dụ
unsigned long time;
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print("Time: ");
time = millis();
// in ra thời gian kể từ lúc chương trình được bắt đầu
Serial.println(time);
// đợi 1 giây trước khi tiếp tục in
delay(1000);
}
Lưu ý quan trọng:
Các hàm về thời gian trong Arduino gồm millis() và micros() sẽ bị tràn số sau 1 thời gian sử dụng. Với hàm millis() là khoảng 50 ngày. Tuy nhiên, do là kiểu số nguyên không âm (unsigned long) nên ta dễ dàng khắc phục điều này bằng cách sử dụng hình thức ép kiểu.
unsigned long time; byte ledPin = 10; void setup() { // khởi tạo giá trị biến time là giá trị hiện tại // của hàm millis(); time = millis(); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); } void loop() { // Lưu ý các dấu ngoặc khi ép kiểu // đoạn chương trình này có nghĩa là sau mỗi 1000 mili giây // đèn Led ở chân số 10 sẽ thay đổi trạng thái if ( (unsigned long) (millis() - time) > 1000) { // Thay đổi trạng thái đèn led if (digitalRead(ledPin) == LOW) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } // cập nhật lại biến time time = millis(); } }
Thông thường, nếu ta có 2 số A, B và B lớn hơn A ( B > A) thì phép trừ thu được A-B là một số âm. Nhưng khi ép kiểu unsigned long là kiểu số nguyên dương, không có số âm nên giá trị trả về là 1 số nguyên dương lớn.
Ví dụ: kết quả của phép trừ:
Ví dụ: kết quả của phép trừ:
unsigned long ex = (unsigned long) (0 - 1);
là 4294967295, con số này chính là giá trị lớn nhất của kiểu số unsigned long. Giống như bạn đạp xe 1 vòng và quay về vạch xuất phát vậy.
3.2 micros()
Giới thiệu
micros() có nhiệm vụ trả về một số - là thời gian (tính theo micro giây) kể từ lúc mạch Arduino bắt đầu chương trình của bạn. Nó sẽ tràn số và quay số 0 (sau đó tiếp tục tăng) sau 70 phút. Tuy nhiên, trên mạch Arduino 16MHz (ví dụ Duemilanove và Nano) thì giá trị của hàm này tương đương 4 đơn vị micro giây. Ví dụ micros() trả về giá trị là 10 thì có nghĩa chương trình của bạn đã chạy được 40 microgiây. Tương tự, trên mạch 8Mhz (ví dụ LilyPad), hàm này có giá trị tương đương 8 micro giây.
Lưu ý: 106 micro giây = 1 giây
Tham số
không
Trả về
một số nguyên kiểu unsigned long là thời gian kể từ lúc thương trình Arduino được khởi động
Ví dụ
unsigned long time;
void setup(){
Serial.begin(9600);
}
void loop(){
Serial.print("Time: ");
time = micros();
// in ra thời gian kể từ lúc chương trình được bắt đầu
Serial.println(time);
// đợi 1 giây trước khi tiếp tục in
delay(1000);
}
3.3 delay()
Giới thiệu
delay có nhiệm vụ dừng chương trình trong thời gian mili giây. Và cữ mỗi 1000 mili giây = 1 giây
Cú pháp
delay(ms)
Thông số
ms: thời gian ở mức mili giây. ms có kiểu dữ liệu là unsigned long
Trả về
không3.4 delayMicroseconds()
Giới thiệu
delayMicroseconds có nhiệm vụ dừng chương trình trong thời gian micro giây. Và cứ mỗi 1000000 micro giây = 1 giây.
Cú pháp
delayMicroseconds(micro);
Thông số
micro: thời gian ở mức micro giây. micro có kiểu dữ liệu là unsigned int. micro phải <= 16383. Con số này là mức tối đa của hệ thống Arduino, và có thể sẽ được điều chỉnh tăng trong tương lai. Và nếu bạn muốn dừng chương trình lâu hơn thì bạn cần dùng hàm delay
Trả về
khôngVí dụ
int outPin = 8; // digital pin 8
void setup()
{
pinMode(outPin, OUTPUT); // đặt là output
}
void loop()
{
digitalWrite(outPin, HIGH); // xuất 5V
delayMicroseconds(50); // đợi 50 micro giây
digitalWrite(outPin, LOW); // xuất 0V
delayMicroseconds(50); // đợi 50 micro giây
}
Ví dụ cho ta một cách để tạo một xung PWM tại chân số 8