Untuk menjawab pertanyaan spesifik Tyilo:
analogRead(5)
dan digitalRead(5)
akan membaca dari dua tempat yang berbeda. Yang pertama akan membaca dari saluran analog 5
atau A5
dan yang terakhir akan membaca dari pin 5 yang kebetulan merupakan pin digital. Jadi ya, jika Anda ingin membaca pin analog dengan digitalRead
Anda harus menggunakan A5
.
Mengapa?
analogRead
membutuhkan 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 analogRead
adalah 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 analogRead
pin analog pertama, A0
Anda dapat melakukan analogRead(0)
yang menggunakan nomor saluran atau analogRead(A0)
yang menggunakan nomor pin. Jika Anda menggunakan varian nomor pin, analogRead
akan mengonversi nomor pin A0
ke nomor saluran yang tepat 0
.
Jika Anda ingin menggunakan digitalWrite
pin analog pertama, A0
Anda hanya bisa melakukannya digitalWrite(A0, x)
. digitalWrite
tidak 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 digitalRead
dan 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.c
Anda 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?
analogRead
pada pin analog! Di sisi lain,analogWrite
dapat digunakan pada pin analog dan PWM.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 😣):
Benar:
Pembaruan :
analogRead()
mengambil nomor pin GPIO.A0
dll. adalah #defines untuk nomor pin Arduino, di manaA0 == 36
.Hati-hati: pada mis. FireBeetle ESP32, pin berlabel "IO36 / A0" (GPIO36) sama dengan Arduino
A0
, tetapi "IO39 / A1" (GPIO39) sama dengan ArduinoA3
(tidakA1
), "IO34 / A2" (GPIO34) sama dengan ArduinoA6
(tidakA2
) , dll.sumber