Está en la página 1de 30

Programación en Arduino IDE

 Que es una IDE?

 Sketch.

 Partes de un programa?

 Instrucciones Condicionales?
DEFINICIÓN DE SKETCH

 Es un programa diseñado para ejecutarse sobre un Arduino


ESTRUCTURA GENERAL DE UN SKETCH

 Se compone de 3 secciones
Reservada para escribir,
las diferentes
LA SECCIÓN DE
declaraciones de
DECLARACIONES DE
variables que
VARIABLES GLOBALES
necesitemos.

Sirve para realizar


ciertas pre
LA SECCIÓN LLAMADA configuraciones
“VOID SETUP()” iniciales.

Delimitadas por llaves de


apertura y cierre “{ }”

LA SECCIÓN LLAMADA Contiene el programa


“VOID LOOP()” que funciona
continuamente.
DATOS IMPORTANTES

Es diferente escribir una


letra en mayúscula que una
letra escrita en minúscula
El lenguaje Arduino es de tipo ------> CASE-SENSITIVE

No son necesarias pero son una


forma de mantener el código de
Las tabulaciones de las instrucciones
forma ordenada y cómoda

Acaban con punto y coma

Todas las instrucciones


Pueden aparecer de dos formas:
Los comentarios

Comentarios compuestos por Comentarios compuestos por una


un bloque de varias líneas línea entera
seguidas

