Archivo por años: 2015

Funciones definidas por el usuario

Una función es un bloque de código que tiene un nombre y un conjunto de instrucciones que son ejecutadas cuando se llama a la función. Son funciones setup() y loop() de las que ya se ha hablado.

Las funciones de usuario pueden ser escritas para realizar tareas repetitivas y para reducir el tamaño de un programa

Las funciones se declaran asociadas a un tipo de valor. Este valor será el que devolverá la función, por ejemplo ‘int’ se utilizará cuando la función devuelva un dato numérico de tipo entero. Si la función no devuelve ningún valor entonces se colocará delante la palabra “void”, que significa “función vacía”

Sintaxis:

tipo nombreFunción(parámetros){

instrucciones;

}

Para llamar a una función, simplemente:

nombreFunción(parámetros);

Return: Termina una función y devuelve un valor a quien ha llamado a la función.

http://arduino.cc/en/Reference/Return

Más información: http://arduino.cc/en/Reference/FunctionDeclaration

Nombres de funciones

Generalmente los nombres de las funciones deben ser en minúscula, con las palabras separadas por un guión bajo, aplicándose éstos tanto como sea necesario para mejorar la legibilidad.

“mixedCase” (primera palabra en minúscula) es aceptado únicamente en contextos en donde éste es el estilo predominante con el objetivo de mantener la compatibilidad con versiones anteriores.

En el caso de las clases, los nombres deben utilizar la convención “CapWords” (palabras que comienzan con mayúsculas).

Estructuras de control

IMPORTANTE: Este documento es una versión antigua del curso Arduino.
La última versión de este documento puedes verla en:
https://aprendiendoarduino.wordpress.com/2017/10/14/estructuras-de-control-4/


if:  es un estamento que se utiliza para probar si una determinada condición se ha alcanzado, como por ejemplo averiguar si un valor analógico está por encima de un cierto número, y ejecutar una serie de declaraciones (operaciones) que se escriben dentro de llaves, si es verdad. Si es falso (la condición no se cumple) el programa salta y no ejecuta las operaciones que están dentro de las llaves.

Referencia Arduino: http://arduino.cc/en/Reference/If

if… else:  viene a ser un estructura que se ejecuta en respuesta a la idea “si esto no se cumple haz esto otro”. Por ejemplo, si se desea probar una entrada digital, y hacer una cosa si la entrada fue alto o hacer otra cosa si la entrada es baja.

else: puede ir precedido de otra condición de manera que se pueden establecer varias estructuras condicionales de tipo unas dentro de las otras (anidamiento) de forma que sean mutuamente excluyentes pudiéndose ejecutar a la vez. Es incluso posible tener un número ilimitado de estos condicionales. Recuerde sin embargo que sólo un conjunto de declaraciones se llevará a cabo dependiendo de la condición probada.

Referencia Arduino: http://arduino.cc/en/Reference/Else

for: La declaración for se usa para repetir un bloque de sentencias encerradas entre llaves un número determinado de veces. Cada vez que se ejecutan las instrucciones del bucle se vuelve a testear la condición. La declaración for tiene tres partes separadas por (;). La inicialización de la variable local se produce una sola vez y la condición se testea cada vez que se termina la ejecución de las instrucciones dentro del bucle. Si la condición sigue cumpliéndose, las instrucciones del bucle se vuelven a ejecutar. Cuando la condición no se cumple, el bucle termina.

Cualquiera de los tres elementos de cabecera puede omitirse, aunque el punto y coma es obligatorio. También las declaraciones de inicialización, condición y expresión puede ser cualquier estamento válido en lenguaje C sin relación con las variables declaradas.

Referencia Arduino: http://arduino.cc/en/Reference/For

While: Un bucle del tipo while es un bucle de ejecución continua mientras se cumpla la expresión colocada entre paréntesis en la cabecera del bucle. La variable de prueba tendrá que cambiar para salir del bucle. La situación podrá cambiar a expensas de una expresión dentro el código del bucle o también por el cambio de un valor en una entrada de un sensor.

Referencia Arduino: http://arduino.cc/en/Reference/While y http://arduino.cc/en/Tutorial/WhileLoop

do..while: El bucle do while funciona de la misma manera que el bucle while, con la salvedad de que la condición se prueba al final del bucle, por lo que el bucle siempre se ejecutará al menos una vez.

