analogOkuma (0) veya analogOkuma (A0)


14

Arduino referansı , 5 numaralı analog pinten değeri okumak için aşağıdaki kodu kullanacağınızı belirtir :

int val1 = analogRead(5);

Ancak dijital pin # 5'ten okumak için, aynı pin numarasını şu numaraya iletirsiniz digitalRead:

int val2 = digitalRead(5);

Bunun analogRead(A5)yerine kullanmamalısın analogRead(5)?

Değilse, aşağıdaki kod ne işe yarar:

int val3 = analogRead(A5);

Yanıtlar:


28

Tyilo'nun özel sorularını cevaplamak için:

analogRead(5)ve digitalRead(5)iki farklı yerden okuyacak. Eski bir analog kanal okuyacak 5ya A5ve ikinci pim 5 okuyacak durumda bir dijital pim olması. Yani evet, sizinle analog bir pin okumak digitalReadistiyorsanız kullanmalısınız A5.

Neden?

analogReaddahili olarak bir kanal numarası gerektirir ancak bu numaraya bir pin numarası vermenize de olanak tanır. Bir pin numarası verirseniz, karşılık gelen kanal numarasına dönüştürür. Anlayabildiğim kadarıyla analogRead, bir kanal numarasını dahili olarak kullanan tek işlevdir, bir kanal numarasına izin veren tek işlevdir ve bu belgesiz pin-kanal dönüşümü ile tek işlevdir. Bunu anlamak için bazı örneklerle başlayalım.

Kullanmak isterseniz analogReadilk analog pim üzerine A0yapabileceğiniz analogRead(0)kanal numarasını kullanan veya analogRead(A0)pin numarası kullanır. Eğer pin numarası varyantını kullanacak olursak, analogReadpin numarası dönüştürmek istiyorum A0onun uygun kanal numarasına 0.

Kullanmak isterseniz digitalWriteilk analog pim üzerine A0şunları yapabilirsiniz sadece yapmak digitalWrite(A0, x). digitalWriteanalog kanalları dahili olarak kullanmaz ve kanal numarası iletmenize izin vermez. Sana izin verecek ama yanlış pimi seçeceksin. Aynısı digitalReadve hatta geçerlidir analogWrite.

Tarafından yapılan pin-to-channel dönüşümleri ne olacak analogRead? Bu işlevin kaynağı hardware/arduino/avr/cores/arduino/wiring_analog.c, pano türüne bağlı olarak bazı basit çıkarma işlemlerinin yapıldığını göreceksiniz. A0/ A1/ A2/ Vb. sabitler analog kanalların pin numarasını temsil eder ve analog girişlere başvurmanız gereken her yerde kullanılabilir. Bu nedenle, Arduino kodunuzda kullanmak için en iyi seçenektir, çünkü farklı işlevleri kullanırken bile aynı fiziksel bağlantı noktasını kullandığınız çok açıktır. Bu sabitlerin tanımları tahtanıza bağlıdır.

Örneğin, burada Arduino Uno in için analog pin tanımlama kodu 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;

Karşılaştırma için burada Arduino Mega için analog pin tanımlama kodu:

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;

Analog pinler hakkında daha fazla enerji verimliliği tartışması: Projem için Arduino'daki analog pinleri dijital olarak kullanabilir miyim?


1
Tam olarak açıkladığınız gibi olmasına rağmen, yanlış bilgi içeren Arduino referansı ile kafam karıştı.
Tyilo

1
Ayrıca yapabilirsiniz sadece yapmak analogReadanalog iğneler üzerinde! Öte yandan, analogWritehem analog hem de PWM pinlerinde kullanılabilir.
Tyilo

1
@Tyilo Yanıtımı kaynak kodundan alınan bazı daha doğru bilgilerle güncelledim.
Kevin Mark

3
analogWrite () pinlerden herhangi birinde çağrılabilir, ancak sadece PWM pinlerinde bir şey yapar. PWM olmayan ilk pinlerde ve tüm analog pinlerde, sadece digitalWrite () öğesini çağırır.
baldengineer

3
@powtac - Genel olarak, arduino belgelerinin, en azından burada, oldukça iğrenç olduğu kabul edilir. Bir şeyi kaçırıyormuş gibi hissetme, sen değilsin, arduino halkı.
Connor Wolf

3

Bunun için saatler geçirdim. Bir donanım sorunum olduğunu düşündüm. analogRead()Yanlış aradığım ortaya çıkıyor .

Yanlış ( DFRobot 😣'dan hatalı örnek kod ):

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

Doğru:

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

Güncelleme : analogRead()GPIO pin numaralarını alır. A0vb Arduino pin numaraları için #defines, nerede A0 == 36.

Dikkatli olun: örneğin FireBeetle ESP32'de, "IO36 / A0" (GPIO36) etiketli pim Arduino'ya eşittir A0, ancak "IO39 / A1" (GPIO39) Arduino'ya A3(değil A1), "IO34 / A2" (GPIO34) Arduino'ya A6(değil A2) eşittir , vb.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.