lectura analógica (0) o lectura analógica (A0)

La referencia de arduino indica que usaría el siguiente código para leer el valor del pin analógico n.º 5:

int val1 = analogRead(5);

Sin embargo, para leer desde el pin digital n. ° 5, pasaría el mismo número de pin a digitalRead:

int val2 = digitalRead(5);

¿No deberías usar analogRead(A5)en lugar de analogRead(5)?

Si no, ¿qué hace el siguiente código?

int val3 = analogRead(A5);

Respuestas (2)

Para responder a las preguntas específicas de Tyilo:

analogRead(5)y digitalRead(5)leerá desde dos lugares diferentes. El primero leerá desde el canal analógico 5y A5el último leerá desde el pin 5, que resulta ser un pin digital. Entonces, sí, si desea leer un pin analógico digitalRead, debe usar A5.

¿Por qué?

analogReadrequiere un número de canal internamente, pero también le permitirá darle un número pin. Si le da un número pin, lo convertirá a su número de canal correspondiente. Por lo que puedo decir, analogReades la única función que usa un número de canal internamente, es la única que permite un número de canal y es la única función con esta conversión de pin a canal no documentada. Para entender esto, comencemos con algunos ejemplos.

Si desea usar analogReaden el primer pin analógico A0, puede hacer analogRead(0)cuál usa el número de canal o analogRead(A0)cuál usa el número de pin. Si tuviera que utilizar la variante del número de pin, analogReadconvertiría el número de pin A0en su número de canal adecuado 0.

Si desea usar digitalWriteen el primer pin analógico , soloA0 puede hacerlo . no usa canales analógicos internamente y no le permite pasarle un número de canal. Bueno, te lo permitirá , pero seleccionarás el pin equivocado. Lo mismo se aplica a e incluso .digitalWrite(A0, x)digitalWritedigitalReadanalogWrite

¿Qué sucede con las conversiones de pin a canal realizadas por analogRead? La fuente de esa función se puede encontrar en hardware/arduino/avr/cores/arduino/wiring_analog.cVerás que hace algunas restas simples basadas en el tipo de tablero. El A0/ A1/ A2/etc. Las constantes representan el número de pin de los canales analógicos y se pueden usar en cualquier lugar donde necesite consultar las entradas analógicas. Por esa razón, son la mejor opción para usar en tu código Arduino porque es muy obvio que estás usando el mismo puerto físico incluso cuando estás usando diferentes funciones. Las definiciones de esas constantes dependen de su tablero.

Por ejemplo, aquí está el código de definición de pin analógico para Arduino Uno enhardware/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;

Para comparar, aquí está el código de definición de pin analógico para 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;

Más discusión de EE sobre pines analógicos: ¿Puedo usar los pines analógicos en el Arduino para mi proyecto como digital?

Pensé que era exactamente como lo explicaste, simplemente me confundió la referencia de Arduino, que contiene información falsa.
¡También solo puedes hacerlo analogReaden pines analógicos! Por otro lado, analogWritese puede usar tanto en el pin analógico como en el PWM.
@Tyilo Actualicé mi respuesta con información más precisa tomada del código fuente.
analogWrite() se puede llamar en cualquiera de los pines, pero solo hace algo en los pines PWM. En los pines digitales que no son PWM y todos los pines analógicos, simplemente llama a digitalWrite().
@JamesC4S Otra "característica" no documentada:\
Hola, @Tyilo, ¡también estoy muy decepcionado con la referencia de Arduino en muchos sentidos! Siempre me preguntaba si solo soy yo...
@powtac: generalmente se acepta que la documentación de arduino es bastante abominable, al menos por aquí. No sientas que te estás perdiendo algo, no eres tú, es la gente de arduino.

Pasé horas en esto. Pensé que tenía un problema de hardware. Resulta que estaba llamando analogRead()incorrectamente.

Incorrecto (código de ejemplo erróneo de DFRobot 😣):

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

Correcto:

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

Actualización : analogRead()toma números pin GPIO. A0etc. son #defines para los números de pin de Arduino, donde A0 == 36.

Tenga cuidado: por ejemplo, en el FireBeetle ESP32, el pin etiquetado como "IO36/A0" (GPIO36) es igual a Arduino A0, pero "IO39/A1" (GPIO39) es igual a Arduino A3(no A1), "IO34/A2" (GPIO34) es igual a Arduino A6(no A2) , etc.