Arduino / C++

Arduino / C++

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:

  1. 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.
  2. 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.
  3. 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;
  1. 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.
  2. 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.
  3. = Este es el operador de asignación. Se utiliza para asignar un valor a la variable.
  4. 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
}
  1. Palabra clave switch: La declaración comienza con la palabra clave switch, seguida de una expresión entre paréntesis (). Esta expresión es evaluada y su resultado es comparado con los valores de los case.
  2. case: Después de switch, puedes tener varios case, cada uno seguido de un valor o una expresión constante. Si el resultado de la expresión coincide con uno de los valores de case, se ejecuta el bloque de código asociado.
  3. 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.
  4. break: Después de cada bloque de código de case, es importante incluir la palabra clave break. Esto indica que una vez que se ha ejecutado el bloque de código correspondiente, el programa debe salir del switch y continuar con la ejecución del código fuera de él. Si omites break, el programa continuará ejecutando los casos siguientes, incluso si la condición no se cumple.
  5. default: Opcionalmente, puedes incluir un default al final del switch. 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 estructura if-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.

GRACIAS POR VISITAR DIYMAKE

Índice