analogRead (0) atau analogRead (A0)

14

Referensi arduino menyatakan bahwa Anda akan menggunakan kode berikut untuk membaca nilai dari pin analog # 5:

int val1 = analogRead(5);

Namun untuk membaca dari pin digital # 5, Anda akan memberikan nomor pin yang sama ke digitalRead:

int val2 = digitalRead(5);

Bukankah seharusnya Anda menggunakan analogRead(A5)bukan analogRead(5)?

Jika tidak, apa yang dilakukan kode berikut:

int val3 = analogRead(A5);
Tyilo
sumber

Jawaban:

28

Untuk menjawab pertanyaan spesifik Tyilo:

analogRead(5)dan digitalRead(5)akan membaca dari dua tempat yang berbeda. Yang pertama akan membaca dari saluran analog 5atau A5dan yang terakhir akan membaca dari pin 5 yang kebetulan merupakan pin digital. Jadi ya, jika Anda ingin membaca pin analog dengan digitalReadAnda harus menggunakan A5.

Mengapa?

analogReadmembutuhkan nomor saluran secara internal tetapi itu akan memungkinkan Anda untuk memberikan nomor pin juga. Jika Anda memberikan nomor pin, itu akan mengubahnya menjadi nomor saluran yang sesuai. Sejauh yang saya tahu analogReadadalah satu-satunya fungsi yang menggunakan nomor saluran secara internal, adalah satu-satunya yang mengizinkan nomor saluran, dan merupakan satu-satunya fungsi dengan konversi pin-to-channel yang tidak berdokumen ini. Untuk memahami ini, mari kita mulai dengan beberapa contoh.

Jika Anda ingin menggunakan analogReadpin analog pertama, A0Anda dapat melakukan analogRead(0)yang menggunakan nomor saluran atau analogRead(A0)yang menggunakan nomor pin. Jika Anda menggunakan varian nomor pin, analogReadakan mengonversi nomor pin A0ke nomor saluran yang tepat 0.

Jika Anda ingin menggunakan digitalWritepin analog pertama, A0Anda hanya bisa melakukannya digitalWrite(A0, x). digitalWritetidak menggunakan saluran analog secara internal dan tidak membiarkan Anda memberikan nomor saluran. Yah, itu akan membiarkan Anda tetapi Anda akan memilih pin yang salah. Hal yang sama berlaku untuk digitalReaddan bahkan analogWrite.

Bagaimana dengan konversi pin-to-channel yang dilakukan oleh analogRead? Sumber untuk fungsi itu dapat ditemukan di hardware/arduino/avr/cores/arduino/wiring_analog.cAnda akan melihat bahwa ia melakukan pengurangan sederhana berdasarkan pada tipe papan. The A0/ A1/ A2/ etc. konstanta mewakili nomor pin saluran analog dan dapat digunakan di mana pun Anda perlu merujuk ke input analog. Karena alasan itu mereka adalah opsi terbaik untuk digunakan dalam kode Arduino Anda karena sangat jelas bahwa Anda menggunakan port fisik yang sama bahkan ketika Anda menggunakan fungsi yang berbeda. Definisi konstanta-konstanta itu bergantung pada papan Anda.

Misalnya, inilah kode definisi pin analog untuk Arduino Uno di 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;

Untuk perbandingan di sini adalah kode definisi pin analog untuk 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;

Diskusi EE lebih lanjut tentang pin analog: Dapatkah saya menggunakan pin analog pada Arduino untuk proyek saya sebagai digital?

Kevin Mark
sumber
1
Saya pikir itu persis seperti yang Anda jelaskan, saya baru saja bingung dengan referensi Arduino, yang berisi informasi palsu.
Tyilo
1
Anda juga hanya dapat melakukannya analogReadpada pin analog! Di sisi lain, analogWritedapat digunakan pada pin analog dan PWM.
Tyilo
1
@ Tyilo Saya memperbarui respons saya dengan beberapa informasi yang lebih akurat yang diambil dari kode sumber.
Kevin Mark
3
analogWrite () dapat dipanggil pada sembarang pin, tetapi ia hanya melakukan sesuatu pada pin PWM. Pada pin ditial non-PWM dan semua pin analog, itu hanya memanggil digitalWrite ().
baldengineer
3
@ Powowac - Sudah umum diterima bahwa dokumentasi Arduino cukup keji, setidaknya di sekitar sini. Jangan merasa seperti Anda kehilangan sesuatu, itu bukan Anda, itu orang Arduino.
Connor Wolf
3

Saya menghabiskan waktu berjam-jam untuk ini. Saya pikir saya punya masalah perangkat keras. Ternyata saya analogRead()salah menelepon .

Salah (kode sampel salah dari DFRobot 😣):

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

Benar:

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

Pembaruan : analogRead()mengambil nomor pin GPIO. A0dll. adalah #defines untuk nomor pin Arduino, di mana A0 == 36.

Hati-hati: pada mis. FireBeetle ESP32, pin berlabel "IO36 / A0" (GPIO36) sama dengan Arduino A0, tetapi "IO39 / A1" (GPIO39) sama dengan Arduino A3(tidak A1), "IO34 / A2" (GPIO34) sama dengan Arduino A6(tidak A2) , dll.

jrc
sumber