Cargar variables de forma elegante en funcion del diseño ?? SOLUCIONADO

Hola

Esta vez necesito ayuda para realizar de forma mas elegante lo que estoy haciendo rudimentario, me explico:

Tengo varias placas arduino para control domotico, a las que he colocado un shield casero de entradas y salidas que a su vez va a diferentes sitios (casa, garage, almacen) y por lo tanto las salidas y entradas cambian, es decir, si tengo un pin como salida que activa la lampara del salon, y otro que activa la lampara auxiliar del salon, estas salidas no existen cuando esa placa va al garage, alli solo activa la lampara principal, por lo que la salida de lampara auxiliar no existe.

En el caso del almacen o jardin, existen unas salidas para encender el riego que en la placa general no existen.

Por ejemplo, algo de codigo:

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire conectado en port 2 del arduino
#define ONE_WIRE_BUS 69

// Definimos una instancia de oneWire para comunicar con cualquier dispositivo oneWire
OneWire oneWire(ONE_WIRE_BUS);

// Pasamos la referencia a libreria Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// Pines del Display del Mega
LiquidCrystal lcd(62, 63, 64, 65, 66, 67);

// Pines Salidas de lamparas y valvulas
int SAL_LMPGral   = 11;  // Pin salida lampara general 
int SAL_LMPAux1  = 12;  // Pin salida lampara auxiliar
int SAL_Valv1       = 13;  // Pin salida electrovalvula1 
int SAL_Valv2       = 14;  // Pin salida electrovalvula2

Normalmente, voy ampliando cada modulo y obviamente, corto y pego definiciones segun donde vaya el modulo, ya que en algunos casos la lampara 1 va conectada en el 11 pero en otros uso ese pin para otra funcion.

La pregunta:
¿como podria de forma elegante crear un fichero o algo del estilo del include, que tuviera las definiciones de cada pin y digamos, parametros de configuracion, manteniendo el programa original en pde y añadiendo algo parecido a la carga de librerias en la cabecera del pde?

De forma que tendria un programa general y segun esos ficheros solo usaria una parte u otra del programa, lo que permitiria que solo modificara el programa general y añadiria a la compilacion solo el fichero de configuracion segun donde vaya instalado, algo asi como esto:

include "fichero_de_configuracion_para_la casa"

o en otro caso esto:

include "fichero_de_configuracion_para_jardin"

No se si me he explicado bien la idea, caso contrario amplio.

A ver si podeis darme una orientacion...

Gracias y un saludo

PD: Añado a ver si queda mas clara la idea

En el caso de sensores de alarma, por ejemplo, en el que va en casa, tiene tres entradas, o sea, puerta 1 puerta 2 puerta 3, pero en el garage solo existe una puerta 1,

Con esa forma de configuracion, el programa general chequearia todas las puertas salvo que en el fichero de configuracion le hubiera dicho que solo existe una, con lo cual obviaria puerta 2 y puerta 3, solo estaria checkeando puerta 1

PD2: He editado este mensaje para aclarar que no es una sola unidad, que son varios arduinos.

Si no he entendido mal tienes una placa con un Shiel hecho por ti, según la zona de la casa que quieras controlar cargas un Sketch u otro y quieres incluirlo todo en el mismo código....

a) utiliza una placa para cada zona, es más sencillo.

b) utiliza condicionales el el setup() para que al arrancar configure las entradas y las salidas de una u otra forma según la zona en la que pinches la Arduino, tendrás que encontrar la forma de que la Arduino sepa donde está al inicializarse.

c) utiliza recursos de compilación condicional (#if) para que el Sketch se compile de una forma u otra según para la zona que lo quieres utilizar, esto se usa normalmente para depurar código. Personalmente no me gusta esta opción, pero puedes usarla.

d) durante la ejecución de un Sketch puedes cambiar la definición de entradas y salidas, solo tienes que implementarlo en el código.

Espero alguna de las soluciones te sirva de algo.

P.D.: si te decides por la solución a visita mi tienda, que tengo las Arduino UNO a buen precio y con inmejorables gastos de envío. Y esta tarde meteré los Proto-Shield.

Gracias Josemanu

En realidad tengo 5 arduinos megas y cinco shields (que se iran ampliando al doble por lo menos), el programa pde es el mismo mas o menos para todas las placas, lo unico que para cada zona o sitio donde quiero instalar cada conjunto de estos (arduino mega+shield) tengo que darle una configuracion u otra en el pde, a nivel de definiciones y tengo que activar unas funciones o quitarselas (por ejemplo, en alguna zona no necesito que lea la temperatura, pero en otra si)

La idea era algo asi (ojo, voy a decir una burrada pero es para que se me entienda mejor)
Era en el pde original, cargar una "libreria" asi

#include "fichero de definiciones de tal sitio".def

en un caso seria #include "garage.def"
o este otro: #include "cocina.def"

O tendria todas las lineas y solo decomento la que uso:
// # include garage.def

include cocina.def //..usaria esta para cargar el pde del arduino de la cocina.

// # include dormitorio.def
// # include taller.def

y el resto todo el pde normal y generico para todos los modulos.

Pero no se como hacer algo asi, como se pone que un programa cargue un fichero de definiciones o algo de eso??

Eso es mi duda.

Es como si estuvieramos hablando de ordenadores a los que le cargas un autoexec u otro en funcion de adonde va.

Ahora mismo, tengo que ir al programa original y modificar modulos, corta pega... quita esto, pon lo otro y es aparte de susceptible de fallos engorroso.

de la otra forma seria incluir una linea en la cabecera y que compile para ese sitio.