Referencia Arduino: http://arduino.cc/en/Reference/DoWhile

switch..case: Al igual que if, switch..case controla el flujo del programa especificando en el programa que código se debe ejecutar en función de unas variables. En este caso en la instrucción switch se compara el valor de una variable sobre los valores especificados en la instrucción case.

break es la palabra usada para salir del switch. Si no hay break en cada case, se ejecutará la siguiente instrucción case hasta que encuentre un break o alcance el final de la instrucción.

default es la palabra que se usa para ejecutar el bloque en caso que ninguna de las condiciones se cumpla.

Referencia Arduino: http://arduino.cc/en/Reference/SwitchCase

goto: transfiere el flujo de programa a un punto del programa que está etiquetado.

Referencia Arduino: http://arduino.cc/en/Reference/Goto

break se usa en las instrucciones do, for, while para salir del bucle de una forma diferente a la indicada en el bucle.

Referencia Arduino: http://arduino.cc/en/Reference/Break

continue se usa en las instrucciones do, for, while para saltar el resto de las instrucciones que están entre llaves y se vaya a la siguiente ejecución del bucle comprobando la expresión condicional.

Referencia Arduino: http://arduino.cc/en/Reference/Continue

Y por su puesto ante cualquier duda: http://arduino.cc/en/Reference/HomePage

Operadores

  • Aritméticos
  • Compuestos
  • Comparación
  • Booleanos

Los operadores aritméticos que se incluyen en el entorno de programación son suma, resta, multiplicación y división. Estos devuelven la suma, diferencia, producto, o cociente (respectivamente) de dos operandos.

La operación se efectúa teniendo en cuenta el tipo de datos que hemos definido para los operandos (int, dbl, float, etc..), por lo que, por ejemplo, si definimos 9 y 4 como enteros “int”, 9 / 4 devuelve de resultado 2 en lugar de 2,25 ya que el 9 y 4 se valores de tipo entero “int” (enteros) y no se reconocen los decimales con este tipo de datos.

Esto también significa que la operación puede sufrir un desbordamiento si el resultado es más grande que lo que puede ser almacenada en el tipo de datos. Recordemos el alcance de los tipos de datos numéricos que ya hemos explicado anteriormente.

Si los operandos son de diferentes tipos, para el cálculo se utilizará el tipo más grande de los operandos en juego. Por ejemplo, si uno de los números (operandos) es del tipo float y otra de tipo integer, para el cálculo se utilizará el método de float es decir el método de coma flotante.

Elegir el tamaño de las variables de tal manera que sea lo suficientemente grande como para que los resultados sean lo precisos que deseamos. Para las operaciones que requieran decimales utilizar variables tipo float, pero ser conscientes de que las operaciones con este tipo de variables son más lentas a la hora de realizarse el cómputo.

Las operadores compuestos combinan una operación aritmética con una variable asignada. Estas son comúnmente utilizadas en los bucles tal como se describe más adelante. Estas asignaciones compuestas pueden ser:

Operadores de comparación. Las comparaciones de una variable o constante con otra se utilizan con frecuencia en las estructuras condicionales del tipo if, while, etc.. para testear si una condición es verdadera.

Los operadores lógicos o booleanos son usualmente una forma de comparar dos expresiones y devuelve un VERDADERO o FALSO dependiendo del operador. Existen tres operadores lógicos, AND (&&), OR (||) y NOT (!), que a menudo se utilizan en estamentos de tipo if.

También existen operadores para los Strings:

Un resumen de los operadores en C /C++ y más información:http://es.wikipedia.org/wiki/Anexo:Operadores_de_C_y_C%2B%2B

Práctica: Arrays, strings y Strings

Ejercicio: Aprender a manejar strings y Strings

Revisar todos estos tutoriales y ver como funciona cada uno:

Ejercicio: Partiendo de la base del ejercicio StringsComparisonOperators intentar hacer las mismas operaciones pero con string en lugar de String.

Ejercicio: Hacer una versión donde al reiniciar Arduino pregunta que introduzca un string cualquiera y lo paso por puerto serie. Luego lo almacena en una variable y muestra lo leido por el puerto serie.

