Bài 2: Ngôn ngữ lập trình C cho Arduino

     Trong bài học số 2 này chúng ta sẽ tiến hành nghiên cứu các thành phần của ngôn ngữ lập trình C cho Arduino. Dựa vào các thành phần này chúng ta sẽ nghiên cứu các câu lệnh và chức năng của câu lệnh. Từ đó chúng ta sẽ thực hành được những ứng dụng trong lập trình Arduino. Các thành phần này là kiến thức cơ bản nhưng rất quan trọng. Để không bị mất kiến thức nền, các bạn không nên bỏ qua bài viết này.

  NỘI DUNG BÀI VIẾT  

  • Cấu trúc cơ bản của chương trình Arduino
  • Ví dụ chương trình sáng tắt 1 led đơn
  • Giải thích các thành phần của chương trình
  • Biến số và hằng số trong arduino
  • Hàm định nghĩa chức năng của các chân cho Arduino
  • Hàm dừng thời gian trong Arduino – Hàm delay
  • Ví dụ điều khiển 2 đèn led

 1.   CẤU TRÚC CƠ BẢN CỦA CHƯƠNG TRÌNH ARDUINO  

     ① Khai báo các thư viện (nếu có)

     ② Khai báo biến và hằng cho chương trình (nếu có)

     ③ Khởi tạo những giá trị và định nghĩa chức năng chân

      void setup( ) {

      // Khởi tạo giá trị cho chương trình

     // Định nghĩa chức năng của các port

                        }

     ④  Chương trình chính

     void loop( ) {

      // Nội dung chương trình (nội dung code)

                     }      

    ⑤ Khai báo và viết hàm chương trình con cho chương trình  (nếu có)

  2.  VÍ DỤ CHƯƠNG TRÌNH SÁNG TẮT 1 LED ĐƠN   

void setup( ) {
    pinMode(13, OUTPUT);  //Định nghĩa chân 13 là chân xuất dữ liệu
    }

void loop( ) {
    digitalWrite(13, HIGH);   //Bật sáng đèn led tại chân 13
    delay(1000);              // Đợi led sáng 1 giây
    digitalWrite(13, LOW);    // Tắt led
    delay(1000);              // Đợi led tắt 1 giây
    }

  3.  GIẢI THÍCH CÁC THÀNH PHẦN CỦA CHƯƠNG TRÌNH  

     Trong chương trình thì có 2 thành phần chính chúng ta cần phải chú ý đặt câu lệnh cho đúng. Đó chính là khối lệnh trong đoạn chương trình void setup() và chương trình void loop(). Void setup() và void loop() trong ngôn ngữ lập trình C cho arduino bản chất là một chương trình con. 

     a. Nhiệm vụ chương trình void setup()

     Các lệnh trong chương trình này được sử dụng để khai báo cho biến hoặc định nghĩa chức năng cho các chân cần điều khiển. Thường thì sử dụng các hàm pinMode hoặc các câu lệnh gán giá trị cho biến. Khi biên dịch thì các lệnh trong void setup() sẽ chỉ thực hiện 1 lần. Sau khi thực hiện xong các câu lệnh trong void setup() chương trình sẽ thực hiện các khối lệnh trong vòng lặp void loop().

     b. Nhiệm vụ chương trình void loop()

      Các lệnh trong chương trình void loop() trong ngôn ngữ lập trình C cho arduino tương tự như chương trình main() trong ngôn ngữ C cơ bản. Các lệnh trong void loop() sẽ được thực hiện liên tục đến khi tắt nguồn điện. Do vậy, trong chương trình này chúng ta không sử dụng các lệnh khởi tạo hay thay đổi giá trị biến, những lệnh thay đổi có thể làm sai quy trình lặp lại của chương trình.

 4. BIẾN SỐ VÀ HẰNG SỐ TRONG ARDUINO  

         4.1.  Kiểu dữ liệu

     Kiểu dữ liệu sẽ quy định khả năng lưu trữ của biến. Ứng với mỗi kiểu dữ liệu khác nhau sẽ lưu trữ được giá trị khác nhau. Khi các bạn khai báo sai kiểu dữ liệu sẽ làm chương trình chạy sai mà không thông báo bất kỳ lỗi gì.

       Một số kiểu dữ liệu được sử dụng trong arduino

STT

Kiểu dữ liệu

Dung lượng

Phạm vi

Ý nghĩa

1

int

2 byte

-32,768 đến 37,767

 

2

unsigned int

2 byte

0 đến 65535

 

3

byte

1 byte

0 đến 255

 

