Chuyên đề arduino – Led đơn và ứng dụng trong arduino

      Chuyên đề arduino led đơn và ứng dụng trong arduino hướng dẫn cho các bạn những kiến thức lý thuyết và ứng dụng trong lập trình arduino. Để học tốt những nội dung trong bài viết này, các bạn có thể xem lại những kiến thức về vòng lặp và tín hiệu digital trong arduino. Bài viết này sẽ tập trung hướng dẫn cho các bạn cách kết nối phần cứng và cách viết code trên phần mềm Arduino IDE.

     NỘI DUNG BÀI VIẾT  

  • Tìm hiểu về led đơn
  • Lệnh xuất tín hiệu ra led đơn
  • Chương trình nhấp nháy 1 đèn led
  • Chương trình sáng dần tắt dần 8 led
  • Chương trình điều khiển đèn giao thông
  • Tổng kết

 1.  TÌM HIỂU VỀ LED ĐƠN

     Led đơn là công nghệ sử dụng tiếp giáp P-N để phát sáng khi có dòng điện đi qua đó. Bản chất của bóng đèn led cũng giống như tiếp giáp P-N của diode. Tuy nhiên, đối với bóng đèn led  thì khi có hiệu điện thế giữa 2 chân của bóng đèn led thì sẽ có phát sáng.

      Bóng đèn led được sử dụng để cảnh báo trong các bo điện tử hoặc sử dụng để báo nguồn, làm bảng quảng cáo,… Trên thực tế ứng dụng của bóng led rất nhiều. Tuy vậy, các bạn cần phải có kiến thức cơ sở để đảm bảo đèn led hoạt động đúng như mong muốn. Ứng với mỗi bóng đèn led thường sẽ chịu được những dòng điện định mức khác nhau. Ví dụ như bóng đèn led đỏ thì dòng chịu đựng là 20mA, bóng đèn led vàng thì 26mA. Việc biết được dòng điện định mức qua các bóng đèn led, từ đó các bạn mới có thể chọn được điện trở hạn dòng cho phù hợp. Giả sử bạn có mạch điện cơ bản sau:

       Trong đó: ILED = Vnguồn :  R     => R = Vnguồn  :  ILED  = 5 : 0.02 = 250 ohm 

       Vậy thì bạn phải chọn điện trở cho mạch hoạt động là: 270 ohm. Như vậy, đối với nguồn điện là 5V, bóng đèn led đỏ (ILED = 20mA) thì sử dụng điện trở là 270 ohm.

       Trên đây là những kiến thức cơ bản để bạn có thể hiểu được vì sao chúng ta phải có điện trở trong mạch sử dụng cho bóng đèn led. Và cũng phải biết được giá trị điện trở bắt buộc chọn là bao nhiêu để đảm bảo đèn led sáng đạt công suất cao nhất.

  2.  LỆNH XUẤT TÍN HIỆU RA LED ĐƠN  

     Lệnh xuất tín hiệu ra các chân digitalWrite cho arduino có 2 mức giá trị là HIGH (1) hoặc là mức LOW (0). Khi chân tín hiệu được cài đặt là OUTPUT bằng hàm pinMode(). Và dùng lệnh digitalWrite để xuất tín hiệu thì điện thế tại chân này sẽ là 5V (hoặc là 3,3 V trên mạch 3,3 V) khi xuất tín hiệu là HIGH (1), và 0V nếu được xuất tín hiệu là LOW (0).

    Khi một chân được cài đặt là INPUT bằng lệnh pinMode(). Và bạn cũng có thể bật hoặc tắt chức năng điện trở kéo lên bên trong arduino bằng lệnh pinMode(). Cách cài đặt như thế nào và vì sao phải sử dụng chức năng này các bạn có thể xem thêm tại bài viết hướng dẫn lệnh cài đặt pinMode().

  3. CHƯƠNG TRÌNH NHẤP NHÁY 1 ĐÈN LED  

   Các linh kiện cần thiết trong chương trình

  • Arduino Uno
  • 01 LED
  • 01 điện trở 220 Ohm 

  Sơ đồ kết nối 