No olvidar poner en el setup() la inicialización del puerto serie: Serial.begin(9600);

Para leer por el puerto serie:

while (Serial.available() == 0){
//Ho hago nada
}

do{
caracter_leido = Serial.read();
cadena_Leida += caracter_leido;
delay(5);
}  while (Serial.available() > 0);

Ejercicio: Hacer otra versión donde me pide un número al reiniciar Arduino y lo paso por el puerto serie. Luego multiplicar por 15 ese número y sacar por el puerto serie el resultado. En caso que lo introducido no sea un número sacar por pantalla el error.

Esto lo aplicaremos en la práctica de dimmer para manejar la luminosidad de un led con un valor que paso por el puerto serie más adelante.

Recordar que es necesario usar la función toInt(): http://arduino.cc/en/Reference/StringToInt

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/blob/master/Ejercicio18-strings/Ejercicio18-strings.ino

Arrays y Strings

Arrays – Un array es un conjunto de valores a los que se accede con un número índice. Cualquier valor puede ser recogido haciendo uso del nombre de la matriz y el número del índice. El primer valor de la matriz es el que está indicado con el índice 0, es decir el primer valor del conjunto es el de la posición 0. Un array tiene que ser declarado y opcionalmente asignados valores a cada posición antes de ser utilizado.

int miArray[] = {valor0, valor1, valor2}

Del mismo modo es posible declarar un array indicando el tipo de datos y el tamaño y posteriormente, asignar valores a una posición específica:

  • int miArray[5];
  • miArray[3] = 10;

Para leer de un array basta con escribir el nombre y la posición a leer:

  • x = miArray[3];

Utilizando un bucle tipo for, el contador comienza en cero 0 y escribe el valor que figura en la posición de índice 0 en la serie que realizada sigue escribiendo en las siguientes posiciones. Con un bucle for podremos recorrer un array ya sea para leerlo o para escribir en él.

int myPins[5];
int i;
for (i = 0; i < 5; i = i + 1) {
Serial.println(myPins[i]);
}

No se puede crear un array sin definir su tamaño, sino da un error de compilación.

Los arrays sólo pueden contener elementos del mismo tipo de datos. Si quisiéramos guardar tipos de datos diferentes en una misma variable, C nos ofrece la opción definir estructuras: http://www.ib.cnea.gov.ar/~icom/web/estructuras.htm

Ver más información en: http://arduino.cc/en/Reference/Array

Es posible definir arrays de varias dimensiones o matrices, simplemente haciendo un arrary de arrays:

int matriz[5][5];

matriz[2][0] = 3;

Ejercicio: Hacer las otras el ejercicio del coche fantastico con un array de 6 elementos.

string – Es un array de chars.

Cuando se trabaja con grandes cantidades de texto, es conveniente usar un array de strings. Puesto que los strings son en si mismo arrays.

Ver:

String – Se trata de una clase que permite usar y manipular cadenas de texto de una forma más sencilla que los strings. Puedes concatenar, añadir, buscar, etc… usando los métodos/funciones que ofrece esta clase.

Los Strings tienen un uso intensivo de memoria, pero son muy útiles.

Tener en cuenta que al no ser un tipo de dato propiamente dicho sino una clase, tienes unas funciones asociadas (métodos), operadores y unas propiedades. Es una abstracción del dato y para saber usarlo hay que leerse la documentación correspondiente.

Ver documentación de Arduino sobre la clase String:

Además de la clase String, podemos utilizar las funciones estándar de C++ para manipular strings y hacer lo mismo que hacemos con la clase String, pero de una forma más compleja, donde tendremos que manejarnos bien con los punteros.

Conversiones de tipos (Casting)

En ocasiones es necesario forzar el cambio de tipo de dato (casting). Podemos usar las siguientes funciones:

Constantes

Las constantes son generalmente definidas a nivel módulo, escritas con todas las letras en mayúscula y con guiones bajos separando palabras. Por ejemplo, MAX_OVERFLOW y TOTAL.

El modificador const, modifica el comportamiento de una variable haciéndola “read-only”, esto significa que puede usarse como cualquier otra variable pero su valor no puede ser cambiado.

Ver ejemplo en: http://arduino.cc/en/Reference/Const

Constantes predefinidas en Arduino: http://arduino.cc/en/Reference/Constants