4

char

1 byte

-128 đến 127

Lưu trữ 1 ký tự

5

unsigned char

1 byte

0 đến 255

Số nguyên ko âm

6

word

2 byte

0 đến 65535

Số nguyên ko âm

7

long

4 byte

-232 đến 232-1

Số nguyên (cần thêm hậu tố L)

8

unsigned long

4 byte

0 đến 232-1

Số nguyên không âm

9

short

2 byte

-32,768 đến 32,767

Số nguyên

10

void

Không trả giá trị

 

 

11

boolean

1 byte

True – false

HIGH – LOW

1 – 0

true – false

12

float

4 byte

-238 đến 238-1

Số thực 4 byte

13

double

8 byte

-264 đến 264-1

Số thực 8 byte

     Lưu ý: Việc xác định và khai báo đúng phạm vi biến giúp cho chương trình chạy chính xác. Nếu khai báo biến quá bé sẽ gây tràn biến, chương trình bị treo. Còn nếu khai báo quá lớn thì sẽ lãng phí tài nguyên của vi điều khiển.

       4.2.  Cú pháp khai báo biến

      4.2.1  Biến toàn cục

      Biến toàn cục là biến được khai báo và sử dụng trong toàn chương trình. Biến này sẽ được khai báo ở đầu chương trình và bên ngoài chứ không nằm trong void setup() hay void loop(). Biến chương trình này có ý nghĩa trong toàn bộ chương trình. Sau khi kết thúc chương trình giá trị trong biến vẫn còn được lưu trữ và sẽ được cập nhật lại khi vòng lặp loop thực hiện lại chu trình mới.

     Cú pháp: <kiểu dữ liệu> < tên biến>;

                      <kiểu dữ liệu > < tên biến> = < giá trị khởi tạo>;

     Ví dụ:

      float pi = 3.14;

      long a;  

     4.2.2  Biến cục bộ

     Biến cục bộ là biến được khai báo trong chương trình con. Vùng nhớ và giá trị của biến chỉ được khởi tạo và thực hiện trong khi chương trình con đang chạy. Khi kết thúc chương trình con thì biến này sẽ được giải phóng. Vùng nhớ của biến sẽ được tái tạo sử dụng cho biến khác.

