Crear funciones externos

Buenas:

Para no tener un archivo.ino de Arduino con muchas funciones en el mismo archivo.

¿Se puede crear un archivo a parte archivo2.ino que solo tiene funciones que se les llama en el programa princiopal?

No quiero saturar todo de códigos en el archivo principal de Arduino. El asm de los PIC con MPLAB se puede hacer de maravilla, por eso se me ocurre si tambiñen se puede.

Saludos.
 
Aunque se puede, ahora no recuerdo cómo. Lo he visto una vez pero lo veo poco útil.
También puedes hacer una librería.
 

Dr. Zoidberg

Well-known-Papá Pitufo
Es muy simple:
En el IDE de Arduino creas dos archivos adicionale: uno con extensión .cpp y otro .h
En el primero pones las funciones y en el segundo pones los prototipos y otras declaraciones que necesites.
Por ultimo agregás un #include con el .h dentro del archivo .ino y compilás
 
Holas:

@Scooter
¿Poco útil?
Hasta cualquier IDE o compilador lo incluye precisamente porque es muy útil, por el tema de organización y calidad en los trabajos.

@Dr. Zoidberg
Si es posible, no usar librerías .h ni .cpp. ;) Solo archivos .ino, varios y uno de ellos es el padre. Como ocurría con .asm y demás en .inc para ensamblador de los pic.

Saludos.
 

Dr. Zoidberg

Well-known-Papá Pitufo
Si es posible, no usar librerías .h ni .cpp. ;) Solo archivos .ino, varios y uno de ellos es el padre. Como ocurría con .asm y demás en .inc para ensamblador de los pic.
El .ino es C no assembler, y en C no hay forma que yo conozca de que un archivo pueda usar las funciones de otro archivo sin hacer un #include. Por otra parte, el partir en .h y en .cpp optimiza el build por que solo recompila lo que haya sido modificado y no un archivo con chotocientas líneas directas e incluidas.

Probá de hacer un .ino y meterlo en un #include y mirá que pasa...pero no es así como se debe trabajar.
 
Hola:

Si funciona, solo crear la .h como dices, no hace falta el .cpp.

Incluyo el como dices.
C:
#include "Setup.H"
Paso 1.


Paso 2.


Paso 3.


Compila de maravilla. Ahora si que me organizo mejor.

Funciones que funcionen, pues a parte y no molesta tantos códigos.

Ya que nombran a parte de la .h también el .cpp.

¿Puedes mostrar algúnejemplo sencillo sobre el uso del .h y .cpp para verlo?

Saludos. muchas gracias camaradas.
 
Las funciones se ponen en el cpp, los archivos h sirven como declaración de las clase/funciones(o métodos)/variables/definiciones que tiene/usa el cpp.

Ejemplo en Visual C++:

- Archivo Aritmetica.h:

C++:
namespace LibreriaAritmetica {

    public ref class Aritmetica
    {
        // TODO: agregar aquí los métodos de la clase.
        public:
            //---------- Constructor/Destructor -----------//
            Aritmetica();
            ~Aritmetica();
            //---------- Constructor/Destructor -----------//

            double Suma(double a, double b);
            double Resta(double a, double b);
            double Multiplicacion(double a, double b);
            double Division(double a, double b);
    };
}
- Archivo Aritmetica.cpp:

C++:
#include "stdafx.h"
#include "Aritmetica.h"

namespace LibreriaAritmetica {

    Aritmetica::Aritmetica()
    {
        return;     
    }

    Aritmetica::~Aritmetica()
    {
        return;     
    }

    double Aritmetica::Suma(double a, double b)
    {
        return a+b;
    }

    double Aritmetica::Resta(double a, double b)
    {
        return a-b;
    }

    double Aritmetica::Multiplicacion(double a, double b)
    {
        return a*b;
    }
  
    double Aritmetica::Division(double a, double b)
    {
        if(b!=0)
            return a/b;
        else
            return 0;
    }
}
Luego lo llamarías de esta forma desde main.cpp:

C++:
#include "stdafx.h"
#include <iostream>
#include "Aritmetica.h"

using namespace System;

int main(array<System::String ^> ^args)
{
    LibreriaAritmetica::Aritmetica prueba;
  
    std::cout << "Suma= " << prueba.Suma(1,2) << std::endl;
    std::cout << "Resta= " << prueba.Resta(4,2) << std::endl;
    std::cout << "Multiplicacion= " << prueba.Multiplicacion(4,2) << std::endl;
    std::cout << "Division= " << prueba.Division(4,2) << std::endl;
  
    system("pause");
    return 0;
}
El namespace lo podrías obviar y directamente hacer una clase. Si no usaras clases, directamente pondrías la función y estarías haciendo un C encubierto.

Obviamente tené en cuenta que esto es Visual C++, habrá diferencias con el compilador de Arduino, pero la idea es esa.

PD: el constructor y el destructor lo podés hacer, como no.
 
Hola:

Puedes instalar el programa que compila Arduino en Visual Studio Community 2019.

Intenté hacer lo que hiciste con Visual C++ 2019, bajo C++ nativo o win32. No me genera el namespace y lo si hago manual, no funciona tu código.



¿Qué versión usas?

Saludos.
 

Adjuntos

Buenas:

