Show Posts
Pages: [1] 2 3 ... 26
1  International / Español / Re: Problema con libreria de Smartgpu2 on: Today at 09:14:56 am
Pues viene a decir que no has definido qué dispositivo estás utilizando.
Creo que tienes que editar SMARTGPU2.h (usa un editor de texto) y descomentar la línea que corresponde a tu modelo.
2  International / Software / Re: Servidor HTML+PHP en arduino? on: Today at 09:02:08 am
No entiendo muy bien tu pregunta, pero arduino no entiende de HTML ni de PHP. La librería ethernet lo máximo a lo que llega es a establecer una conexión cliente/servidor o viceversa y enviar/recibir datos a través de ella. El cómo se interpreten esos datos en arduino depende del programa que hagas. Claro, que si quieres que un navegador entienda esos datos, deberás "hablarle" en HTML.
3  International / Software / Re: Teclado matriz 4X3 on: Today at 08:51:10 am
Lo que pides es un asunto que creo que está bastante trillado en este foro. Te doy una pista, a ver si eres capaz de arreglarlo tú solo:
Primero iniciamos la variable entera:
int entero = 0;

Para ir acumulando dígitos recibidos al mismo int, primero desplazamos a la izquierda (es decir, multiplicamos por 10) y luego sumamos el dígito recibido:
entero *=10;
entero += caracter - '0'; // restamos el código ascii de 0 para obtener el valor neto del dígito, no su código ascii

Es decir, si por ejemplo pulsamos 263#:
0*10+2=2
2*10+6=26
26*10+3=263
Al recibir la # tomamos el valor y volvemos a reiniciar la variable entera.
4  International / Español / Re: Fallo en código intentando encender 8 leds a través de Internet.. on: April 18, 2014, 08:43:39 am
Si descartamos problema de memoria y de "pisamiento" de puertos, te reitero que lo más probable es que sea problema de montaje. Ahí poco puedo aportar, pero a buen seguro que alguien te ayudará si expones tu montaje (cómo y cuánto estás alimentando y cómo acoplas los led y los botones). Podría ser por ejemplo que estés exigiendo demasiada corriente a tu arduino.
5  International / Español / Re: Problema con libreria de Smartgpu2 on: April 18, 2014, 08:36:41 am
Tiene toda la pinta de que no has colocado la librería en el lugar correcto. El archivo SMARTGPU2.h debería estar en la carpeta Arduino/libraries/SMARTGPU2/SMARTGPU2.h. Revisa no hayas creado alguna subcarpeta de más al descomprimir la librería.
Saludos.
6  International / Software / Re: Necesito ayuda urgente para mi proyecto con la gsm shield! on: April 17, 2014, 09:08:12 am
Por supuesto que se puede hacer en un archivo. Lo que ocurre es que en este caso se buscaba almacenar no más de 100 números telefónicos, que caben perfectamente en la memoria RAM y en la eeprom del arduino, sin necesidad de SD. Los números se cargan todos en memoria durante el setup. En cuanto a la velocidad de acceso, siempre será más rápida desde la propia RAM que desde un archivo, pues al fin y al cabo un dato de archivo deberá siempre pasar a la RAM antes de poder trabajar con él.
En resumen, para esta cantidad de datos era la solución más efectiva y sencilla; pero para una cantidad de datos más ingente sería necesaria la solución que propones; aunque traería nuevos e interesantes retos como el acceso aleatorio al archivo, algorritmos de búsqueda y ordenación, e incluso archivos de índice si la cosa se complica.
7  International / Español / Re: Fallo en código intentando encender 8 leds a través de Internet.. on: April 16, 2014, 05:13:01 pm
Sin haber llegado a examinar el código, pero vamos, entiendo que el añadir nuevos led no trae ninguna diferencia significativa al programa, así que lo más seguro es que se trate de problema de hardware. A ver si estás "pisando" alguno de los pines de la ethernet. En todo caso convendría que muestres tu montaje y el arduino que usas.
Podría ser también problema de memoria. En tal caso creo que tu programa se puede optimizar mucho más, dado que estás repitiendo ocho veces el mismo código con unas pocas variaciones (en evitar eso consiste la programación).
Saludos.
8  International / Software / Re: PROGRAMAR C on: April 09, 2014, 04:54:31 pm
¿Te acuerdas de lo que te dijeron de las funciones? Sobre todo muy a tener en cuenta cuando veas que el código se repite:
Code:
 LDR=mapeanalogico(A0);
  hSuelo=mapeanalogico(A1);
  sensorPozo = mapeanalogico(A2);
  sensorBidon=mapeanalogico(A3);  
Definiendo la función correspondiente:
Code:
int mapeanalogico(int pin){
  int a=analogRead(pin);
  a=map(a,0,1024,0,100);
  return (a);
}

Sin embargo, cuando un código no se repite, no es conveniente crear una función, pues el resultado será más grande (mismo código más la llamada a la función). Por ello yo no pondría las funciones imprimeSerial e imprimeSerial2. Eso sí, te puedes aprovechar también de sprintf:
Code:
       char dataString[20]; // Con 20 bytes habrá suficiente buffer
        sprintf(dataString,"%02d/%02d/%02d %02d:%02d:%02d",
              monthDay, month, year, hour, minute, second);
        Serial.println(dataString);

Code:
       char dataString[100]; // buffer
        sprintf(dataString,"Humedad: %d\tTemp: %d *C\tHsuelo: %d  Lumenes: %d sPozo: %d sBidon: %d Riego: %d Motor: %d", h, t, hSuelo, LDR, sensorPozo, sensorBidon, salRiego, salMotor);
          Serial.println(dataString);
9  International / Software / Re: PROGRAMAR C on: April 09, 2014, 04:24:33 pm
Volviendo a tu programa:
Code:
  if (hour == 9 || hour == 10 || hour == 11 || hour == 12 || hour == 13 || hour == 14
      || hour == 15 || hour == 16 ||hour == 17)
     {
       poderRegar=false;
     }
     else
     {
       poderRegar=true;
     }
¿No se podría sustituir por...
Code:
poderRegar=(hour<9 || hour>17);
?
A no ser que lo hayas puesto así con intención de utilizar horas no consecutivas.
10  International / Software / Re: PROGRAMAR C on: April 09, 2014, 04:04:38 pm
Hola.
Efectivamente, son lo mismo. De hecho uint8_t y semejantes son tipos definidos (tú también puedes definir tipos de datos mediante typedef). Se suelen definir porque por ejemplo uint8_t es más expresivo del tipo de variable que representa (unsigned int 8bytes type). En arduino, por ejemplo int16_t también sería equivalente a int, pero en otra arquitectura no tendría por qué ser así pues perfectamente podría utilizar nativamente int de 32 bits y entonces int16_t equivaldría a short int.
 
11  International / Software / Re: PROGRAMAR C on: April 08, 2014, 04:18:19 pm
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.
12  International / Software / Re: PROGRAMAR C on: April 07, 2014, 05:57:28 pm
¡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:
Code:
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):
Code:
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.
13  International / Software / Re: PROGRAMAR C on: April 07, 2014, 05:31:52 pm
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.
14  International / Español / Re: Error Compilando on: April 05, 2014, 08:25:42 am
Ayudaría que pusieras el código.
Así a primera vista parece que no tienes bien montada la secuencia de setup-loop.
Saludos.
15  International / Español / Re: texto en vertical tanto en Monitor como en la SD on: April 04, 2014, 09:27:24 am
Normal. Println, como su nombre indica, envía después un carácter de nueva línea.
Utiliza print a secas.
Pages: [1] 2 3 ... 26