Chương trình nhấp nháy 1 đèn led

   Đoạn chương trình được viết như sau:

int denled = 10;

void setup() {
 pinMode(denled, OUTPUT);
}

void loop() {
digitalWrite(denled,HIGH);      
delay(1000);              
digitalWrite(denled,LOW);  
delay(1000);             
}

Giải thích chương trình

Khai báo kiểu số nguyên int 

int denled = 10;

  • denled = 10; denled là tên biến, biến này được khai báo với tên gợi nhớ tùy bạn, tuy nhiên phải gán giá trị chính là số thứ tự của chân mà bạn gắn với bóng đèn led. Trong ví dụ này tôi kết nối LED vào chân số 10 của bo Arduino UNO.
  • Kết thúc khai báo bằng dấu (;), không có dấu ; trình biên dịch sẽ báo lỗi.

Chương trình con setup()

void setup() {}

  • Hàm setup() được Arduino đọc khi bắt đầu khởi động. Các khối lệnh nằm trong setup() để khởi tạo biến, khởi tạo thư viện và thiết lập thông số.
  • Hàm setup() chỉ chạy một lần khi bật nguồn hoặc reset lại chương trình.

pinMode

pinMode(denled, OUTPUT);

  • “pinMode”: Cấu hình quy định hoạt động của một chân như là một đầu vào (INPUT) hoặc đầu ra (OUTPUT).
  • “Pin”: Là chân mà bạn muốn đặt.
  • “Mode”: INPUT, OUTPUT hoặc INPUT_PULLUP.

Vòng lặp loop()

void loop() {}

  • Sau khi hàm setup() chạy xong, những lệnh trong vòng loop() sẽ thực hiện và chúng sẽ lặp đi lặp lại cho đến khi Arduino bị ngắt nguồn hoặc reset lại chương trình.
  • digitalWrite(denled,HIGH);  Hàm digitalWrite ghi giá trị mức “HIGH” hoặc mức “LOW” tương ứng với 5V hoặc 0V ra chân denled. 
  • delay(1000);  Hàm delay(): Tạm dừng chương trình trong khoảng thời gian chỉ định (được tính bằng mili giây). Trong bài viết này sử dụng 1000ms tương ứng với 1 giây.

 

  4. CHƯƠNG TRÌNH SÁNG DẦN TẮT DẦN 8 LED  

   Các linh kiện cần thiết

  • 8 đèn led đơn
  • 8 điện trở 1 kilo ohm

   Sơ đồ kết nối phần cứng

Điều khiển 8 led đơn sáng dần tắt dần

   Đoạn chương trình

void setup(){
 for (int i=5; i<=12; i++)
  pinMode(i, OUTPUT);
 for (int i=5; i<=12; i++)
  digitalWrite(i, LOW);
}

void loop(){
  //Sang dan 8 led
  for (int i=5; i<=12; i++) 
    {
     digitalWrite(i, HIGH);
     delay(500);
    }
  //Tat dan 8 led
   for (int i=12; i>=5; i--) 
   { 
      digitalWrite(i, LOW); 
      delay(500); 
   }
}

   Giải thích chương trình

   Chương trình con setup()

void setup() {}

  • Trong chương trình con này chủ yếu chúng ta sử dụng vòng lặp for để khai báo chức năng xuất dữ liệu cho các chân từ 5 đến 12. Trong sơ đồ mạch, các chân dương của led đơn, điều này có nghĩa là khi xuất tín hiệu HIGH thì đèn led sẽ sáng. Và ngược lại khi xuất dữ liệu LOW thì đèn led sẽ tắt.
  • Đoạn vòng lặp thứ 2 là đoạn vòng lặp xuất tín hiệu LOW ra các bóng đèn led từ 5 đến 12 để tắt toàn bộ led khi mới cấp điện cho arduino.

   Chương trình void loop()

   Vòng lặp for là một cấu trúc điều khiển lặp đi lặp lại cho phép thực hiện cùng 1 chức năng cho nhiều chân tín hiệu cùng lúc. Trong ví dụ đang thực hiện lệnh xuất tín hiệu HIGH cho lần lượt các chân từ 5 đến 12 và kèm theo hàm delay để cho các led sáng lần lượt. 

// Chuong trinh sang dan 8 led
for (int i=5; i<=12; i++) 
 { 
  digitalWrite(i, HIGH); 
  delay(500); 
 }

   Sau khi đã sáng dần hết 8 led, thì thực hiện chương trình tắt dần 8 led đơn theo chiều ngược lại. Do thực hiện ngược lại nên vòng lặp for bắt đầu với i=12 chạy ngược lại 5. Và các tín hiệu xuất dữ liệu ra các chân là mức LOW.

//Tat dan 8 led 
for (int i=12; i>=5; i--) 
 { 
  digitalWrite(i, LOW); 
  delay(500); 
}

 

  5.  CHƯƠNG TRÌNH ĐIỀU KHIỂN ĐÈN GIAO THÔNG  

     Tiếp tục trong chuyên đề led đơn trong arduino. Chúng ta nghiên cứu tiếp cách sử dụng Arduino Uno R3 và Led đơn để làm một ứng dụng đèn giao thông gồm đèn dành cho phương tiện xe và cho người đi bộ. Chương trình khởi động khi nút bấm được nhấn, sử dụng hàm delay để làm khoảng thời gian chờ. Để dễ theo dõi nội dung bài viết này, các bạn có thể xem lại bài viết về nút nhấn trong chuỗi bài học cơ bản của arduino.

   Các linh kiện cần thiết 

  • 2 bóng đèn led màu xanh
  • 2 bóng đèn led màu đỏ
  • 1 bóng đèn led màu vàng
  • 6 điện trở 1 kilo ohm
  • 1 nút nhấn

   Sơ đồ đấu nối mạch

Lập trình đèn giao thông trong arduino

Đoạn chương trình được viết như sau

int carRed = 12; 
int carYellow = 11;
int carGreen = 10;

int button = 9; 
int pedRed = 8; 
int pedGreen = 7;

int crossTime =5000; 
unsigned long changeTime;

void setup() {
  pinMode(carRed, OUTPUT);
  pinMode(carYellow, OUTPUT);
  pinMode(carGreen, OUTPUT);
  pinMode(pedRed, OUTPUT);
  pinMode(pedGreen, OUTPUT);
  pinMode(button, INPUT);
  digitalWrite(carGreen, HIGH); 
  digitalWrite(pedRed, HIGH);
}

void loop() {
  int state = digitalRead(button);
  if(state == HIGH && (millis() - changeTime)> 5000){
     changeLights();
  }
}

void changeLights() {
   digitalWrite(carGreen, LOW);
   digitalWrite(carYellow, HIGH); 
   delay(2000); 
   digitalWrite(carYellow, LOW); 
   digitalWrite(carRed, HIGH); 
   delay(1000); 
   digitalWrite(pedRed, LOW); 
   digitalWrite(pedGreen, HIGH); 
   delay(crossTime); 

   for (int x=0; x<10; x++) {
     digitalWrite(pedGreen, HIGH);
     delay(250);
     digitalWrite(pedGreen, LOW);
     delay(250);
     }

   digitalWrite(pedRed, HIGH);
   delay(500);
   digitalWrite(carRed, LOW);
   digitalWrite(carYellow, HIGH);          
   delay(1000);
   digitalWrite(carYellow, LOW); 
   digitalWrite(carGreen, HIGH);
   changeTime = millis();
}

Giải thích chương trình

Các dòng lệnh khai báo

  • int carRed = 12;   // Khai báo đèn đỏ cho xe
  • int carYellow = 11;  // Khai báo đèn vàng cho xe
  • int carGreen = 10;  // Khai báo đèn xanh cho xe
  • int button = 9; //khai báo nút nhấn
  • int pedRed = 8;  // Khai báo đèn đỏ cho người đi bộ
  • int pedGreen = 7;  // Khai báo đèn xanh cho người đi bộ
  • int crossTime =5000; //Khai báo thời gian cho người đi bộ
  • unsigned long changeTime;// Biến lưu giá trị thời gian tính từ lúc nhấn nút

Đoạn chương trình setup()

void setup() { 
pinMode(carRed, OUTPUT); 
pinMode(carYellow, OUTPUT); 
pinMode(carGreen, OUTPUT); 
pinMode(pedRed, OUTPUT); 
pinMode(pedGreen, OUTPUT); 
pinMode(button, INPUT); 

digitalWrite(carGreen, HIGH);   
digitalWrite(pedRed, HIGH); 
}

     Trong đoạn chương trình setup chủ yếu là dùng lệnh pinMode để định nghĩa chức năng xuất tín hiệu hay đọc tín hiệu. Còn 2 lệnh cuối dgitalWrite là khởi tạo trạng thái ban đầu cho đèn tín hiệu cho xe và cho người đi bộ. Trong đó, khi cấp điện thì đèn tín hiệu cho xe là đèn xanh, đèn tín hiệu cho người đi bộ là đèn đỏ.

Đoạn chương trình loop()

void loop() {
  int state = digitalRead(button);
  if(state == HIGH && (millis() - changeTime)> 5000){
     changeLights();
       }
}

     Biến state là biến lưu trạng thái của nút nhấn, mục đích của biến này để chương trình biết được có nhấn nút hay không. Do phần cứng nút nhấn thiết kế dạng tích cực mức cao. Do đó, nếu biến state là HIGH tương ứng với việc nút đang nhấn. Tuy nhiên để đảm bảo là nút nhấn và tránh trường hợp dội phím (nút bị nhấn nhiều lần), chúng ta thực hiện thêm kiểm tra nút phải được nhấn trong thời gian 5 giây. Biểu thức (millis() – changeTime)> 5000) chính là kiểm tra nút nhấn trong 5 giây.

     Như vậy, nếu nút nhấn đang được nhấn và kéo dài trong thời gian 5 giây thì nghĩa là xác nhận đã nhấn nút. Khi xác nhận xong nhấn nút thì chương trình thực hiện các lệnh trong chương trình con changeLights().

Đoạn chương trình con changeLights()

void changeLights() { 
  digitalWrite(carGreen, LOW); 
  digitalWrite(carYellow, HIGH);    
  delay(2000); 
  digitalWrite(carYellow, LOW); 
  digitalWrite(carRed, HIGH); 
  delay(1000); 
  digitalWrite(pedRed, LOW); 
  digitalWrite(pedGreen, HIGH); 
  delay(crossTime);
    
for (int x=0; x<10; x++) { 
  digitalWrite(pedGreen, HIGH); 
  delay(250); 
  digitalWrite(pedGreen, LOW); 
  delay(250); 
} 
  digitalWrite(pedRed, HIGH); 
  delay(500); 
  digitalWrite(carRed, LOW); 
  digitalWrite(carYellow, HIGH);           
  delay(1000); 
  digitalWrite(carYellow, LOW); 
  digitalWrite(carGreen, HIGH); 
  changeTime = millis(); 
}

    Đoạn chương trình đơn giản là chuyển từ đèn xanh – > vàng -> đỏ đối với đèn tín hiệu cho xe. Và trong thời gian đèn tín hiệu cho xe màu đỏ thì bật đèn xanh cho người đi bộ. Sau đó ngược lại, khi đèn tín hiệu xe bật xanh thì chương trình chuyển đèn đỏ không cho người đi bộ sang đường.

     TỔNG KẾT  

     Đối với việc lập trình cho arduino thì thường xuyên gặp vấn đề điều khiển led đơn. Đây là một trong những chương trình đơn giản và cơ bản nhất cho người học lập trình. Mặc dù là đơn giản và cơ bản, tuy nhiên người học cần phải tìm hiểu và nắm thật kỹ kiến thức. Từ những kiến thức nền này các bạn mới có thể phát triển lên những ứng dụng nâng cao hơ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 *