Lo probé y no me funciona. Problema de versiones. Es muy vieja la versión de Visual Studio que haces.

Al final haciendo cambios de cosas actualizadas, tu ejemplo o archivo que descargué, si funcionó.

Si hago un copia pega como hice al principio, no funciona.

Es lo malo que tiene los C++ nativos con los años.

Los namespace no los crea, solo en el C++ CLR o .net.

¿Puedes hacer esos cálculos de aritmética en Arduino con sus .h y .cpp?

Hice esto y me da problemas.

Principal.ino
C:
#include "Setup.h"
#include "Sal.cpp"

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
}

void loop()
{
  parpadeo();
  saludar();
}
Sal.cpp
C:
void saludar
{
  Serial.print("Hola");
}
Setup.h
C:
void parpadeo()
{
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);
}
Al compilar me da esto:
Arduino:1.8.13 (Windows 10), Tarjeta:"Arduino Uno"





















Sal.cpp:1:6: error: variable or field 'saludar' declared void

void saludar

^~~~~~~

Sal.cpp:3:3: error: 'Serial' was not declared in this scope

Serial.print("Hola");

^~~~~~

Sal.cpp:3:23: error: expected '}' before ';' token

Serial.print("Hola");

^

Sal.cpp:4:1: error: expected declaration before '}' token

}

^

In file included from C:\Users\Meta\Documents\Arduino\Archivo_externo\Archivo_externo.ino:5:0:

Sal.cpp:1:6: error: variable or field 'saludar' declared void

void saludar

^~~~~~~

Sal.cpp:3:23: error: expected '}' before ';' token

Serial.print("Hola");

^

Sal.cpp:4:1: error: expected declaration before '}' token

}

^

exit status 1

variable or field 'saludar' declared void



Este informe podría contener más información con
"Mostrar salida detallada durante la compilación"
opción habilitada en Archivo -> Preferencias.
Saludos.
 
Última edición:
Buenas:

Lo probé y no me funciona. Problema de versiones. Es muy vieja la versión de Visual Studio que haces.

Al final haciendo cambios de cosas actualizadas, tu ejemplo o archivo que descargué, si funcionó.
Siempre hay que adaptarse un poco, pero la idea sigue siendo la misma.

¿Puedes hacer esos cálculos de aritmética en Arduino con sus .h y .cpp?
No uso Arduino, asi que no sabría decirte. Tampoco suelo usar C++ en uC, en C que se le parece, funciona (obviamente, sin clases).
 
Al menos tienes Visual Studio, sea de C++. Ya estamos en las versiones 16 y usas la 10. Muchos años de viejo ese IDE.
 
Exacto, pero no me funcionó, tendré que mirarlo a fondo.

Las variables de C# quiero pasarlo a C++ nativo.
C#:
#include <iostream>

using namespace std;

int main()
{
    // Variables.
    static string guardarNombre = ""; // Guardar nombre escrito.
    static int coordenadaX = 0; // Coordenada X del setCursorPisition.
    //static ConsoleKey tecla; // Guarda cualquier tecla pulsada.
    static int index = 0; // Índice.

    // Caracteres de este array.
    static char[] roALFANUMERICO = new char[]
    {
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P',
            'Q', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
            'i', 'j', 'k', 'l', 'm', 'n', 'ñ', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'y',
            'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',', '-', '_', ':', ';',
            '¿', '?', '(', ')', '[', ']', '{', '}', '=', '$', '&', '"', ' '
    };

    // Dirección del carácter del array. El 80 presenta al espacio ' ' del array roALFANUMERICO.
    static int[] roINDICE_ARRAY = new int[]
    {
        80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80
    };

    // Palabras del array para imprimir en pantalla.
    static string[] roTEXTO = new string[]{ "ATRÁS", "GUARDAR" };
}
Por lo que veo, no son idénticas.

Saludos.
 
Yo creo que ya ni vale la pena molestarse, se preocupa por lo menos importante. :ROFLMAO:

Para trabajar con C++ en C#, tenés que crear una DLL, tenés dos formas, unmanaged (no recomendado) y managed. Las dos funcionan bien en conjunto con C#.
 
Es que quiero que se parezca C# a C++, porque C++ se parece a C de Arduino.

Quiero hacer este código para Arduino con el LCD 20x4. Es un ejemplo que lo puedes ver en PC si no dispones de Arduino.
Solo funciona con las teclas de flechas y la tecla Enter.

Avisa y me cuentas si sabes de que va.
 

Adjuntos

Dr. Zoidberg

Well-known-Papá Pitufo
Es que quiero que se parezca C# a C++, porque C++ se parece a C de Arduino.
Es que Arduino no es C sino C++ pero ambos se parecen y todos creen que es C....hasta que empezás a usar Serial.begin(...) pero como no tienen NPI les dá lo mismo.

Como C# y C++ comparten bastaaaante, si nó usas namespaces ni toda la sanata de Mocosoft la conversión es casi directa.
 
C# es un paseo al lado de C++. Lo mismo que Java.

¿No es más fácil programar directamente desde Arduino en vez de hacer la simulación en C#?

Incluso usando el puerto serie como debug, resulta sencillo hacer las pruebas.
 
Porque lo quiero distribuir en PC, si no tienen Arduino mano aún y sepan de que va la historia, ejjejejjee.
 

Temas similares


Arriba