ค้นหาโค้ด

บทเรียน 14/31-5: ตัวอย่างการเขียนโค้ด Arduino map() 2

บทเรียน 14/31-5: ตัวอย่างการเขียนโค้ด Arduino map() 2

บทช่วยสอนนี้สาธิตวิธีการใช้ฟังก์ชัน map() ของ Arduino เพื่อควบคุมความสว่างของ LED โดยใช้ค่าเปอร์เซ็นต์ (0–100%) แทนช่วง 0–255 ดิบที่จำเป็นสำหรับ analogWrite() นี่เป็นเทคนิคพื้นฐานที่ช่วยให้โค้ดของคุณง่ายขึ้นและเข้าใจได้ง่ายขึ้นมาก เนื่องจากคุณสามารถคิดเป็นเปอร์เซ็นต์แทนที่จะเป็นค่าไบต์ตามอำเภอใจ

รถยนต์ Sunfounder ที่ประกอบเสร็จแล้ว

ทักษะนี้จำเป็นสำหรับโปรเจกต์ใดๆ ที่คุณต้องปรับขนาดค่าจากเซนเซอร์หรือสัญญาณควบคุม ตัวอย่างเช่น คุณสามารถใช้มันเพื่อ:

  • ควบคุมความสว่างของ LED หรือความเร็วของมอเตอร์ตามค่าที่อ่านได้จากโพเทนชิโอมิเตอร์
  • แปลงเอาต์พุตของเซนเซอร์อุณหภูมิ (เช่น 0–1023) เป็นช่วงเซลเซียสหรือฟาเรนไฮต์
  • แมปอินพุตแอนะล็อกจากจอยสติ๊กเพื่อควบคุมตำแหน่งของเซอร์โวมอเตอร์
  • สร้างอินเทอร์เฟซผู้ใช้ที่เรียบง่ายซึ่งใช้ค่าเปอร์เซ็นต์เพื่อตั้งระดับพลังงานของอุปกรณ์

เมื่อจบบทเรียนนี้ คุณจะสามารถเขียนโค้ดที่สะอาดขึ้น บำรุงรักษาง่ายขึ้น และอ่านหรือปรับแก้ได้ง่ายขึ้น

ฮาร์ดแวร์/อุปกรณ์

โปรเจกต์นี้ใช้อุปกรณ์จำนวนน้อยที่สุด ทำให้เหมาะสำหรับผู้เริ่มต้น คุณจะต้องมี:

  • บอร์ด Arduino (เช่น Uno)
  • LED หนึ่งดวง
  • ตัวต้านทาน 220 โอห์ม
  • สายจัมเปอร์
  • เบรดบอร์ด (ไม่จำเป็นแต่แนะนำ)

คู่มือการเดินสายไฟ

การเดินสายไฟสำหรับโปรเจกต์นี้ง่ายมาก ดังที่สาธิตในวิดีโอ (ในวิดีโอที่ 20:47) LED เชื่อมต่อกับพิน 3 ของ Arduino ผ่านตัวต้านทานจำกัดกระแส 220 โอห์ม

เชื่อมต่อขั้วแอโนด (ขาที่ยาวกว่า) ของ LED เข้ากับพิน 3 ผ่านตัวต้านทาน เชื่อมต่อขั้วแคโทด (ขาที่สั้นกว่า) ของ LED เข้ากับพินกราวด์ (GND) บน Arduino

คำอธิบายโค้ด

ตัวอย่างนี้เน้นที่ฟังก์ชันที่ผู้ใช้กำหนดซึ่งช่วยให้การควบคุมความสว่างของ LED ง่ายขึ้น โค้ดถูกสร้างขึ้นรอบฟังก์ชันที่กำหนดเองชื่อ pwmValue() ซึ่งเป็นกุญแจสำคัญที่ทำให้โค้ดเข้าใจง่าย

มาดูส่วนที่ปรับแต่งได้ของโค้ดกัน:

int LEDpin = 3; //กำหนดพินสำหรับ LED

บรรทัดนี้กำหนดพิน Arduino ที่เชื่อมต่อกับ LED คุณสามารถเปลี่ยนหมายเลข 3 เป็นพินอื่นที่รองรับ PWM บนบอร์ด Arduino ของคุณได้

