Tìm kiếm mã

Bài học 14/31-5: Ví dụ 2 về hàm map() trong lập trình Arduino

Bài học 14/31-5: Ví dụ 2 về hàm map() trong lập trình Arduino

Hướng dẫn này trình bày cách sử dụng hàm map() của Arduino để điều khiển độ sáng của đèn LED bằng giá trị phần trăm (0–100%) thay vì dải 0–255 thô được yêu cầu bởi analogWrite(). Đây là một kỹ thuật cơ bản giúp đơn giản hóa mã của bạn và làm cho nó trực quan hơn nhiều, vì bạn có thể suy nghĩ theo phần trăm thay vì các giá trị byte tùy ý.

Xe Sunfounder đã lắp ráp

Kỹ năng này rất cần thiết cho bất kỳ dự án nào mà bạn cần chia tỷ lệ số đọc cảm biến hoặc tín hiệu điều khiển. Ví dụ: bạn có thể sử dụng nó để:

  • Điều khiển độ sáng của đèn LED hoặc tốc độ của động cơ dựa trên số đọc của chiết áp.
  • Chuyển đổi đầu ra của cảm biến nhiệt độ (ví dụ: 0–1023) sang dải độ C hoặc độ F.
  • Ánh xạ đầu vào analog của cần điều khiển để điều khiển vị trí của động cơ servo.
  • Tạo giao diện người dùng đơn giản trong đó giá trị phần trăm được sử dụng để đặt mức công suất của thiết bị.

Đến cuối bài học này, bạn sẽ có thể viết mã sạch hơn, dễ bảo trì hơn, dễ đọc và dễ điều chỉnh hơn.

Phần cứng/Linh kiện

Dự án này sử dụng một bộ linh kiện tối thiểu, rất phù hợp cho người mới bắt đầu. Bạn sẽ cần:

  • Một bo mạch Arduino (ví dụ: Uno).
  • Một đèn LED.
  • Một điện trở 220 ohm.
  • Dây jumper.
  • Một breadboard (tùy chọn nhưng được khuyến nghị).

Hướng dẫn đấu dây

Việc đấu dây cho dự án này rất đơn giản, như được trình bày trong video (trong video ở phút 20:47). Đèn LED được kết nối với chân 3 của Arduino thông qua điện trở giới hạn dòng 220 ohm.

Kết nối cực dương (chân dài hơn) của đèn LED với chân 3 thông qua điện trở. Kết nối cực âm (chân ngắn hơn) của đèn LED với chân nối đất (GND) trên Arduino.

Giải thích mã

Ví dụ này tập trung vào một hàm do người dùng định nghĩa giúp đơn giản hóa việc điều khiển độ sáng của đèn LED. Mã được xây dựng xung quanh một hàm tùy chỉnh có tên là pwmValue(), đây là chìa khóa để làm cho mã trở nên trực quan.

Hãy phân tích các phần có thể cấu hình của mã:

int LEDpin = 3; //định nghĩa chân cho LED

Dòng này định nghĩa chân Arduino mà đèn LED được kết nối. Bạn có thể thay đổi số 3 thành bất kỳ chân nào khác hỗ trợ PWM trên bo mạch Arduino của bạn.

Phần cốt lõi của dự án là hàm tùy chỉnh pwmValue(). Hàm này nhận giá trị phần trăm làm đầu vào và chuyển đổi nó sang dải 0–255 được sử dụng bởi analogWrite(). Đây là nơi hàm map() thực hiện phép thuật của nó.

int pwmValue(int percent)
{
  if(percent >=0 && percent <=100)
  {
    return map(percent, 0,100,  0,255);
  }else
  {
    return 0;
  }
}

Để sử dụng hàm này, bạn chỉ cần gọi nó với phần trăm độ sáng mong muốn của mình. Hàm sẽ trả về giá trị chính xác cho analogWrite(). Ví dụ: pwmValue(60) sẽ trả về 153, tương ứng với 60% của 255. Hàm cũng bao gồm kiểm tra an toàn để đảm bảo phần trăm đầu vào nằm trong khoảng từ 0 đến 100, trả về 0 nếu nằm ngoài phạm vi này.

Trong hàm setup(), bạn có thể thấy cách sử dụng này:

int b=5;//độ sáng 60%
Serial.println( pwmValue(b)   );//in nó trên màn hình nối tiếp
analogWrite(LEDpin, pwmValue(b));// bật đèn LED với độ sáng 60%

Ở đây, biến b được đặt thành phần trăm độ sáng mong muốn của bạn. Hàm pwmValue(b) sau đó được sử dụng để in giá trị được ánh xạ ra Màn hình nối tiếp và để đặt độ sáng của đèn LED. Để thay đổi độ sáng của đèn LED, bạn chỉ cần sửa đổi giá trị của b. Hàm map() xử lý tất cả các phép tính cần thiết cho bạn.

Dự án/Demo trực tiếp

Trong video, người thuyết trình trình bày dự án bằng cách thay đổi giá trị của biến b và tải mã lên Arduino. Khi b được đặt thành 60, mã ánh xạ nó thành 153 và đèn LED sáng ở mức 60% độ sáng. Thay đổi b thành 90 ánh xạ thành 229, làm cho đèn LED sáng hơn đáng kể. Đặt nó thành 100 ánh xạ thành 255, đây là độ sáng tối đa. Màn trình diễn cho thấy rõ ràng cách hàm map() cho phép bạn điều khiển đèn LED bằng giá trị phần trăm trực quan, trong khi Màn hình nối tiếp xác nhận giá trị 0–255 chính xác đang được gửi đến chân (trong video ở phút 21:29).

Các dự án liên quan từ video này

Các chương

  • [00:00] Giới thiệu về hàm Millis và map
  • [01:19] Millis là gì và tại sao sử dụng nó
  • [05:46] Sử dụng Millis với một sự kiện để thực hiện hành động
  • [08:35] Ví dụ 2 về Millis với nút nhấn
  • [12:14] Ví dụ 3 về Millis kiểm tra hai lần nhấn nút
  • [17:20] Giới thiệu về hàm map()
  • [19:47] Ví dụ mã ánh xạ phần trăm sang độ sáng LED
  • [20:47] Trình diễn trực tiếp hàm map()
  • [22:41] Tạo hàm tùy chỉnh để xử lý ánh xạ

Hình ảnh

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
920-Lesson 14/31-5: Arduino coding map() example 2
Ngôn ngữ: C++
/*
Lesson 14/31-5: Arduino coding map( ) example-2
Get this code and watch video Download and resource page https://robojax.com/RJT597
YouTube video https://www.youtube.com/watch?v=lqgzQohNiIM
 
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
int LEDpin = 3; //defind pin for LED
                   
 
 void setup() {
    Serial.begin(9600);//initialzie serial monitor with 9600 baud
    pinMode(LEDpin, OUTPUT);//set pin as output
    int b=5;//60% brightness

    Serial.println( pwmValue(b)   );//print it on serial monitor
    analogWrite(LEDpin, pwmValue(b));// turn the LED on with 60% brightness   
 }

 void loop() {

 
 }

/*
 * pwmValue(int percent)
 * @param precent is value between 0 to 100
 * @return it returns the mapped value from 0 to 255
 * written by Ahmad Shamshiri on Dec 9, 2022
 * 
 */
 int pwmValue(int percent)
 {
  if(percent >=0 && percent <=100)
  {
    return map(percent, 0,100,  0,255);
  }else
  {
    return 0;
  }
 } //pwmValue end
 

Tài nguyên & tài liệu tham khảo

Tập tin📁

Hướng dẫn Sử dụng