El define es una sentencia del preprocesador. Lo que hace es allí donde utilizas entrada_local, lo cambia a 24 cuando se está compilando tu programa.
De esta forma, no estás usando memoria RAM del micro con la variable entrada_local. Ésto tiene sentido, si no vas a cambiar en tiempo de ejecución el pin entrada_local, cosa que la mayoría de las veces ocurre...
Utilizandolo de esta forma, te da flexibilidad a tu código, porque no tienes que cambiar en todas las instrucciones donde escribirías 24 cuando quieras utilizar otra entrada, pero hay que tener en cuenta que no podrás cambiarlo en tiempo de ejecución.
También te permite hacer macros y muchas cosas más. Es bastante potente => Top (The C Preprocessor)
Por ejemplo, algo bastante utilizado, el operador _BV(bit), está generado con un macro => #define _BV( bit ) ( 1<<(bit) ) ,es decir, cuando haces por ejemplo, mialarma=_BV(5) para poner el bit 5 de la variable mialarma a 1, el compilador lo que hace es cambiar el código a mialarma= 1<<5
Por ejemplo, algunas de las instrucciones de Arduino generadas con macros son:
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
#define constrain(amt,low,high) ((amt)<(low) ? (low): ((amt)>(high)?(high):(amt)))
#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
#define radians(deg) ((deg)*DEG_TO_RAD)
#define degrees(rad) ((rad)RAD_TO_DEG)
#define sq(x) ((x)(x))
#define interrupts() sei()
#define noInterrupts() cli()
y constantes como por ejemplo:
#define HIGH 0x1
#define LOW 0x0
#define INPUT 0x0
#define OUTPUT 0x1
#define true 0x1
#define false 0x0
#define PI 3.1415926535897932384626433832795
#define HALF_PI 1.5707963267948966192313216916398
#define TWO_PI 6.283185307179586476925286766559
#define DEG_TO_RAD 0.017453292519943295769236907684886
#define RAD_TO_DEG 57.295779513082320876798154814105
Cuando haces un digitalWrite(13,HIGH), precisamente se transforma ese HIGH por un UNO (1).
Salu2