analogRead (0) hoặc analogRead (A0)


14

Tham chiếu arduino nói rằng bạn sẽ sử dụng đoạn mã sau để đọc giá trị từ chân tương tự # 5:

int val1 = analogRead(5);

Tuy nhiên, để đọc từ chân số 5, bạn sẽ chuyển cùng số pin cho digitalRead:

int val2 = digitalRead(5);

Bạn không nên sử dụng analogRead(A5)thay vì analogRead(5)?

Nếu không, đoạn mã sau sẽ làm gì:

int val3 = analogRead(A5);

Câu trả lời:


28

Để trả lời các câu hỏi cụ thể của Tyilo:

analogRead(5)digitalRead(5)sẽ đọc từ hai nơi khác nhau. Các cựu sẽ đọc từ kênh analog 5hay A5và sau này sẽ đọc từ pin 5 mà xảy ra được một pin kỹ thuật số. Vì vậy, có, nếu bạn muốn đọc một pin tương tự với digitalReadbạn nên sử dụng A5.

Tại sao?

analogReadyêu cầu số kênh trong nội bộ nhưng nó cũng cho phép bạn cung cấp cho nó số pin. Nếu bạn cung cấp cho nó một số pin, nó sẽ chuyển đổi nó thành số kênh tương ứng. Theo như tôi có thể nói analogReadlà chức năng duy nhất sử dụng số kênh bên trong, là chức năng duy nhất cho phép số kênh và là chức năng duy nhất có chuyển đổi pin-to-kênh không có giấy tờ này. Để hiểu điều này, hãy bắt đầu với một số ví dụ.

Nếu bạn muốn sử dụng analogReadtrên chân analog đầu tiên, A0bạn có thể analogRead(0)sử dụng số kênh hoặc analogRead(A0)sử dụng số pin. Nếu bạn sử dụng biến thể số pin, analogReadsẽ chuyển đổi số pin thành số A0kênh thích hợp 0.

Nếu bạn muốn sử dụng digitalWritetrên pin analog đầu tiên, A0bạn chỉ có thể làm digitalWrite(A0, x). digitalWritekhông sử dụng các kênh tương tự trong nội bộ và không cho phép bạn chuyển số kênh đó. Vâng, nó sẽ cho phép bạn nhưng bạn sẽ chọn sai mã pin. Điều tương tự áp dụng cho digitalReadvà thậm chí analogWrite.

Điều gì về các chuyển đổi pin-to-channel được thực hiện bởi analogRead? Nguồn cho chức năng đó có thể được tìm thấy trong hardware/arduino/avr/cores/arduino/wiring_analog.cBạn sẽ thấy rằng nó thực hiện một số phép trừ đơn giản dựa trên loại bảng. Các A0/ A1/ A2/ etc. hằng số đại diện cho số pin của các kênh tương tự và có thể được sử dụng ở mọi nơi bạn cần để tham khảo các đầu vào tương tự. Vì lý do đó, chúng là lựa chọn tốt nhất để sử dụng trong mã Arduino của bạn bởi vì rất rõ ràng rằng bạn đang sử dụng cùng một cổng vật lý ngay cả khi bạn đang sử dụng các chức năng khác nhau. Các định nghĩa của các hằng số phụ thuộc vào bảng của bạn.

Ví dụ: đây là mã định nghĩa pin tương tự cho Arduino Uno trong 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;

Đối với comparaison ở đây là mã định nghĩa pin tương tự cho 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;

Thảo luận thêm về các chân tương tự: Tôi có thể sử dụng các chân tương tự trên Arduino cho dự án của mình dưới dạng kỹ thuật số không?


1
Mặc dù nó giống hệt như bạn đã giải thích, tôi chỉ bị nhầm lẫn bởi tài liệu tham khảo Arduino, có chứa thông tin sai lệch.
Tyilo

1
Ngoài ra, bạn chỉ có thể làm analogReadtrên chân analog! Mặt khác, analogWritecó thể được sử dụng trên cả chân analog và chân PWM.
Tyilo

1
@Tyilo Tôi đã cập nhật phản hồi của mình với một số thông tin chính xác hơn được lấy từ mã nguồn.
Kevin Mark

3
analogWrite () có thể được gọi trên bất kỳ chân nào, nhưng nó chỉ làm một cái gì đó trên các chân PWM. Trên các chân ditial không phải là PWM và tất cả các chân analog, nó chỉ đơn giản gọi là digitalWrite ().
baldengineer

3
@powtac - Thông thường người ta chấp nhận rằng tài liệu arduino khá gớm ghiếc, ít nhất là quanh đây. Đừng cảm thấy như bạn đang thiếu thứ gì đó, không phải bạn, đó là người arduino.
Sói Connor

3

Tôi đã dành hàng giờ cho việc này. Tôi nghĩ rằng tôi có một vấn đề phần cứng. Hóa ra tôi đã gọi analogRead()không chính xác.

Không chính xác (mã mẫu có sai sót từ DFRobot 😣):

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

Chính xác:

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

Cập nhật : analogRead()lấy số pin GPIO. A0v.v ... là #defines cho số pin Arduino, ở đâu A0 == 36.

Hãy cẩn thận: trên ví dụ như FireBeetle ESP32, pin có nhãn "IO36 / A0" (GPIO36) bằng Arduino A0, nhưng "IO39 / A1" (GPIO39) bằng Arduino A3(không A1), "IO34 / A2" (GPIO34) bằng Arduino A6(không A2) , Vân vân.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.