PROGRAMAR C

Hola a todos:
sabria alguien de como programar c o c++ para arduino con algunas "normas" para reducir los kb, o alguna pagina web o un pdf.
muchas gracias de antemano.
un saludo

¿Tienes conocimientos de programación? Si no tienes, te va a costar un poco.

Si acabas de empezar y quieres partir de cero, te recomiendo que empieces buscando algún tutorial sencillo o alguna guía básica para empezar a adquirir fundamentos de programación.

Te aconsejo que huyas un poco de intentar hacer "copypaste" de código ya hecho, porque cogerás todos los vicios de otros y no es la mejor manera de aprender, aunque de primeras "corras más".

Es como aprender a escribir en el teclado, si empiezas con dos dedos, enseguida coges una cierta velocidad, pero si comienzas como se debe, te costará más y parece que no avanzas, pero una vez que adquieres un poco de hábito, volarás muchísimo más rápido que el resto.

Así que si dices el nivel que tienes, será más fácil ayudarte y/o indicarte qué puedes leer

muchas gracias por contestar JohnnyDeauville;
llevo ya casi un año con arduino y creo que me defiendo bien,
claro esta que no soi ningun experto pero hago mis propios programas y funcionando a la perfeccion,
por eso he puesto este post para comprimir al maximo la programacion y por supuesto ocupar menos espacio,
te agradeceria me dijeras algunas normas o trucos para esto.
un saludo.

Hola,

Yo soy mucho menos experto que tu XD, pero yo he reducido bastante el espacio de la memoria en vez de programarlo todo en el loop, intento hacer llamadas a funciones siempre que es posible.

Y también definiendo correctamente las variables con el tipo de dato dato que es (boolean, byte, long, etc) y las constantes como constantes, me explico en vez de poner "int pulsador = 2", poniendo "#define pulsador 2".

No se si te servirá de ayuda.

Saludos

Eso lo irás obteniendo poco a poco a base de replantearte tus soluciones y examinar y entender códigos de otros,que te irán aportando nuevos conocimientos. Si ahora mismo tienes un problema concreto pide ayuda y verás cómo te aportan ideas y estrategias alternativas, y de paso vas pillando "trucos".
De todos modos la arquitectura Arduino hace que haya que devanarse los sesos con el ahorro de flash, RAM,procesador... A poco que abordemos un proyecto "serio". Cuando utilices código de otros no te limites a copiarlo, sino que intenta entenderlo. La mejor forma de aprender buena programación es leer buenos programas.
Saludos.

gracias Dabauza por contestar,
quizas seas mas experto que to, jajaja,
no sabia que las funciones necesitasen menos memoria
y los define si que lo sabia.
tambien gracias noter por contestar,
como siempre el trabajo es el que nos da la experiencia y el fruto al final.
en realidad tengo un problema que es el siguiente:
tengo un programa hecho y ocupa sobre 27kb de 30kb en arduino pro mini,
y claro al minuto se queda colgado,
lo he hecho en el arduino uno y no se cuelga pero la tarjeta sd me crea el archivo pero no escribe dentro y creo que es que tengo poca memoria para trabajar,
en fin si no encuentro la solucion tendre que comprar uno mas grande.
un saludo.

Pues si el programa cabe, cabe y por ahí no deberías tener problemas. Es más probable que os que se esté colapsando sea la memoria RAM, no de flash. No sé si lo sabes, pero en arduino las memorias de datos y programa son independientes.

gracias noter,
se que hay varios sitios donde se guardan los datos, pero no cuales son exactamente,
He estado haciendo el programa por bloques y ha funcionado muy bien todo, y cuando lo he montado todo junto
me pasa ese problema, se que es de procesamiento de datos epro no se como hacerlo funcionar perfectamente todo junto.
un saludo

¿Mas experto? Que va hombre. Expertos los que hay por aquí, :wink:

No es que las llamadas a funciones ocupen menos memoria, pero si tienes la misma función repetida un par de veces pues si haces llamas entonces si que ahorras espacio.

