Documentos de Académico
Documentos de Profesional
Documentos de Cultura
{} entre llaves
Las llaves sirven para definir el principio y el final de un bloque de instrucciones. Se utilizan para los
bloques de programación setup(), loop(), if.., etc.
Una llave de apertura “{“ siempre debe ir seguida de una llave de cierre “}”, si no es así el compilador
dará errores. El entorno de programación de Arduino incluye una herramienta de gran utilidad para
comprobar el total de llaves. Sólo tienes que hacer click en el punto de inserción de una llave abierta e
inmediatamente se marca el correspondiente cierre de ese bloque (llave cerrada).
; punto y coma
El punto y coma “;” se utiliza para separar instrucciones en el lenguaje de programación de Arduino.
También se utiliza para separar elementos en una instrucción de tipo “bucle for”.
Nota: Si olvidáis poner fin a una línea con un punto y coma se producirá un error de compilación.
// línea de comentarios
Una línea de comentario empieza con / / y terminan con la siguiente línea de código. Al igual que los
comentarios de bloque, los de línea son ignoradas por el programa y no ocupan espacio en la memoria.
Una línea de comentario se utiliza a menudo después de una instrucción, para proporcionar más
información acerca de lo que hace esta o para recordarla más adelante.
A la hora de programar Arduino, es fundamental usar la referencia que disponemos online en
http://arduino.cc/en/Reference/HomePage o en la ayuda del IDE de Arduino. Cualquier duda sobre un
comando, función, etc… debemos consultar en la referencia de Arduino.
Existe una guía de estilo para escribir código claro de Arduino y que sea fácil de entender. No es
obligatorio, pero es una recomendación:
● Documentar al máximo
● Usar esquemas
● Predominar la facilidad de lectura sobre la eficiencia del código
● Poner el setup() y loop() al principio del programa
● Usar variables descriptivas
● Explicar el código al principio
● Usar identación
Variables
Una variable es un lugar para almacenar un dato. Tiene un nombre, un valor y un tipo. Por ejemplo, esta
declaración (llamada declaración ): int pin = 13;
crea una variable cuyo nombre es pin, cuyo valor es 13, y cuyo tipo es int. Más adelante en el
programa, puede hacer referencia a esta variable por su nombre, momento en el que se buscará y
utilizará su valor. Por ejemplo, en esta declaración:
pinMode(pin, OUTPUT);
Colegio Cristiano de la Villa
ccvmanager@gmail.com – 02942-498-130 – Centro Cívico, Villa Pehuenia – Neuquén. PATAGONIA ARGENTINA
es el valor del pin (13) que se pasará a la función pinMode(). En este caso, en realidad no necesita usar
una variable, esta declaración funcionaría igual de bien:
pinMode(13, OUTPUT);
La ventaja de una variable en este caso es que solo necesita especificar el número real del pin una vez,
pero puede usarlo muchas veces. Entonces, si luego decide cambiar del pin 13 al pin 12, solo necesita
cambiar un punto en el código. Además, puede usar un nombre descriptivo para aclarar el significado de
la variable (por ejemplo, un programa que controla un LED RGB puede tener variables denominadas
pinrojo, pinverde y pinazul).
Una variable tiene otras ventajas sobre un valor como un número. Lo que es más importante, puede
cambiar el valor de una variable mediante una asignación (indicada por un signo igual). Por ejemplo:
pin = 12;
cambiará el valor de la variable a 12. Tenga en cuenta que no especificamos el tipo de la variable: no se
cambia por la asignación. Es decir, el nombre de la variable está permanentemente asociado a un tipo;
sólo cambia su valor. [1] Tenga en cuenta que debe declarar una variable antes de poder asignarle un
valor. Si incluye la declaración anterior en un programa sin la primera declaración anterior, obtendrá un
mensaje como: "error: el pin no se declaró en este ámbito".
Cuando asigna una variable a otra, está haciendo una copia de su valor y almacenando esa copia en la
ubicación de la memoria asociada con la otra variable. Cambiar uno no tiene efecto en el otro. Por
ejemplo, después de:
pin = 12;
solo el pin tiene el valor 12; pin2 sigue siendo 13.
Ahora, quizás se esté preguntando, ¿qué significaba la palabra "alcance" en el mensaje de error
anterior? Se refiere a la parte de su programa en la que se puede utilizar la variable. Esto está
determinado por dónde lo declaras. Por ejemplo, si desea poder usar una variable en cualquier parte de
su programa, puede declararla en la parte superior de su código. Esto se llama una variable global ;
aquí hay un ejemplo:
Como puedes ver, pin se usa en las funciones setup() y loop(). Ambas funciones se refieren a la
misma variable, por lo que cambiar una afectará el valor que tiene en la otra, como en:
int pin = 13;
void setup()
{
pin = 12;
pinMode(pin, OUTPUT);
}
void loop()
{
digitalWrite(pin, HIGH);
}
Aquí, a la función digitalWrite() llamada desde loop() se le pasará un valor de 12, ya que ese es el valor
que se asignó a la variable en la función setup().
Si solo necesita usar una variable en una sola función, puede declararla allí, en cuyo caso su alcance se
limitará a esa función. Por ejemplo:
void setup()
{
int pin = 13;
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);
}
En este caso, el pin variable solo se puede usar dentro de la función setup(). Si intentas hacer algo
como esto:
void loop()
{
digitalWrite(pin, LOW); // wrong: pin is not in scope here.
}
obtendrá el mismo mensaje que antes: "error: 'pin' no se declaró en este ámbito". Es decir, aunque haya
declarado pin en algún lugar de su programa, está tratando de usarlo en algún lugar fuera de su
alcance.
¿Por qué, quizás se pregunte, no haría que todas sus variables fueran globales? Después de todo, si no
sé dónde podría necesitar una variable, ¿por qué debo limitar su alcance a una sola función? La
respuesta es que puede hacer que sea más fácil averiguar qué le sucede. Si una variable es global, su
valor podría cambiarse en cualquier parte del código, lo que significa que debe comprender todo el
programa para saber qué sucederá con la variable. Por ejemplo, si su variable tiene un valor que no
esperaba, puede ser mucho más fácil averiguar de dónde proviene el valor si la variable tiene un
alcance limitado.
[alcance del bloque][tamaño de las variables]
[1] En algunos lenguajes, como Python, los tipos están asociados con valores, no con nombres de
variables, y puede asignar valores de cualquier tipo a una variable. Esto se conoce como escritura
dinámica .
Colegio Cristiano de la Villa
ccvmanager@gmail.com – 02942-498-130 – Centro Cívico, Villa Pehuenia – Neuquén. PATAGONIA ARGENTINA
La función Arduino digitalWrite permite escribir valores lógicos digitales en un pin de Salida de una
tarjeta Arduino. Entonces, está función requiere que el pin haya sido declarado como salida previamente.
Para empezar, esté elemento del lenguaje Arduino, requiere de dos parámetros de entrada. El primero es
el numero de pin (0-13 para un Arduino UNO R3) y el segundo es la condición logica (HIGH ó LOW).
digitalWrite(#PIN, ESTADO);
Parámetros de entrada:
1. #PIN, se refiere al número del PIN de la tarjeta Arduino correspondiente.
2. ESTADO, aquí se colocara cualquiera de dos palabras: LOW o HIGH. LOW indica una condición
logica 0, es decir 0V, HIGH indicaría entonces lo opuesto, un 1 lógico, es decir VCC.
Funciones complementarias:
● pinMode()
● digitalRead()
De acuerdo al voltaje de alimentación de la tarjeta (VCC) será el voltaje de salida lógico de la tarjeta
Arduino. Si se usa en una tarjeta cuya alimentación sea 3.3V entonces HIGH implicaría este voltaje. De
igual forma, estas condiciones lógicas dependerán de la arquitectura del microcontrolador. No siempre
un LOW será 0V, sino que puede comprender, para el caso de un Arduino UNO R3, es un rango que va
desde los 0 V hasta los 0.8V. Para más información consultar la tabla » 28.2 DC Characteristics » de la
página 258 de la hoja de datos [1].
Aplicaciones
Colegio Cristiano de la Villa
ccvmanager@gmail.com – 02942-498-130 – Centro Cívico, Villa Pehuenia – Neuquén. PATAGONIA ARGENTINA
La función digitalWrite del lenguaje Arduino es usada para los dispositivos de salida. Por ejemplo,
algunos elementos o actuadores incluyen: motores de dc, motores a pasos, leds, pantallas LCD,
servomotores, buzzer, bocinas, etc.
Voltajes lógicos de salida
● Arduino UNO R3.
○ VOH (Voltaje de salida en alto) ‘1’ lógico: 4.1V a Vcc
○ VOL (El voltaje de salida en 0 lógico) ‘0’: 0V a 0.8V
○ VIL (Voltaje de entrada en bajo) ‘0’ : -0.5V a 0.3Vcc (Si VCC = 5vdc, 0.3VCC = 1.5V)
○ VIH (Voltaje de entrada para señales en alto) ‘1’ : 0.6VCC ( 3V para VCC = 5Vdc) a
Vcc+0.5V
El Ejemplo-1 es una aplicación para un rotabit de 4-bits. Entonces, estos cuatro leds estarían conectados en los
pines con números, 13, 12, 11 y 10. Para poder utilizar la función de Arduino digitalWrite, primero es necesario
declarar estos puertos como salida. Es importante aclarar la capacidad de corriente que puede suministrar cada
pin. Es decir, la potencia que puede suministrar (V*I) es limitada. Por consiguiente, es importante establecer que la
corriente máxima por pin es de 40mA. De tal manera, no podemos tener los 14 pines digitales de un Arduino UNO
R3 con ese consumo. Existe un tope límite de 200mA para todos los pines del microcontrolador. Para resumir esta
restricción, verifica cuanta corriente consumen tus circuitos, leds, motores, etc.
Colegio Cristiano de la Villa
ccvmanager@gmail.com – 02942-498-130 – Centro Cívico, Villa Pehuenia – Neuquén. PATAGONIA ARGENTINA
Ejemplo-2. Control de temperatura on-off, sensor analógico y una salida digital para el control de un
ventilador.
Se diseñará una aplicación para un control de temperatura con Arduino digitalWrite. El sensor utilizado
es un sensor analógico MCP9700. Este sensor proporciona un voltaje en función a la temperatura
medida. Tiene un offset de 500 mV y cada 10mV representa 1 grado centrado. Se utiliza la función
Arduino digitalWrite para encender o apagar los actuadores. En este caso, los actuadores son dos, un
ventilador y un foco. Estos elementos al funcionar a un voltaje distinto del que usa arduino, requieren de
una etapa de potencia. Se puede usar para el ventilador a un transistor 2N2222 como switch.
Colegio Cristiano de la Villa
ccvmanager@gmail.com – 02942-498-130 – Centro Cívico, Villa Pehuenia – Neuquén. PATAGONIA ARGENTINA
Sintaxis:
pinMode(#PIN, Modo);
Parámetros de entrada:
#PIN. Es el número del pin que se quiere configurar, este número está escrito en la tarjeta Arduino que se
usará.
Funciones complementarias:
digitalWrite();
digitalRead();
La función Arduino pinMode usada para las tarjetas, es indispensable para cualquier aplicación donde
se requiere usar entradas o salidas digitales. Previamente, la historia de está función comienza con la
forma en la que se configuran a las entradas y salidas usando el lenguaje C para un microcontrolador
AVR. Esta arquitectura es la que utiliza un Arduino UNO R3. Originalmente la función de configuración
está controlada por el registro de propósito específico llamado DDRX, donde la X representa el puerto a
configurar. Por ejemplo, si tomamos en cuenta a un Arduino UNo, cuyo micro es el ATMEGA328P, vemos
que los pines del 0 al 13 están conectados en realidad a los puertos D, C y B. Finalmente, la Figura-1,
muestra las banderas de los registros B, C y D conectadas a cada pin.
int LEDR 13
void setup() {
pinMode(LEDR ,OUTPUT);
}
void loop() {
digitalWrite(LEDR , HIGH);
delay(1000);
digitalWrite(LEDR , LOW);
delay(1000);
}
Arduino Delay
En Arduino Delay es una función que hace que el procesador espere. Por ejemplo, esta espera permite
no hacer nada y esperar hasta la ejecución de la siguiente instrucción durante un retardo de tiempo
definido. Entonces esta función tiene un parámetro de entrada del tipo entero, que es la espera en
milisegundos. De hecho, esta es una de las instrucciones más usadas en el lenguaje Arduino.
La función de Arduino Delay está basada en el uso de timers. Por ejemplo, la idea es que el procesador
espera a que el timer le notifique de su desbordamiento. Cuando esto ocurre se genera una interrupción
por Hardware. Esta interrupción ocurre en un tiempo conocido lo cual permite detener al procesador
durante un tiempo definido. Quizás la palabra detener no sea la más apropiada, es más una espera y
mientras espera está verificando o esperando a las interrupciones del timer.
Sintaxis:
delay( retardoMilisegundos );
Donde:
retardoMilisegundos. Entonces es un número entero que representa el valor del retardo en milisegundos.
Colegio Cristiano de la Villa
ccvmanager@gmail.com – 02942-498-130 – Centro Cívico, Villa Pehuenia – Neuquén. PATAGONIA ARGENTINA
HIGH
El significado de HIGH (en referencia a un pin) es un poco diferente dependiendo si el pin está
configurado como INPUT(de entrada) o OUTPUT(de salida). Cuando un pin está configurado como
INPUT con pinMode(), y leído con digitalRead(), el Arduino (ATmega) reportara HIGH si:
Un pin también puede ser configurado como INPUT con pinMode(), y subsecuentemente puesto a HIGH
con digitalWrite(). Esto habilitará los resistores internos de acoplamiento a positivo de 20K, que pondrán
el pin de entrada a HIGH a menos que sea bajado a LOW por el circuito externo. Así es como el
INPUT_PULLUP funciona y se describe en detalle más abajo.
Cuando un pin está configurado como OUTPUT con pinMode(), y puesto a HIGH con digitalWrite(), el pin
está a:
En este estado puede ser fuente de corriente, por ejemplo, encender un LED que esta conectado a tierra
mediante una resistencia en serie.
LOW
El significado de LOW tambien tiene puede ser diferente dependiendo si el pin esta puesto a INPUT o
OUTPUT. cuando un pin es configurado como INPUT con pinMode(), y leido con digitalRead(), el Arduino
(ATmega) reportara LOW si:
Cuando un pin esta configurado como OUTPUT con pinMode(), y puesto a LOW con digitalWrite(), el pin
esta a 0 voltios (tarjetas de 5V o de 3.3V). En este estado puede drenar corriente, por ejemplo, encender
un LED que esta conectado a +5 voltios (o +3.3 voltios) mediante un resistor en serie.
Colegio Cristiano de la Villa
ccvmanager@gmail.com – 02942-498-130 – Centro Cívico, Villa Pehuenia – Neuquén. PATAGONIA ARGENTINA
Si tienes tu pin configurado como tipo INPUT, y estás leyendo un switch, cuando el switch esté en estado
abierto el pin de entrada estará "flotando", con resultados impredecibles. Para asegurarse que la lectura
sea correcta cuando el switch está abierto, se debe usar una resistencia de acoplamiento a positivo o a
tierra. El propósito de esta resistencia es la de jalar al pin a un estado conocido cuando el switch está
abierto. Una resistencia de 10 K ohm es generalmente escogida, ya que es lo suficientemente baja para
prevenir una entrada flotante, y al mismo tiempo lo suficientemente alta para no usar demasiada
corriente cuando el switch está cerrado.
Si se usa una resistencia con acoplamiento a tierra, el pin de entrada será LOW cuando el switch está
abierto y HIGH cuando el switch este cerrado.
Si se usa una resistencia con acoplamiento a positivo, el pin de entrada será HIGH cuando el switch esté
abierto y LOW cuando el switch esté cerrado.
Eclesiastés 11:9-10 Alégrate, joven, en tu juventud, y tome placer tu corazón en los días de tu
adolescencia; y anda en los caminos de tu corazón y en la vista de tus ojos; pero sabe, que
sobre todas estas cosas te juzgará Dios. Quita, pues, de tu corazón el enojo, y aparta de tu
carne el mal; porque la adolescencia y la juventud son vanidad.