analogRead (0) หรือ analogRead (A0)


14

รัฐอาร์ดิโนอ้างอิงที่คุณจะใช้รหัสต่อไปนี้เพื่ออ่านค่าจากอะนาล็อกพิน # 5:

int val1 = analogRead(5);

อย่างไรก็ตามในการอ่านจากพินดิจิตอล # 5 คุณจะส่งหมายเลขพินเดิมไปที่digitalRead:

int val2 = digitalRead(5);

คุณไม่ควรใช้analogRead(A5)แทนanalogRead(5)?

ถ้าไม่รหัสต่อไปนี้ทำอะไร:

int val3 = analogRead(A5);

คำตอบ:


28

หากต้องการตอบคำถามเฉพาะของ Tyilo:

analogRead(5)และdigitalRead(5)จะอ่านจากสองแห่ง อดีตจะอ่านจากช่องสัญญาณอะนาล็อก5หรือA5และหลังจะอ่านจากขา 5 ซึ่งเกิดขึ้นเป็นขาดิจิตอล ดังนั้นใช่ถ้าคุณต้องการที่จะอ่านขาอะนาล็อกกับคุณควรจะใช้digitalReadA5

ทำไม?

analogReadต้องใช้หมายเลขช่องสัญญาณภายใน แต่จะอนุญาตให้คุณระบุหมายเลข PIN ได้เช่นกัน หากคุณให้หมายเลขพินมันจะแปลงเป็นหมายเลขช่องที่สอดคล้องกัน เท่าที่ฉันสามารถบอกได้ว่าanalogReadเป็นฟังก์ชั่นเดียวที่ใช้หมายเลขช่องสัญญาณภายในเป็นฟังก์ชั่นเดียวที่อนุญาตหมายเลขช่องสัญญาณและเป็นฟังก์ชั่นเดียวที่มีการแปลง pin-to-channel ที่ไม่มีเอกสารนี้ เพื่อให้เข้าใจสิ่งนี้เรามาเริ่มด้วยตัวอย่าง

หากคุณต้องการใช้analogReadกับหมุดอะนาล็อกแรกA0คุณสามารถทำได้analogRead(0)โดยใช้หมายเลขช่องสัญญาณหรือanalogRead(A0)ใช้หมายเลขพิน หากคุณกำลังจะใช้ตัวแปรจำนวนขาanalogReadจะเปลี่ยนหมายเลข PIN กับจำนวนช่องทางที่เหมาะสมA00

หากคุณต้องการที่จะใช้digitalWriteในเข็มอนาล็อกเป็นครั้งแรกA0ที่คุณสามารถเพียงdigitalWrite(A0, x)ทำ digitalWriteไม่ใช้ช่องอนาล็อกภายในและไม่อนุญาตให้คุณส่งผ่านหมายเลขช่อง มันจะช่วยให้คุณ แต่คุณจะเลือกพินผิด เช่นเดียวกับและแม้กระทั่งdigitalReadanalogWrite

สิ่งที่เกี่ยวกับการแปลง pin-to-channel ทำโดยanalogRead? แหล่งที่มาของฟังก์ชั่นนั้นสามารถพบได้ในhardware/arduino/avr/cores/arduino/wiring_analog.cคุณจะเห็นว่ามันจะทำการลบง่าย ๆ ตามประเภทของบอร์ด A0/ A1/ A2/ ฯลฯ ค่าคงที่แสดงถึงหมายเลขพินของช่องอะนาล็อกและสามารถใช้ได้ทุกที่ที่คุณต้องการอ้างถึงอินพุตแบบอะนาล็อก ด้วยเหตุนี้จึงเป็นตัวเลือกที่ดีที่สุดที่จะใช้ในรหัส Arduino ของคุณเพราะเห็นได้ชัดว่าคุณกำลังใช้พอร์ตทางกายภาพเดียวกันแม้ว่าคุณจะใช้ฟังก์ชั่นที่แตกต่างกัน คำจำกัดความของค่าคงที่เหล่านั้นขึ้นอยู่กับบอร์ดของคุณ

ตัวอย่างเช่นนี่คือรหัสนิยามขาอะนาล็อกสำหรับ Arduino Uno hardware/arduino/avr/variants/standard/pins_arduino.h

static const uint8_t A0 = 14;
static const uint8_t A1 = 15;
static const uint8_t A2 = 16;
static const uint8_t A3 = 17;
static const uint8_t A4 = 18;
static const uint8_t A5 = 19;
static const uint8_t A6 = 20;
static const uint8_t A7 = 21;

สำหรับการเปรียบเทียบที่นี่คือรหัสนิยามขาอะนาล็อกสำหรับ Arduino Mega:

static const uint8_t A0 = 54;
static const uint8_t A1 = 55;
static const uint8_t A2 = 56;
[...]
static const uint8_t A13 = 67;
static const uint8_t A14 = 68;
static const uint8_t A15 = 69;

การอภิปราย EE เพิ่มเติมเกี่ยวกับหมุดอะนาล็อก: ฉันสามารถใช้หมุดอะนาล็อกบน Arduino สำหรับโครงการของฉันเป็นดิจิตอลได้หรือไม่?


1
ฉันว่ามันเหมือนที่คุณอธิบายฉันแค่สับสนกับการอ้างอิง Arduino ซึ่งมีข้อมูลเท็จ
Tyilo

1
นอกจากนี้คุณสามารถเพียงทำanalogReadขาแบบอะนาล็อก! ในทางกลับกันanalogWriteสามารถใช้กับทั้งอะนาล็อกและหมุด PWM
Tyilo

1
@Tyilo ฉันอัปเดตการตอบกลับของฉันด้วยข้อมูลที่ถูกต้องมากขึ้นจากซอร์สโค้ด
Kevin Mark

3
analogWrite () สามารถเรียกใช้กับพินใดก็ได้ แต่จะทำอะไรบางอย่างบนพิน PWM เท่านั้น สำหรับพินที่ไม่ใช่ PWM และพินอะนาล็อกทั้งหมดนั้นจะเรียก digitalWrite ()
baldengineer

3
@powtac - เป็นที่ยอมรับกันโดยทั่วไปว่าเอกสาร Arduino เป็นสิ่งที่น่ารังเกียจอย่างน้อยในบริเวณนี้ อย่ารู้สึกว่าคุณขาดอะไรบางอย่างไม่ใช่คุณมันคือคนที่เป็นอาร์ดิโน
Connor Wolf

3

ฉันใช้เวลาหลายชั่วโมงกับสิ่งนี้ ฉันคิดว่าฉันมีปัญหาฮาร์ดแวร์ ปรากฎว่าฉันโทรanalogRead()ไม่ถูกต้อง

ไม่ถูกต้อง (โค้ดตัวอย่างที่ผิดพลาดจากDFRobot 😣):

val = analogRead(0); //connect sensor to Analog 0

แก้ไข:

val = analogRead(A0); //connect sensor to Analog 0

อัปเดต : analogRead()รับหมายเลขพินของ GPIO A0ฯลฯ # กำหนดหมายเลขพิน Arduino A0 == 36ที่

ระวัง: เปิดเช่น FireBeetle ESP32 พินที่ชื่อว่า "IO36 / A0" (GPIO36) เท่ากับ Arduino A0แต่ "IO39 / A1" (GPIO39) เท่ากับ Arduino A3(ไม่ใช่A1), "IO34 / A2" (GPIO34) เท่ากับ Arduino A6(ไม่A2) ฯลฯ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.