Por otro lado también evitas que se este ejecutando todo el programa constantemente. Si haces llamadas esa parte del código solo se ejecutara cuando sea necesario.

Yo al principio lo metía todo en el loop y el programa andaba como un poco un poco lento, como si le costase reaccionar. Y un buen día me recomendaron lo de las llamadadas a funciones y ¡¡Voalá!! a funcionar como la seda XD

Aquí subí un código no hace mucho donde casi toda la programación esta hecha a base de llamadas, puedes pegarle un vistazo si quieres a ver si te soluciona algo.

Un saludo

Si pones el código podemos intentar ayudarte a optimizarlo en cuanto a uso de flash y de RAM.
A ciegas es muy difícil siquiera darte pistas.

dabauza, muchas gracias por la explicacion
Killoooo vaya pedazo de programa, yo no te llego al pie , jajaja
lo he copiado y me pondre a estudiarlo.
ya te contare.
Noter te pongo el godigo a ver si podemos minimizarlo
Un saludo.

campo_mio.ino (10.3 KB)

Que va hombre, si eso es prácticamente lo único que se hacer XD.

Un saludo

Hola de nuevo. Perdona que no te haya contestado antes (he estado estos días sin ordenador portátil en casa, y el teclado del teléfono es un coñazo).
Retomando el tema, como te dije puedes tener dos tipos de problema de memoria. Una es la memoria flash, que es donde se guarda el programa (también hay posibilidad de guardar algunos datos usando progmem) y memoria ram, que es donde se guardan los datos temporales (variables) del programa. Pero te digo un par de cosillas, según voy revisando tu código, que yo suelo hacer cuando necesito meter un programa en corsés de espacio o velocidad (no son mejores ni peores técnicas, e incluso algunas pueden pecar contra la programación "purista", pero igual alguna te viene bien).
Una manera de ahorrar en memoria de programa y de datos (como te dijo Dabauza) es "medir" tus variables y utilizar el tipo más ajustado. Por ejemplo, todas las variables que usas para el reloj creo que pueden estar en un rango entre 0 y 256, así que podrías definirlas como byte.
Otro tema a tener en cuenta con las variables es su alcance y tiempo de vida. Si una variable sólo va a ser utilizada en una determinada función (o incluso en una parte concreta de una función delimitada por llaves) y no tiene que guardar su valor de una llamada a otra, lo lógico es declararla dentro de esas llaves, pues la memoria ram que utilizan se libera al salir. Por ejemplo variable global String dataString podrías declararla justamente donde la "llenas": String dataString = String(monthDay) + ... Incluso si una variable debe conservar su valor, pero sólo se va a utilizar dentro de una determinada función, yo suelo declararlas dentro de ella como static, y así no la tengo por ahí fuera expuesta. Por ejemplo, las variables estadoSd y estadoReloj sólo se usan dentro de loop, así que podrías declararlas e iniciarlas dentro de loop (static boolean estadoSd=false;). No te preocupes, que sólo se inicializarán la primera vez. Además te evitas dos líneas en setup.
En resumen, yo intento no abusar de variables globales y usarlas sólo si voy a necesitar compartirlas entre varias funciones. Cosa diferente son las constantes o definiciones, que sí se entienden mejor si están juntitas al principio del código.
La utilización de objetos String suele simplificar las cosas para según qué tipo de operaciones, pero en muchas ocasiones es más efectivo trabajar con cadenas de caracteres. Requiere un poco de conocimiento de ellas, pero creo que merece la pena.
En tu código, por ejemplo, podrías construir tu dataString con sprintf:

char dataString[100]; // guardo 100 bytes de memoria para escribir en ella con sprintf
sprintf(dataString, "%d/%d/%d , %d:%dx:%d , %d , %d , %d , %d , %d , %d , %d , %d , %d , %d",
monthDay, month, year, hour, minute, second, int(t), int(h), hSuelo, LDR,
sensorPozo, sensorBidon, salRiego, salMotor, Cc, Pmp);

Y bueno; por hoy dejo de darte la murga, que igual te estoy liando.
Saludos.

¡Ah! Se me olvidaba una cosilla.
Otra cosilla que intento hacer es organizar bien las condiciones e intentar "no hacer dos veces la misma pregunta". Por ejemplo, tú has hecho una estructura tal que:

if(second==0 && !estadoSd){
          //código 1
}
if (second != 0){ // aquí preguntamos por la misma condición que arriba, sólo que negada
         // código 2
}

Yo lo pondría así, (aunque la estructura de llaves sea "más complicada", ahorras memoria y tiempo de proceso, y dispones de otros sitios donde poner código para combinaciones de condiciones distintas):

if(second==0) {
          if(!estadoSd){ // 
                  //código 1
          }
} else { // es decir, si second !=0
         // código 2
}

No siempre construir una condición compuesta es lo mejor ni lo más rápido ni lo más versátil.
Si tienes alguna duda de porqué considero ciertas cosas mejores, pregunta; yo te digo mis motivos y probablemente otros puedan decir cosas diferentes (por supuesto que yo no poseo la verdad absoluta y por ello también me gustaría conocer otros enfoques).
Saludos
Ahora sí, hasta otro rato.

muchas gracias por contestar noter;
Por lo que veo eres programador, porque las explicaciones que me has dado son de experto en el tema.
Con lo que me has dicho ya estoi ingeriendolo para otros programas ( y para este claro), me alegro que me digas estas cosas poruqe lo apunto todo en el cuaderno de notas y despues sale todo, jajaja ( que buen cuaderno tengo), y claro esta asi es como sabemos estos truquitos que queria saber. Contigo se tiene que aprender tela marinera, jajaja.
he hecho todo lo que has dicho y me escribe en la SD pero cuando le escribo el codigo del bluettoth no me escribe en la sd e incluso me la inicializa.
Es verdad que le hebajado a 22kb( que ya es tela), pero no suficiente para todo.
Noter he estado pensando que si se hace una clase ¿se optimizaria mejor la memoria o ocupa mas?.

PD: como una persona que se dedica a esto no tiene dos ordenadores!! yo tengo dos llaves 10-11 por si se me pierde alguna
jajjjaaj. muchas gracias
un saludo.

Reholas, pincho41700.
La verdad es que también tengo ordenador fijo, pero la habitación en la que está se ha convertido en un trastero desde hace tres años (curiosamente la edad de mis nenes), así que se puede decir que sólo tengo el portátil.
La utilización de clases, de por sí, no debería tener mucha influencia en la optimización de recursos. Sus virtudes son otras más encaminadas a organizar y hacer nuestro código reutilizable, especialmente cuando un programa va engordando. Por algo casi todas las librerías están hechas con clases. Sencillamente las incluimos, creamos un objeto y lo utilizamos sin necesidad de saber cómo son sus tripas.
Sería interesante que vuelvas a colgar la última versión de tu programa, y así podemos echar otro vistazo a ver si se puede afeitar más.
Saludos.

Si es verdad que cuando se tienen pitufos la cosa cambia tela,
te vuelvo a mandar el programa. Si es verdad que lo que no he probado es lo de la eprom.
si hace falta te mando el archivo log de la terjeta sd que crea el programa .
un saludo.

campo_mio.ino (9.58 KB)

ahh se me olvidaba, que si podia hacerte una pregunta:
que es uint8_t,
es una variable? donde se incializa?,
he leido algo pero no me aclaro.
se que significa usigned integer 8 (de 8 bit) y el _t ni idea.
a ver si me lo puedes aclarar tu mejor
un saludo

uint8_t es el acronimo de

a type of unsigned integer of length 8 bits

es decir lo mismo que byte, pero escrito en "interpretado" para ser traducido desde un fichero .h, de forma que variar de plataforma sea más fácil -no es lo mismo este tipo de dato en un procesador de 8 bits que en uno de 64, aunque el uso luego sea más o menos equivalente-

gracias jonny con contestar,
entonces es lo mismo
byte arbol; que
uint8_t arbol?
un saludo