const int led = 13;
Ese es el método correcto. O incluso:
const byte led = 13;
¿Cuántos pines tienes?
Algunos de los tutoriales no pasaron por tanto control de calidad como podrían haberlo hecho.
El rendimiento será mejor usando const byte
, en comparación, int
sin embargo, el compilador puede ser lo suficientemente inteligente como para darse cuenta de lo que está haciendo.
Lo que puede hacer es alentar suavemente a las personas a usar técnicas más eficientes al usarlas en su propio código.
Respuestas a comentarios
Un comentarista ha sugerido que byte
no es el estándar C. Esto es correcto, sin embargo, este es un sitio de Arduino StackExchange, y creo que es aceptable usar los tipos estándar proporcionados por el IDE de Arduino.
En Arduino.h hay esta línea:
typedef uint8_t byte;
Tenga en cuenta que esto no es exactamente lo mismo que unsigned char
. Ver uint8_t vs unsigned char y ¿ Cuándo es uint8_t ≠ unsigned char? .
Otro comentarista ha sugerido que el uso de byte no necesariamente mejorará el rendimiento, porque los números menores a los que int
se promocionarán int
(consulte Reglas de promoción de enteros si desea obtener más información al respecto).
Sin embargo, en el contexto de un identificador constante , el compilador generará un código eficiente en cualquier caso. Por ejemplo, desarmar "parpadeo" le da esto en la forma original:
00000086 <loop>:
86: 8d e0 ldi r24, 0x0D ; 13
88: 61 e0 ldi r22, 0x01 ; 1
8a: 1b d1 rcall .+566 ; 0x2c2 <digitalWrite>
De hecho, genera el mismo código si 13
:
- Es un literal
- Es un
#define
- Es un
const int
- Es un
const byte
El compilador sabe cuándo puede caber un número en un registro y cuándo no. Sin embargo, es una buena práctica usar una codificación que indique su intención . Dejarlo en const
claro deja claro que el número no cambiará, y dejarlo claro byte
(o uint8_t
) deja claro que espera un número pequeño.
Mensajes de error confusos
Otra razón importante para evitar #define
es los mensajes de error que recibe si comete un error. Considere este bosquejo de "parpadeo" que tiene un error:
#define LED = 13;
void setup() {
pinMode(LED, OUTPUT); // <---- line with error
}
void loop() {
digitalWrite(LED, HIGH); // <---- line with error
delay(1000);
digitalWrite(LED, LOW); // <---- line with error
delay(1000);
}
En la superficie se ve bien, pero genera estos mensajes de error:
Blink.ino: In function ‘void setup()’:
Blink:4: error: expected primary-expression before ‘=’ token
Blink:4: error: expected primary-expression before ‘,’ token
Blink:4: error: expected `;' before ‘)’ token
Blink.ino: In function ‘void loop()’:
Blink:8: error: expected primary-expression before ‘=’ token
Blink:8: error: expected primary-expression before ‘,’ token
Blink:8: error: expected `;' before ‘)’ token
Blink:10: error: expected primary-expression before ‘=’ token
Blink:10: error: expected primary-expression before ‘,’ token
Blink:10: error: expected `;' before ‘)’ token
Miras la primera línea resaltada (línea 4) y ni siquiera ves un símbolo "=". Además, la línea se ve bien. Ahora es bastante obvio cuál es el problema aquí ( = 13
se está sustituyendo LED
), pero cuando la línea está 400 líneas más abajo en el código, no es obvio que el problema esté en la forma en que se define el LED.
He visto a personas caer en esto muchas veces (incluido yo mismo).