ค้นหาโค้ด

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

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

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

เทคนิคนี้จำเป็นสำหรับการใช้งานจริงหลายอย่างที่คุณต้องแปลงค่าจากเซนเซอร์หรืออินพุตของผู้ใช้ให้เป็นช่วงค่าที่แตกต่างกัน ตัวอย่างเช่น คุณสามารถใช้มันเพื่อ:

  • ควบคุมความเร็วของมอเตอร์ DC ตามค่าจากโพเทนชิโอมิเตอร์
  • แสดงค่าดิบจากเซนเซอร์อุณหภูมิบนสเกล 0-100%
  • แปลงพิกัดจอยสติ๊กเป็นมุมของเซอร์โวมอเตอร์
  • ปรับความสว่างของ LED ตามเซนเซอร์วัดแสงโดยรอบ
  • แปลงค่าการอ่านแบบแอนะล็อก 0-5V เป็นค่าดิจิทัล 0-1023 หรือในทางกลับกัน

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

เพื่อทำตามโปรเจกต์นี้ คุณจะต้องมีอุปกรณ์ดังต่อไปนี้:

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

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

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

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

โค้ดสำหรับตัวอย่างนี้สั้นมาก โดยตรรกะหลักอยู่ในฟังก์ชัน setup() มาดูส่วนที่ผู้ใช้สามารถกำหนดค่าได้ทีละส่วน

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

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

int b=8;//ความสว่าง 60%

นี่คือตัวแปรสำคัญที่คุณจะแก้ไขเพื่อทดสอบระดับความสว่างที่แตกต่างกัน มันแสดงถึงความสว่างที่ต้องการเป็นเปอร์เซ็นต์ ความคิดเห็นในโค้ดระบุว่า "60%" แต่ค่าถูกตั้งเป็น 8 เพื่อการสาธิตในวิดีโอ คุณสามารถเปลี่ยนเป็นจำนวนเต็มใดก็ได้ระหว่าง 0 ถึง 100 ตัวอย่างเช่น การตั้งค่า b = 60 จะหมายถึงระดับความสว่าง 60%

int brightness = map(b, 0, 100, 0,255);

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

analogWrite(LEDpin, brightness);// เปิด LED ด้วยความสว่าง 60%

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

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

ในวิดีโอ ผู้สอนอัปโหลดโค้ดและสาธิตผลของการเปลี่ยนตัวแปร b เมื่อตั้งค่า b เป็น 8 จอภาพอนุกรมจะพิมพ์ค่าที่แปลงแล้วคือ 20 และ LED จะสลัวอย่างเห็นได้ชัด การเปลี่ยน b เป็น 90 จะให้ค่าที่แปลงแล้วเป็น 229 ทำให้ LED สว่างขึ้นมาก การตั้งค่า b เป็น 100 จะแปลงเป็น 255 ซึ่งเป็นความสว่างเต็มที่ การสาธิตเชิงปฏิบัตินี้แสดงให้เห็นชัดเจนว่าฟังก์ชัน map() ช่วยลดความซับซ้อนของกระบวนการควบคุมเอาต์พุตแอนะล็อกด้วยค่าเปอร์เซ็นต์ที่ใช้งานง่าย

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

บทตอน

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

ภาพ

Sunfounder car assembled
Sunfounder car assembled
919-Lesson 14/31-4: Arduino coding map() example 1
ภาษา: C++
/*
Lesson 14/31: Arduino coding map( ) example-1
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);//initialize serial monitor with 9600 baud
    pinMode(LEDpin, OUTPUT);//set pin as output
    int b=8;//60% brightness
    int brightness = map(b, 0, 100, 0,255);
    Serial.println(brightness);//print it on serial monitor
    analogWrite(LEDpin, brightness);// turn the LED on with 60% brightness   
 }

 void loop() {

 
 }
 

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

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

ไฟล์📁

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