
El lenguaje de programación de Arduino está diseñado para ser fácil de aprender y utilizar, incluso para personas sin experiencia previa en programación. Se centra en la escritura de código simple y claro para controlar dispositivos electrónicos
Introducción
Si bien Arduino utiliza C++ como base existen alternativas para programar placas de desarrollo similares a Arduino utilizando diferentes lenguajes de programación o entornos de desarrollo. Algunas de estas alternativas incluyen:
- MicroPython: Es una implementación de Python para microcontroladores. Permite programar placas de desarrollo como las de Arduino utilizando Python, lo que puede resultar más accesible para aquellos que ya están familiarizados con este lenguaje de programación.
- Blockly: Es un lenguaje de programación visual que permite a los usuarios crear programas utilizando bloques gráficos en lugar de escribir código. Hay versiones de Blockly diseñadas específicamente para programar placas de desarrollo como Arduino, lo que lo hace ideal para principiantes o para enseñar programación a niños.
- Scratch: Similar a Blockly, Scratch es un entorno de programación visual que utiliza bloques gráficos para crear programas. Aunque no está diseñado específicamente para programar placas de desarrollo como Arduino, se puede usar en combinación con extensiones para controlar hardware.
Variables
Para empezar cabe destacar la sintaxis con la tenemos que declarar las variables es siguiente
type variableName = value;
- type: Este es el tipo de dato de la variable que estás declarando. En muchos lenguajes de programación, esto puede ser un tipo de dato incorporado como
int
,float
,string
, etc., o puede ser un tipo de dato definido por el usuario. - variableName: Este es el nombre que le das a la variable. Debería ser único dentro del alcance en el que se declara la variable y seguir las reglas de nomenclatura del lenguaje de programación específico. Por lo general, los nombres de variables son descriptivos para ayudar a entender su propósito en el código.
- = Este es el operador de asignación. Se utiliza para asignar un valor a la variable.
- value: Este es el valor que se asigna a la variable. Puede ser un valor literal, una expresión o el resultado de una función. Dependerá del tipo de datos de la variable y de lo que quieras que contenga.
- int: almacena números enteros (números sin decimales), como 123 o -123.
- double: almacena números de punto flotante (números con decimales), como 19.99 o -19.99.
- char: almacena caracteres individuales, como ‘A’ o ‘B’. Los valores de char están rodeados por comillas simples.
- string: almacena texto, como «Hola Mundo». Los valores de string están rodeados por comillas dobles.
- bool: almacena valores con dos estados: verdadero (true) o falso (false).
Ejemplos
int myNum = 3; // Entero (número entero sin decimales) double myFloatNum = 15.85; // Número de punto flotante (con decimales) char myLetter = 'D'; // Carácter A B C D etc. string myText = "diymake"; // Cadena de texto (texto) bool myBoolean = true; // Booleano (verdadero o falso) (true or false)
Norma general para declarar variables
La norma general es comenzar los nombres de las variables con minúsculas. Si el nombre de la variable consta de varias palabras, puedes escribir la primera letra de cada palabra en minúscula, excepto la primera palabra. Esto se conoce como notación camelCase. Por ejemplo:
miVariable edadUsuar nombreCompleto
Siguiendo esta convención, se mejora la legibilidad del código y se mantiene la consistencia, lo que facilita la comprensión del código por parte de otros programadores y ayuda a evitar posibles conflictos con palabras clave reservadas o nombres de clases
Variables Identifiers and Constants
Variable: Una variable es un contenedor que almacena un valor que puede cambiar durante la ejecución del programa. Se declara utilizando una palabra clave (como int
, double
, char
, etc.) seguida de un nombre único y opcionalmente se le asigna un valor inicial. Puedes cambiar el valor de una variable en cualquier momento durante la ejecución del programa. Por ejemplo:
int edad = 25; // Variable "edad" que inicialmente contiene el valor 25 edad = 30; // Se asigna un nuevo valor a la variable "edad"
Constante: Una constante es un valor que no cambia durante la ejecución del programa. Se declara utilizando la palabra clave const
seguida de un tipo de dato y un nombre único, y se le asigna un valor inicial que no puede modificarse posteriormente. Las constantes se utilizan para representar valores que son conocidos y no cambian, como pi (π) Por ejemplo:
const double PI = 3.14159; // Constante "PI" que contiene el valor de pi // También se puede sin ningún problema convertir una variable en constante como ejemplo const int DIAS_SEMANA = 7; // Constante "DIAS_SEMANA" que contiene el valor 7 const std::string MENSAJE_BIENVENIDA = "¡Hola mundo!"; // Constante "MENSAJE_BIENVENIDA" que contiene una cadena de texto
Operadores
Los operadores en programación son símbolos o palabras clave que se utilizan para realizar operaciones sobre variables y valores. Estas operaciones pueden ser aritméticas, de asignación, de comparación, lógicas, entre otras veamos uno por uno.
OPERADORES ARITMÉTICOS
+ SUMAR a + b - RESTAR a - b * MULTIPLICAR a * b / DIVIDIR a / b % RESTO DE LA DIVICION a % b
OPERADORES DE ASIGNACIÓN
Los operadores de asignación asignan un valor a una variable y también se pueden realizar sumas en asignación y de todos los operadores aritméticos
= ASIGANAR UN VALOR +- SUMAR EN ASIGNACION -= RESTAR EN ASIGNACION *= MULTIPLICAR EN ASIGNACION /= DIVICION EN ASIGNACION %= MODULO EN ASIGNACION
OPERADORES RELACIONALES
Los operadores relacionales son para comparar dos valores literales o valores de las variables, y de acuerdo a la comparación devuelve un valor booleano si es verdadero o falso
== IGUALDAD != DISTINTO > MAYOR QUE < MENOR QUE >= MAYOR O IGUAL QUE <= MENOR O IGUAL QUE
OPERADORES LÓGICOS
Los operadores lógicos niegan y comparan dos valores booleanos y devuelven otro valor booleano, cada uno tiene sus propios reglamentos
NOT (!) EL OPERADOR NIEGA UN VALOR BOOLEANO LO CONVIERTE ! true = false EJEMPLO --- (! true) LA SALIDA VA A SER false. AND (&&) EL OPERADOR HACE UNA FUNCION DE Y EJEMPLO --- (a && b) la salida a y b; OR (||) EJEMPLO --- (! true) LA SALIDA VA A SER false.
OPERADORES DE POSTINCREMENTO Y POSTDECREMENTO
Incremento de 2 veces int = c = 0 c++ c++ System.out.println(c); Desincremento de 2 veces int = c = 0 c-- c-- System.out.println(c);
Condicionales
Los condicionales, son una estructura de control esencial al momento de programar y aprender a programar. La mayoría de los lenguajes de programación utilizados actualmente (por no decir que todos), nos permiten hacer uso de estas estructuras para definir ciertas acciones, condiciones especificas en nuestros algoritmos y programas. Veamos un poco mas de cerca "if
» – «if-else
» «switch
«
La estructura de control condicional "if
« es una de las más básicas y fundamentales en la programación. Se utiliza para tomar decisiones en función del valor de una expresión, veamos un ejemplo practico.
"if
«
void setup() { Serial.begin(9600); // Inicializar el puerto serie } void loop() { int edad; // Pedir al usuario que introduzca la edad Serial.println("Introduce tu edad:"); // Esperar a que se reciba un dato por el puerto serie while (!Serial.available()) { // Esperar hasta que haya datos disponibles } // Leer el número introducido edad = Serial.parseInt(); // Imprimir la edad introducida Serial.print("Tu edad es: "); Serial.println(edad); // Verificar si es mayor de edad if (edad >= 18) { Serial.println("Eres mayor de edad"); } delay(1000); // Esperar un segundo antes de repetir }
«if-else
«
La estructura if-else
es como una bifurcación en el camino del programa. Si la condición dentro del if
es verdadera, el programa sigue por un camino, ejecutando el bloque de código dentro del "if
«. Si la condición no es verdadera, el programa toma el otro camino, ejecutando el bloque de código dentro del "else
»
void setup() { Serial.begin(9600); // Inicializar el puerto serie a 9600 baudios } void loop() { int edad; // Pedir al usuario que introduzca la edad Serial.println("Introduce tu edad:"); // Esperar a que se reciba un dato por el puerto serie while (!Serial.available()) { // Esperar hasta que haya datos disponibles } // Leer el número introducido edad = Serial.parseInt(); // Imprimir la edad introducida Serial.print("Tu edad es: "); Serial.println(edad); // Verificar si es mayor de edad if (edad >= 18) { Serial.println("Eres mayor de edad"); } else { Serial.println("Eres menor de edad"); } delay(1000); // Esperar un segundo antes de repetir }
«switch
«
La estructura de control switch
es otra forma de tomar decisiones en un programa, pero se diferencia del if-else
en que permite seleccionar un bloque de código para ejecutar entre múltiples opciones posibles. Veamos un ejemplo básico.
switch (expresión) { case valor1: // Bloque de código si la expresión coincide con valor 1 break; case valor2: // Bloque de código si la expresión coincide con valor 2 break; // Pueden haber más casos aquí default: // Bloque de código si no se cumplen ninguno de los casos anteriores }
- Palabra clave
switch
: La declaración comienza con la palabra claveswitch
, seguida de una expresión entre paréntesis()
. Esta expresión es evaluada y su resultado es comparado con los valores de loscase
. case
: Después deswitch
, puedes tener varioscase
, cada uno seguido de un valor o una expresión constante. Si el resultado de la expresión coincide con uno de los valores decase
, se ejecuta el bloque de código asociado.- Bloque de código: Este es el bloque de código que se ejecuta si la expresión coincide con el valor especificado en el
case
. break
: Después de cada bloque de código decase
, es importante incluir la palabra clavebreak
. Esto indica que una vez que se ha ejecutado el bloque de código correspondiente, el programa debe salir delswitch
y continuar con la ejecución del código fuera de él. Si omitesbreak
, el programa continuará ejecutando los casos siguientes, incluso si la condición no se cumple.default
: Opcionalmente, puedes incluir undefault
al final delswitch
. Este bloque de código se ejecutará si ninguno de los casos coincide con el valor de la expresión. Es como el caso «else» en una estructuraif-else
Veamos un ejemplo sobre días de la semana
int diaSemana = 7; switch (diaSemana) { case 1: Serial.println("Lunes"); break; case 2: Serial.println("Martes"); break; case 3: Serial.println("Miércoles"); break; case 4: Serial.println("Jueves"); break; case 5: Serial.println("Viernes"); break; case 6: Serial.println("Sábado"); break; case 7: Serial.println("Domingo"); break; default: Serial.println("Día no válido"); }
Bucles o Ciclos
«for
» «while"
«do-while"
«for
«
El ciclo "for
» se utiliza para ejecutar un bloque de código un número específico de veces. Su sintaxis general es la siguiente:
for (inicialización; condición; actualización) { // Bloque de código a repetir }
- Inicialización: Se realiza una única vez al principio del ciclo. Se utiliza para inicializar una variable de control que se utilizará para iterar sobre el ciclo.
- Condición: Se evalúa antes de cada iteración del ciclo. Si la condición es verdadera, el ciclo continúa; si es falsa, el ciclo termina.
- Actualización: Se ejecuta después de cada iteración del ciclo. Se utiliza para actualizar la variable de control y modificar su valor.
Veamos un ejemplo mas claro
for (int i = 0; i < 5; i++) { Serial.print("El valor de i es: "); Serial.println(i);
"while
«
El ciclo "while
« se utiliza para repetir un bloque de código mientras una condición sea verdadera. Su sintaxis general es la siguiente.
while (condición) { // Bloque de código a repetir }
Condición: Se evalúa antes de cada iteración del ciclo. Si la condición es verdadera, el ciclo continúa; si es falsa, el ciclo termina.
int contador = 0; while (contador < 5) { Serial.print("El valor del contador es: "); Serial.println(contador); contador++;
"do-while
«
El ciclo do-while
es similar al ciclo while
, pero garantiza que el bloque de código se ejecute al menos una vez, incluso si la condición es falsa desde el principio. Su sintaxis general es
do { // Bloque de código a repetir } while (condición);
- Bloque de código: Se ejecuta una vez antes de que se evalúe la condición.
- Condición: Se evalúa después de cada iteración del ciclo. Si la condición es verdadera, el ciclo continúa; si es falsa, el ciclo termina.
int contador = 0; do { Serial.print("El valor del contador es: "); Serial.println(contador); contador++; delay(1000); // Esperar un segundo } while (contador < 5);
Este código imprimirá los números del 0 al 4 en el monitor serie, asegurándose de que el bloque de código se ejecute al menos una vez antes de verificar la condición.
Comentario
En C++ para Arduino, puedes utilizar los mismos métodos de comentado que en C++ estándar.
Comentario de una línea
// Este es un comentario de una línea
Comentario de múltiples líneas
Se utiliza para añadir comentarios que abarcan múltiples líneas. Puedes iniciar y finalizar un comentario de múltiples líneas con /*
y */
.
/* Este es un comentario de varias líneas */
Comentario de documentación
Los comentarios de documentación se utilizan para describir la funcionalidad de una función, método o clase de una manera que pueda ser interpretada por herramientas de generación de documentación. Se inician con /**
y pueden contener etiquetas especiales como @param
, @return
, etc.
/** * Esta función suma dos números enteros y devuelve el resultado. * @param a Primer número a sumar. * @param b Segundo número a sumar. * @return La suma de los dos números. */ int suma(int a, int b) { return a + b; }
Utilizar comentarios es una buena práctica de programación para hacer tu código más legible y comprensible para ti y para otros desarrolladores. Los comentarios te ayudan a explicar tu código y a documentar su funcionamiento, es también una forma de tener el código mas organizado en caso cuando e proyecto es largo.
Math.h functions
La librería math.h
en C/C++ proporciona una serie de funciones matemáticas para realizar operaciones comunes, como funciones trigonométricas, exponenciales, logarítmicas, y otras.
Estas funciones son útiles para resolver una amplia gama de problemas matemáticos y científicos en programación.
Funciones Trigonométricas
cos(x): Coseno (en radianes) sin(x): Seno (en radianes) tan(x): Tangente (en radianes)
Funciones de Valor Absoluto y Modular
fabs(x): Valor absoluto para números flotantes fmod(x, y): Resto de la división de x por y para números flotantes
Funciones de Raíces
sqrt(x): Raíz cuadrada cbrt(x): Raíz cúbica
Otras Funciones Matemáticas
floor(x): Redondeo hacia abajo ceil(x): Redondeo hacia arriba exp(x): Exponencial (e^x) log(x): Logaritmo natural (ln(x)) pow(x, y): Potencia (x^y)
Funciones Hiperbólicas
cosh(x): Coseno hiperbólico (en radianes) sinh(x): Seno hiperbólico (en radianes) tanh(x): Tangente hiperbólica (en radianes)
Funciones Inversas Trigonométricas
acos(x): Arcocoseno (en radianes) asin(x): Arcoseno (en radianes) atan(x): Arcotangente (en radianes) atan2(y, x): Arcotangente de y/x (permite encontrar el cuadrante en el que se encuentra el punto)
Funciones Logarítmicas
log(x): Logaritmo natural (ln(x)) log10(x): Logaritmo en base 10 (log_10 x)
Funciones de Identificación de Números Especiales
isnan(x): Verifica si x es NaN (no es un número) (1 si es verdadero, 0 si es falso) isinf(x): Retorna 1 si x es infinito positivo o negativo, 0 si no lo es isfinite(x): Retorna un valor distinto de cero solo si el argumento tiene un valor finito
Otras Funciones
copysign(x, y): Retorna x con el signo de y (+ o -) signbit(x): Retorna un valor distinto de cero solo si x tiene un valor negativo fdim(x, y): Retorna la diferencia entre x e y si x es mayor que y, de lo contrario retorna 0 fma(x, y, z): Retorna x*y + z fmax(x, y): Retorna el máximo entre x e y fmin(x, y): Retorna el mínimo entre x e y trunc(x): Retorna la parte entera del número con punto flotante round(x): Redondeo matemático lround(x): Redondeo matemático (para números grandes) lrint(x): Redondea el valor de punto flotante especificado al entero más cercano, usando el modo y la dirección de redondeo actuales.