Otra opcion que barajo pero que no se aun hacerlo seria utilizando una tarjeta sd y que el programa cargue en memoria un fichero de configuracion, del estilo del ide del arduino, por ejemplo (preferences.txt) pero esto lo hare mas adelante ya que seria en tiempo de ejecucion y mi idea era hacerlo en el momento del compilado.

Gracias y un saludo

PD: Tomo nota de la tienda.

Si en el IDE pinchas en la flecha que hay en la derecha entre el menu y la zona del programa puedes añadir una pestaña, que realmente se guardará luego como otro archivo, y en el que puedes poner lo que quieras, por ejemplo la parte de configuracion de los pines.

Una posible solución a tu problema es renombrar ese archivo segun te vaya interesando.

La idea de usar el preprocesador es buena....

#define OPCION 1
#if (OPCION==1)
** //tu codigo para opcion 1**
#endif **
#if (OPCION==2)
** //tu codigo para opcion 2

#endif

O usando #if defined...

En el core Arduino, puedes ver muchos ejemplos de cómo lo hacen dependiendo que micro ha sido seleccionado..... Por ejemplo:

#if defined(AVR_ATmega1280) || defined(AVR_ATmega2560)
** const static uint8_t SS = 53;**
** const static uint8_t MOSI = 51;**
** const static uint8_t MISO = 50;**
** const static uint8_t SCK = 52;**
#else
** const static uint8_t SS = 10;**
** const static uint8_t MOSI = 11;**
** const static uint8_t MISO = 12;**
** const static uint8_t SCK = 13;**
#endif

Gracias Esog Enaug e Igor R

Con respecto a la opcion que me dices Esog Enaug, si, es una opcion, aunque no es la que busco pero se puede utilizar.

Con respecto a la que me comentas Igor R, le veo una pega dirigida a mi uso, es que en el programa tengo que añadir "n" Lineas x la cantidad de diferentes combinaciones que al final se traducen en usar ram, y me queda como una "espinita" ten en cuenta que soy de la epoca del cobol, turbopascal y de cuando las maquinas tenias que liberar variables porque si no te quedabas sin los 256Kb de memoria ram (a lo sumo 512), y es como que me ha quedado un poco el vicio de intentar ahorrar redundancia o memoria... no se... vamos como una mania que no me quedo tranquilo de ver el codigo como desperdiciando sentencias if.

Buscaba algo mas del estilo de cargar parametros, algo asi como las librerias.

Que me parece voy a tener que aprenderme estas aunque sea para cargar esos datos.

Gracias de todas formas, sigo intentando.

Un saludo.

Perdonar... que he podido leer un poco lo del include y creo que he entendido mal.

¿El include segun leo, se emplea para cargar un header.h?

Por lo que entiendo, pregunto:

¿ Yo podria crear un fichero header.h que contuviera las definiciones de pines y simplemente al añadir la clausula include me cargaria esas definiciones?

¿Es asi como trabaja?

Porque si es asi, creo que es justo lo que ando buscando.

Corregirme si me equivoco pero ¿esto seria valido?

Contenido del fichero garage.h:
int SAL_LMPGral = 11; // Pin salida lampara general
int SAL_LMPAux1 = 12; // Pin salida lampara auxiliar
int SAL_Valv1 = 13; // Pin salida electrovalvula1
int SAL_Valv2 = 14; // Pin salida electrovalvula2

Llamada al fichero garage.h en el pde general:

#include garage.h
....
....
digitalwrite(sal_Valv1,High);
....

¿¿ esto es valido ??

Un saludo.

PD: Es que mi ingles no es lo bueno que quisiera...
No me da tiempo a montar "el tenderete" que salgo de viaje pero en volver pruebo a ver si funciona, si entremedio me podeis decir algo fenomenal. Gracias.

Puedes programar tus propias librerías con las definiciones que quieras, pero cuando cargas una librería cargas todo el código de esta, por lo que no tiene mucho sentido con lo que dices de liberar memoria.

Para ello la opción de la compilación condicional. Genera un .pde mucho más largo ya que contiene todas las combinaciones, pero al compilar se tienen en cuenta las sentencias #if y si no se cumplen esa parte del código no se compila, con lo que el archivo compilado es más pequeño que si le cargas una librería con todas las definiciones.

Échale un ojo a este enlace, creo que puede serte útil:

Un saludo!

Muchas Gracias compañeros
Ya esta solucionado tal y como me apuntabais, por cierto, el enlace en Español genial.
Comento para los nuevos como yo para que puedan guiarse:

Al final he incorporado una clausula include al principio del programa, y he guardado el fichero que quiero incluir en la misma carpeta que el PDE, con lo cual, me aparecen las dos pestañas del compilador que me apuntabais.

Lo he puesto con el ejemplo del blink para que sea mas facil, a partir de ahi modificamos a nuestro gusto, en mi caso me he creado varios ficheros para cada situacion con las definiciones que queria de pines y funciones y uso en funcion del include el que quiero.

Al fichero le he llamado definiciones.h aunque supongo que otras extensiones u otra ruta le valdra al compilador, su codigo:

definiciones.h
int ledPin =  13;    // LED connected to digital pin 13

Blink.pde

#include "definiciones.h"

void setup()   {                
  // initialize the digital pin as an output:
  pinMode(ledPin, OUTPUT);     
}

// the loop() method runs over and over again,
// as long as the Arduino has power

void loop()                     
{
  digitalWrite(ledPin, HIGH);   // set the LED on
  delay(100);                  // wait for a second
  digitalWrite(ledPin, LOW);    // set the LED off
  delay(100);                  // wait for a second
}

Un saludo.