escribir dos barras ( // ) al principio


Escribir una barra seguida de de cada línea que
un asterisco ( /* ) al queramos convertir en comentario.
principio del bloque de texto
que queramos convertir en
comentario, y un
asterisco seguido de una
barra ( */ ) al final de dicho
bloque.
VARIABLES

Declaración e Asignación de Ámbito de una


Definición variable
inicialización valores

Puede ser
Es un Crear una variable La línea de
elementos de “declarar variable” asignación se
nuestro Sketch lee “de izquierda GLOBAL LOCAL
que guarda un Especificar su tipo a derecha”: el
determinado según el tipo de valor
contenido dato que se quiera “nuevoValor” se Se declara en
almacenar asigna a la Se declara al el interioir de
(números enteros, variable principio void setup y
decimales, cadena “nombreVariable antes y fuera void loop
de caracteres, etc) ” de void
setup y void Solo puede ser
Establecer un valor loop manipulada o
inicial “inicializar utilizada por
variable” instrucciones
escritas dentro
de su sección
tipoVariable nombreVariable = valorInicialVariable
Puede tener dos valores cierto o falso • Puede tener un numero entre 0 y
Ocupa 1 byte de memoria 255
• Para el valor cierto se usa “true” • Utilizan 8 bits (byte) de memoria
o”1” • Los valores NO pueden ser
• Para el valor falso se usa “false” o negativos
“0”

Boolean byte

TIPOS DE
VARIABLES

char int

Para Arduino
• Solo puede ser un carácter (una • El valor puede estar entre
letra, un digito, un signo de -32768 (−215 ) 𝑦 32767 (215 − 1),
puntuación ) • Utiliza 2 bytes (16 bits) de memoria
• El carácter se debe escribir entre
comillas simples ----- ‘A’ Para arduino DUE:
• Ocupa 8 bits (byte) de memoria • El valor puede estar entre −2,147,483,648
• Existen 2^8 =256 valores entre - ( −231 ) y 2,147,483,647 (231−1) .
128 y 127 • Utiliza 4 bytes de memoria
TIPOS DE
DATOS

word Unsigned long

• El valor es un número entero entre 0


• No usa valores negativos
y 4.294.967.295 (232-1).
• Ocupa 2 bytes de memoria
• utilizan 4 bytes (32 bits) para
• el valor que puede tener una variable
almacenar su valor 232
“word” es un número entero entre 0 y
combinaciones
65535 (216-1).
• No puede utilizar valores negativos

short long

• Número entero entre -32768 (-215) y • El valor para los modelos de placa (ya sean
• 32767 (215-1), basadas en microcontroladores de tipo AVR
• utilizan 2 bytes (16 bits) de memoria para o
• almacenarse. • de tipo ARM) es un número entero entre -
• En este sentido, los tipos “short” e “int” 2.147.483.648 y 2.147.483.647
para placas de la familia AVR son • utilizan 4 bytes (32 bits) de memoria
equivalentes • En este sentido, los tipos “long” e “int” para
• la placa Arduino Due el tipo “short” placas de la familia ARM son
• es el único que utiliza 16 bits. • equivalentes.
TIPOS DE
DATOS

float double Array

• Es un sinónimo Un array (también


• El valor que puede tener exactamente equivalente llamado “vector”) es una
es un numero decimal al tipo float colección de variables de un
• Su valor fluctúa entre - • Aporta el doble de tipo concreto que tienen
3,4028235·1038 hasta el precisión todas el mismo y único
número 3,4028235·1038. • Ocupa 4 bytes de nombre
• Solo tiene 6 o 7 dígitos memoria Sirven para ganar claridad y
de precisión simplicidad en el código.
• No son muy exactos y
puede producir
resultados inesperados int varInt[6]
• El calculo matemático es
mas lento que con
int varInt[] = {2,5,6,7}
valores enteros
• Los números decimales
se escriben con notación
anglosajona int varInt[8] = {2,5,6,7}
CONSTANTES

Otra manera de declarar


Su valor no se puede
constantes en el lenguaje
modificar nunca porque esté
Arduino, que es utilizando la
marcado como de “solo lectura”.
directiva especial #define

Para convertir una variable (sea


global o local) en constante, lo único
que hay que hacer es preceder la
declaración de esa variable con la
palabra clave const.
Tipos de Datos
47
Operadores

ejemplo

z *= 12; equivalente a z = z * 12;


z /= 2; equivalente a z = z / 12

Operador ternario
Expresión1 ? Expresión2 : Expresión3;
Asignación después de
una manipulación de bits.
48
Manipulación de Bits

Complemento Uno ~
Desplazamiento a la <<
Izquierda
Desplazamiento a la Derecha >>
AND &
OR |
OR Exclusiva ^

Trabajan sobre operandos que no


son punto flotante (char, int, long) y
afectan el resultado al nivel de bits.
Operadores Lógicos
AND && Tratan a los
OR || operandos como
expresiones FALSAS
NOT ! o VERDADERAS.
VALOR DE RETORNO DE UNA INSTRUCCIÓN

Un valor de salida es un dato que podemos obtener en nuestro sketch como resultado “tangible”
de la ejecución de la instrucción. El significado de ese valor devuelto dependerá de cada
instrucción concreta: algunos son de control otros son resultados numéricos obtenidos tras la
ejecución de algún cálculo matemático, etc.

Si queremos usar el valor devuelto podemos:

• Asignar ese valor a una variable del mismo tipo


• Utilizar ese valor directamente dentro de otra instrucción.
Estructuras de Control

Repetición Mientras

switch (expresión){
case exp-const:
proposiciones
case exp-const:
proposiciones
default:
proposiciones
} while(expresión)
proposición
Repetición Hacer/Mientras Repetición Para/Hasta

do
proposición for (expr1; expr2; expr3)

while(expresión); proposición
Datos en SRAM

Variables: Datos que van a ser leídos o escritos repetitivamente. SRAM este
es el espacio de almacenamiento por default.
unsigned char x, y;
unsigned int a, b, c;

Si es posible, el compilador utilizará los registros de propósito


general (R0 a R31).

Los apuntadores son manejados en SRAM y hacen referencia a


objetos de SRAM, un ejemplo de declaraciones y uso es:

char cadena[] = "hola mundo";


char *pcad;

pcad = cadena;
COMUNICACIÓN SERIE CON LA PLACA ARDUINO

Dentro de nuestros sketches podemos hacer uso de este receptor/transmisor TTL-UART para enviar datos al
microcontrolador (o recibirlos de él) gracias al elemento del lenguaje Arduino llamado “Serial”.

Las instrucciones existentes dentro de un objeto se escriben siguiendo la sintaxis


nombreObjeto.nombreInstruccion();

Serial.begin(): abre el canal serie Serial.end(), no tiene ningún argumento


para que pueda empezar la ni devuelve nada, y se encarga de cerrar el
comunicación por él. Por tanto, su canal serie; de esta manera, la comunicación
ejecución es imprescindible antes serie se deshabilita y los pines RX y TX vuelven
de realizar cualquier a estar disponibles para la entrada/salida
transmisión por dicho canal. general.
Serial.print()
Envía a través del canal serie un desde el microcontrolador hacia el exterior. Ese
I dato puede ser de cualquier tipo: carácter, cadena, número entero, número
N decimal.
S La transmisión de los datos es asíncrona. Eso significa que nuestro sketch pasará
T a la siguiente instrucción y seguirá ejecutándose sin esperar a que empiece a
R realizarse el envío de los datos.
U Serial.flush()
C No tiene ningún parámetro ni devuelve ningún valor de retorno ni instrucción que
C espera hasta que la transmisión de los datos sea completa para continuar la
I ejecución del sketch.
O
N Serial.println()
E Hace exactamente lo mismo que Serial.print(), pero además,
S añade automáticamente al final de los datos enviados dos caracteres extra: el
de retorno de carro (código ASCII nº 13) y el de nueva línea (código ASCII nº
Para 10).
recibir
datos Serial.write()
de la envía a través del canal serie un dato (especificado como parámetro) desde el
placa microcontrolador hacia el exterior. Pero a diferencia de Serial.print(), el dato a
exteri enviar solo puede ocupar un byte. Por lo tanto, ha de ser basicamente de tipo
or “char” o “byte”.
La gracia de Serial.write() está en que el dato es enviado siempre directamente
sin interpretar. Es decir, se envía como un byte (o una serie de bytes) tal cual sin
ninguna transformación de formato.
OTRAS INSTRUCCIONES PARA RECIBIR DATOS DEL EXTERIOR

Serial.available():

Devuelve el número de bytes –caracteres– disponibles para ser leídos que provienen del exterior a
través del canal serie (vía USB o vía pines TX/RX).
Estos bytes ya han llegado al microcontrolador y permanecen
almacenados temporalmente en una pequeña memoria de 64 bytes que tiene el chip TTL-UART –
llamada “buffer”– hasta que sean procesados
mediante la instrucción Serial.read(). Si no hay bytes para leer, esta
instrucción devolverá 0. No tiene parámetros.
Serial.read()
Devuelve el primer byte aún no leído de los que estén almacenados en el buffer de entrada del chip
TTL-UART. Al hacerlo, lo elimina de ese buffer. Para devolver el siguiente byte, se ha de volver a
ejecutar Serial.read(). Y hacer así hasta que se hayan leído todos. Cuando no haya más bytes
disponibles, Serial.read() devolverá -1. No tiene parámetros.
OTRAS INSTRUCCIONES

Serial.peek()

Devuelve el primer byte aún no leído de los que estén almacenados en el buffer de
entrada. No obstante, a diferencia de Serial.read(), ese byte leído no se borra del
buffer, con lo que las próximas veces que se ejecute Serial.peek() –o una vez
Serial.read()– se volverá a leer el mismo byte. Si no hay bytes disponibles para leer,
Serial.peek() devolverá -1. Esta instrucción no tiene parámetros.

Serial.find()

Lee datos del buffer de entrada (eliminándolos de allí) hasta que se encuentre la
cadena de caracteres (o un carácter individual) especificada como parámetro, o bien
se hayan leído todos los datos actualmente en el buffer. La instrucción devuelve
“true” si se encuentra la cadena o “false” si no.
Serial.findUntil() Serial.readBytes()

Lee datos del buffer de


entrada (eliminándolos de allí) Lee del buffer de entrada
hasta que se encuentre la (eliminándolos de allí) la cantidad
cadena de caracteres (o un de bytes especificada como
carácter individual) segundo parámetro (o bien, si no
especificada como primer llegan suficientes bytes, hasta
parámetro, o bien se llegue a que se haya superado el tiempo
una marca de final de especificado por
búsqueda (la cual es la Serial.setTimeout()) . En
cadena –o carácter– cualquier caso, los bytes leídos
especificada como segundo se almacenan en un
parámetro). La instrucción array –de tipo “char[]”–
devuelve “true” si se especificado como primer
encuentra la cadena a buscar parámetro. Esta instrucción
antes que la marca de final de devuelve el número de bytes
búsqueda o “false” si no. leídos del buffer (por lo que un
valor 0 significa que no se
encontraron datos válidos).
Serial.readBytesUntil()

Lee del buffer de entrada (eliminándolos de allí) la cantidad de bytes especificada como
tercer parámetro, o bien, si se encuentra antes una cadena de caracteres –o carácter
individual–
especificada como primer parámetro que hace de marca de final, o bien, si no llegan
suficientes bytes ni se encuentra la marca de final, hasta que se haya superado el tiempo
especificado por Serial.setTimeout(). En cualquier caso, los bytes leídos se almacenarán
en un array –de tipo “char[]”– especificado como segundo parámetro. Esta instrucción
devuelve el número de bytes leídos del buffer (por lo que un valor 0 significa que no se
encontraron datos válidos).

Serial.setTimeout()
Tiene un parámetro (de tipo “long”) que sirve para establecer el número de milisegundos
máximo que las instrucciones Serial.readBytesUntil() y Serial.readBytes() esperarán a la
llegada de datos al
búfer de entrada serie. Si alguna de estas dos instrucciones no recibe ningún dato y se
supera ese tiempo, el sketch continuará su ejecución en la línea siguiente. El tiempo de
espera por defecto es de 1000 milisegundos. Esta instrucción se suele escribir en “void
setup ()”. No tiene valor de retorno.

Serial.parseFloat()
Lee del buffer de entrada (eliminándolos de allí) todos los datos hasta que se encuentre
con un número decimal. Su valor de retorno – de tipo “long”– será entonces ese número
decimal encontrado. Cuando detecte el primer carácter posterior no válido, dejará de leer
(y por tanto, no
Serial.parseInt()

Lee del buffer de entrada (eliminándolos de allí) todos los datos hasta que se encuentre con
un número entero. Su valor de retorno –de tipo “long”– será entonces ese número entero
encontrado. Cuando detecte el primer carácter posterior no válido, dejará de leer (y por
tanto, no seguirá eliminando datos del buffer). Esta instrucción no tiene parámetros.
INSTRUCCIONES DE GESTION DE TIEMPO

millis(): devuelve el número de milisegundos (ms) desde que la placa Arduino empezó a ejecutar el sketch
actual. Este número se reseteará a cero aproximadamente después de 50 días (cuando su valor supere el
máximo permitido por su tipo, que es “unsigned long”). No tiene parámetros.

micros(): devuelve el número de microsegundos (μs) desde que la placa Arduino empezó a ejecutar el sketch
actual. Este número –de tipo “unsigned long”– se reseteará a cero aproximadamente después de 70 minutos.
Esta instrucción tiene una resolución de 4 μs (es decir, que el valor retornado es siempre un múltiplo de
cuatro). Recordar que 1000 μs es un milisegundo y por tanto, 1000000 μs es un segundo. No tiene parámetros.

delay(): pausa el sketch durante la cantidad de milisegundos especificados como parámetro –de tipo “unsigned long”–. No
tiene valor de retorno.

delayMicroseconds(): pausa el sketch durante la cantidad de microsegundos especificados como parámetro –de tipo
“unsigned long”– . Actualmente el máximo valor que se puede utilizar con precisión es de 16383. Para esperas mayores que
esta, se recomienda usar la instrucción delay(). El mínimo valor que se puede utilizar con precisión es de 3 μs. No tiene valor
de retorno.
BLOQUES CONDICIONALES

Los bloques “if” y


“if/else”

Un bloque “if” sirve para comprobar si una condición determinada es cierta


(”true”,1) o falsa (”false”,0). Si la condición es cierta, se ejecutarán las instrucciones
escritas en su interior (es decir, dentro de las llaves de apertura y cierre). Si no se
cumple, puede no pasar nada, o bien, si existe tras el bloque “if” un bloque “else”
(opcional), se ejecutarán las instrucciones escritas en el interior de ese bloque
“else”.
BLOQUES CONDICIONALES

El bloque “switch”

Un bloque “switch” es como una especie de “if else” escrito más


compactamente. Como se puede ver, consta en su interior de una serie de secciones
“case” y, opcionalmente, de una sección “default”.

En una sección “case” el valor a comparar tal solo puede ser de tipo entero.
BLOQUES REPETITIVOS
(BUCLES)

El bloque “while” El bloque “do”

El bloque “for”
IMPORTANTE
 Sistema mínimo y tarjetas de desarrollo

 Instrucciones y Código de operación?

 Cómo se almacenan?

 Direccionamiento

29
PREGUNTAS

Blow your audience


away with attractive
visuals

30

También podría gustarte