Para responder las preguntas específicas de Tyilo:
analogRead(5)
y digitalRead(5)
leerá desde dos lugares diferentes. El primero leerá desde el canal analógico 5
o A5
y el segundo leerá desde el pin 5, que resulta ser un pin digital. Entonces, sí, si quieres leer un pin analógico digitalRead
, deberías estar usando A5
.
¿Por qué?
analogRead
requiere 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á en su número de canal correspondiente. Por lo que puedo decir analogRead
es que 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 analogRead
el primer pin analógico A0
, puede hacer analogRead(0)
qué usa el número de canal o analogRead(A0)
cuál usa el número de pin. Si usara la variante de número de pin, analogRead
convertiría el número de pin A0
a su número de canal adecuado 0
.
Si desea utilizar digitalWrite
el primer pin analógico A0
, solo puede hacerlo digitalWrite(A0, x)
. digitalWrite
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 incorrecto. Lo mismo se aplica a digitalRead
e incluso analogWrite
.
¿Qué pasa 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.c
Verá que hace una resta simple basada en el tipo de placa. 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 referirse a las entradas analógicas. Por esa razón, son la mejor opción para usar en su código Arduino porque es muy obvio que está usando el mismo puerto físico incluso cuando usa 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 el Arduino Uno en 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;
Para comparar, aquí está el código de definición de pin analógico para el 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 sobre EE en pines analógicos: ¿Puedo usar los pines analógicos en el Arduino para mi proyecto como digital?
analogRead
en pines analógicos! Por otro lado,analogWrite
se puede usar tanto en los pines analógicos como en los PWM.Pasé horas en esto. Pensé que tenía un problema de hardware. Resulta que estaba llamando
analogRead()
incorrectamente.Incorrecto (código de muestra erróneo de DFRobot 😣):
Correcto:
Actualización :
analogRead()
toma los números de pin GPIO.A0
etc.son #defines para los números de pin de Arduino, dondeA0 == 36
.Tenga cuidado: por ejemplo, en FireBeetle ESP32, el pin etiquetado "IO36 / A0" (GPIO36) es igual a Arduino
A0
, pero "IO39 / A1" (GPIO39) es igual a ArduinoA3
(noA1
), "IO34 / A2" (GPIO34) es igual a ArduinoA6
(noA2
) etc.fuente