void kiemtra() {
    int a = 0;  // Khai báo biến a là biến cục bộ trong chương trình kiểm tra
    a++;
    Serial.println(a);
    }

     4.2.3  Biến static

    Biến tĩnh là dạng biến sẽ không bị mất đi khi kết thúc chương trình con. Giá trị biến vẫn tồn tại sau khi kết thúc và nếu thực hiện việc gọi lại chương trình con đó thì biến đó sẽ tiếp tục cập nhật giá trị.

    Cú pháp:  static  <kiểu dữ liệu>  < tên biến>;

                   static  < kiểu dữ liệu>  < tên biến> = <giá trị khởi tạo>;

     Ví dụ:

     static int a = 0; // Khai báo biến a là biến số nguyên dạng tĩnh

     4.2.4 Biến volatile

     Cú pháp:       volatile <Kiểu dữ liệu >  < Tên biến>;

                           volatile < Kiểu dữ liệu> < Tên biến> = < Giá trị khởi tạo biến>;

     Biến volatile là biến có thể bị tác động từ chương trình ngoại vi khác. Những chương trình khác có thể tác động đến biến này và làm cho biến này thay đổi giá trị từ bên ngoài. Thường biến volatile được sử dụng cho các chương trình ngắt, hoặc thanh ghi ánh xạ từ chương trình khác hoặc nằm trong ứng dụng thực thi lệnh đa luồng.

     Ví dụ: volatile   int trang_thai;

                volatile   int bien_ngat = 0;

     4.3 Khai báo hằng

     Hằng số là những giá trị sau khi khai báo sẽ không thay đổi trong suốt quá trình thực hiện chương trình.

     4.3.1 Khai báo hằng số từ khóa const

     Cú pháp:        const  <kiểu dữ liệu>  < tên hằng> = <giá trị hằng>;              

     Ví dụ:

     const float pi = 3.14;

     4.3.2  Khai báo hằng với từ khóa #define

     Cú pháp:    #define <Tên hằng>  < Giá trị hằng>

     Ví dụ:         #define   Pi  3.14

     Với định nghĩa từ khóa define thì sẽ được đặt ở đầu chương trình, trong vùng khai báo thư viện. Với cách khai báo bằng từ khóa define thì giá trị hằng sẽ được định nghĩa, tuy nhiên trong chương trình nếu có tên biến nào trùng thì giá trị hằng sẽ bị thay thế, điều này rất dễ gây ra sai trong quá trình lập trình. Do đó, nếu không thật sự cần thiết thì không nên sử dụng kiểu dữ liệu này.

  5.  HÀM ĐỊNH NGHĨA CHỨC NĂNG CÁC CHÂN CHO ARDUINO   

     Cú pháp: pinMode(<Tên chân>, <Chức năng chân>);

     Chức năng: hàm pinMode được sử dụng để định nghĩa chân có chức năng xuất dữ liệu cho thiết bị ngoại vi (OUTPUT), đọc dữ liệu từ thiết bị ngoại vi (INPUT) hoặc vừa đọc tín hiệu  từ thiết bị bên ngoài và vừa kích hoạt điện trở kéo lên trong mạch Arduino (INPUT_PULLUP).

     Ví dụ:

  • pinMode(13, OUTPUT); // Định nghĩa chân 13 là ngõ xuất dữ liệu
  • pinMode(12, INPUT);  // Định nghĩa chân 12 là chân đọc dữ liệu vào arduino
  • pinMode(8, INPUT_PULLUP); // Định nghĩa chân 8 là chân đọc dữ liệu đồng thời kích hoạt điện trở kéo lên tại chân số 8

  6.  HÀM DỪNG THỜI GIAN TRONG ARDUINO – HÀM delay  

     6.1 Hàm delay()

      Cú pháp: delay(<thời gian dừng>);

  • Thời gian dừng được tính bằng mili giây.
  • Lưu ý: trong trường hợp truyền 1 biến vào hàm delay thì biến truyền vào phải có kiểu dữ liệu unsigned long.

     Ví dụ:

  • unsigned long thoi_gian = 1000:
  • delay(1000);// dừng chương trình trong 1 giây
  • delay(thoi_gian);// dừng chương trình trong 1 giây

     6.2 Hàm delayMicroseconds()

     Cú pháp: delayMicroseconds (<thời gian dừng>);

     Chức năng: hàm delayMicroseconds được sử dụng để dừng chương trình trong thời gian micro giây. Nghĩa là 1000000 micro giây = 1 giây.

  • Thời gian dừng có đơn vị là micro giây.
  • Lưu ý: trong trường hợp truyền 1 biến vào hàm delay thì biến truyền vào phải có kiểu dữ liệu unsigned int và phải <= 16383.

     Ví dụ:

  • unsigned int thoi_gian = 1000;
  • delayMicroseconds (1000);// dừng chương trình trong 1000 micro giây
  • delayMicroseconds (thoi_gian);// dừng chương trình trong 1000 micro giây.

     Trong bài học hôm nay các bạn chỉ cần nắm hàm pinMode() để định nghĩa chức năng cho các chân arduino. Còn những hàm xuất, đọc tín hiệu thì tôi sẽ trình bày ở bài viết hàm xuất tín hiệu và đọc tín hiệu. Từ những lệnh cơ bản này bạn đã có thể điều khiển được những hiệu ứng cơ bản cho các led đơn. 

  7.  VÍ DỤ ĐIỀU KHIỂN 2 ĐÈN LED  

     Trong ví dụ tiếp theo tôi hướng dẫn cho các bạn thực hiện điều khiển 2 bóng đèn led cùng lúc.

int LED1=13;
int LED2=14;

setup(){
pinMode(LED1,OUTPUT);
pintMode(LED2,OUTPUT);
}

void loop(){
//Điều khiển led 1
digitalWrite(LED1,HIGH);
delay(500);
digitalWrite(LED1, LOW);
delay(200);

//Điều khiển led 2
digitalWrite(LED1,HIGH);
delay(500);
digitalWrite(LED1, LOW);
delay(200);
}

     Với cách viết như trên các bạn sẽ nhận thấy được nhấp nháy 2 đèn, nhưng sự nhấp nháy là luân phiên. Bóng đèn thứ nhất sẽ sáng trong 500ms sau đó tắt 200ms. Tiếp theo thì bóng đèn thứ 2 sáng 500ms sau đó tắt 200ms. Chương trình tiếp tục thực hiện như vậy đến khi tắt nguồn. Đèn sẽ được thực hiện luân phiên đèn 1 sáng tắt – đèn 2 sáng tắt – đèn 1 sáng tắt – đèn 2 sáng tắt cho đến khi tắt nguồn. Để hiểu rõ hơn những nguyên lý hoạt động của led đơn, bạn xem ở bài viết LED đơn.

 

 

 


Categories:

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *