Bài 1: Điều chỉnh độ sáng của LED qua giao tiếp Serial

Xin chào, bài đăng của mình sẽ liên quan đến 2 chủ để mà admin đã đề cập đến, đó là: xung PWM và giao tiếp Serial.

Nội dung

  • Đọc dữ liệu nhập từ bàn phím.
  • Kết hợp sử dụng PWM và giao tiếp Serial để điều khiển LED.

Phần cứng

  • Arduino UNO.
  • Breadboard + dây dẫn.
  • 1 đèn LED (loại bất kì).
  • 1 điện trở 220 ohm (từ 100ohm đến 2.7k ohm).

Lắp mạch

Lập trình

byte brightness = 0;   //độ sáng- [0%->100%]
const int LED = 11;    // chân 11 hỗ trợ phát xung PWM
void setup()
{
  Serial.begin(9600);  // mở cổng Serial ở baudrate 9600
}

void loop()
{
  Serial.println("enter brightness %");
  //kiểm tra xem có dữ liệu được truyền qua cổng serial hay không
  while(Serial.available()==0)
  {
    // không làm gì cả
  }
  while(Serial.available()>0)
  {
    char ch = Serial.read();
    // chỉ nhận giá trị từ '0' đến '9'
    if(ch >= '0' && ch <='9')
    {
    //chuyển từ ASCII sang số thập phân
    brightness = brightness*10 + ch - '0';
    delay(5);//chờ tín hiệu tiếp theo được truyền qua cổng serial
             //KHÔNG THỂ THIẾU. Hãy thử bỏ dòng này bạn sẽ thấy điều khác biệt!
    }
    else 
    {
    Serial.print(ch);
    Serial.println(":not valid");
    brightness = 0;
    }
  }
  // chặn giá trị brightness trong khoảng [0,100]
  brightness = constrain(brightness,0,100);
  // in ra giá trị brightness
  Serial.print("brightness = ");
  Serial.println(brightness);
  // chuyển đổi từ giá trị brightness sang PWM
  byte value = map(brightness,0,100,0,255);
  // bật LED với giá trị xung PWM (duty cycle) nhận được
  analogWrite(LED,value);
  // reset biến brightness về giá trị 0 
  //để tiếp tục tính toán
  brightness = 0;
}

Giải thích

Khi giao tiếp qua Serial, ta có thể dùng Serial.print() và Serial.write() để gửi dữ liệu; dùng Serial.read() để đọc dữ liệu từ cổng Serial. Tuy nhiên, có 1 số điểm sau các bạn cần lưu ý:

+ Kí tự nhập từ bàn phím mang giá trị theo bảng mã ASCII. VD: 'A' = 65; '0' = 48',.....

+ Serial Monitor (bấm Ctrol + Shift + M để mở) yêu cầu dạng mã ASCII để hiển thị, và những gì bạn thấy trong cửa sổ Serial thực ra đã được dịch sang mã ASCII.

+ Serial.print() : ghi nội dung ra cổng Serial theo dạng mã ASCII mà con người có thể hiểu được. VD: Serial.print(48);==> "48"; Serial.print("ARDUINO");===> "ARDUINO"....

+ Serial.write(): ghi nội dung ra cổng Serial theo dạng byte. VD: Serial.write(48);===> '0' (vì số 48 sẽ được gửi trực tiếp qua cổng Serial, sau đó hệ thống sẽ dịch số 48 thành số '0' theo bảng mã ASCII).

+ Serial.read(): đọc dữ liệu từ cổng Serial, mỗi lần đọc 1 byte. Mỗi kí tự trên bàn phím sẽ ứng với 1 giá trị trong bảng mã ASCII (cũng là 1 byte). Nếu ta nhập số 12 từ keyboard thì cổng Serial sẽ nhận giá trị 49 (ASCII ) trước (ứng với số 1) rồi đến giá trị 50 (ứng với số 2), do đó, số 12 ta nhập trên bàn phím sẽ chuyển thành số 49 và số 50.

Để hiểu rõ hơn, các bạn đọc tại đây.

if(ch >= '0' && ch <='9')
    {
    //chuyển từ ASCII sang số thập phân
    brightness = brightness*10 + ch - '0';
    delay(5);//chờ tín hiệu tiếp theo được truyền qua cổng serial
             //KHÔNG THỂ THIẾU
    }

==> brightness = brightness*10 + ch - '0'; dùng để chuyển mã ASCII từ bàn phím thành dạng số có thể tính toán.

Kết luận

Hy vọng bài viết sẽ giúp các bạn hiểu rõ hơn về giao tiếp giữa mạch Arduino và máy tính.

Do kiến thức giới hạn, nếu có sai sót nào trong bài viết, mong các bạn giúp mình sửa lỗi.

 

lên
9 thành viên đã đánh giá bài viết này hữu ích.
Từ khóa: 
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Giao tiếp I2C và sử dụng module Realtime clock DS1307 (module RTC)

Xin chào các bạn, bài viết này của mình sẽ giới thiệu về giao tiếp I2C trên Arduino và sử dụng module Realtime clock DS1307.

  • Giới thiệu về chuẩn giao tiếp I2C.
  • Giao tiếp I2C trên Arduino.
  • Cách sử dụng module Realtime Clock DS1307.
lên
37 thành viên đã đánh giá bài viết này hữu ích.

Timer/Counter trên AVR/Arduino

Như các bạn đã biết, Arduino là một nền tảng hướng tới sự đơn giản, giúp cho việc hiện thực hóa các ý tưởng dễ dàng hơn rất nhiều, nhưng cũng vì thế mà chúng ta sẽ không thể khai thác hết được sức mạnh của vi điều khiển nằm trên board Arduino. Điều mà mình cảm thấy tiếc nhất là sự thiếu sót của các Interrupt Vector trong môi trường Arduino (Arduino hiện chỉ có built-in function hỗ trợ External Interrupts).

lên
32 thành viên đã đánh giá bài viết này hữu ích.