แกนหลักของโปรเจกต์คือฟังก์ชันที่กำหนดเอง pwmValue() ฟังก์ชันนี้รับค่าเปอร์เซ็นต์เป็นอินพุตและแปลงเป็นช่วง 0–255 ที่ใช้โดย analogWrite() นี่คือจุดที่ฟังก์ชัน map() ทำงานมหัศจรรย์

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

หากต้องการใช้ฟังก์ชันนี้ คุณเพียงแค่เรียกใช้ด้วยค่าเปอร์เซ็นต์ความสว่างที่ต้องการ ฟังก์ชันจะส่งคืนค่าที่ถูกต้องสำหรับ analogWrite() ตัวอย่างเช่น pwmValue(60) จะส่งคืน 153 ซึ่งตรงกับ 60% ของ 255 ฟังก์ชันยังมีการตรวจสอบความปลอดภัยเพื่อให้แน่ใจว่าเปอร์เซ็นต์อินพุตอยู่ระหว่าง 0 ถึง 100 โดยส่งคืน 0 หากอยู่นอกช่วงนี้

ในฟังก์ชัน setup() คุณจะเห็นวิธีการใช้งาน:

int b=5;//ความสว่าง 60%
Serial.println( pwmValue(b)   );//พิมพ์บนซีเรียลมอนิเตอร์
analogWrite(LEDpin, pwmValue(b));// เปิด LED ด้วยความสว่าง 60%

ที่นี่ ตัวแปร b ถูกตั้งค่าเป็นเปอร์เซ็นต์ความสว่างที่คุณต้องการ จากนั้นฟังก์ชัน pwmValue(b) ถูกใช้ทั้งเพื่อพิมพ์ค่าที่แมปแล้วไปยังซีเรียลมอนิเตอร์และเพื่อตั้งความสว่างของ LED หากต้องการเปลี่ยนความสว่างของ LED คุณเพียงแค่แก้ไขค่าของ b ฟังก์ชัน map() จะจัดการการคำนวณที่จำเป็นทั้งหมดให้คุณ

โปรเจกต์สด/การสาธิต

ในวิดีโอ ผู้นำเสนอสาธิตโปรเจกต์โดยการเปลี่ยนค่าของตัวแปร b และอัปโหลดโค้ดไปยัง Arduino เมื่อตั้ง b เป็น 60 โค้ดจะแมปเป็น 153 และ LED จะสว่างที่ 60% การเปลี่ยน b เป็น 90 จะแมปเป็น 229 ทำให้ LED สว่างขึ้นอย่างเห็นได้ชัด การตั้งเป็น 100 จะแมปเป็น 255 ซึ่งเป็นความสว่างสูงสุด การสาธิตแสดงให้เห็นอย่างชัดเจนว่าฟังก์ชัน map() ช่วยให้คุณควบคุม LED โดยใช้ค่าเปอร์เซ็นต์ที่เข้าใจง่าย ในขณะที่ซีเรียลมอนิเตอร์ยืนยันค่า 0–255 ที่แน่นอนที่ส่งไปยังพิน (ในวิดีโอที่ 21:29)

โปรเจกต์ที่เกี่ยวข้องจากวิดีโอนี้

บทต่างๆ

  • [00:00] แนะนำฟังก์ชัน Millis และ map
  • [01:19] Millis คืออะไรและทำไมต้องใช้
  • [05:46] การใช้ Millis กับอีเวนต์เพื่อดำเนินการ
  • [08:35] ตัวอย่าง Millis ที่ 2 พร้อมปุ่มกด
  • [12:14] ตัวอย่าง Millis ที่ 3 การตรวจสอบการกดปุ่มสองครั้ง
  • [17:20] แนะนำฟังก์ชัน map()
  • [19:47] ตัวอย่างโค้ดการแมปเปอร์เซ็นต์เป็นความสว่าง LED
  • [20:47] การสาธิตสดของฟังก์ชัน map()
  • [22:41] การสร้างฟังก์ชันที่กำหนดเองเพื่อจัดการการแมป

ภาพ

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
920-Lesson 14/31-5: Arduino coding map() example 2
ภาษา: 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
 

สิ่งที่คุณอาจต้องการ

แหล่งข้อมูลและเอกสารอ้างอิง

ไฟล์📁

คู่มือผู้ใช้