Show Posts
Pages: 1 2 [3] 4 5 ... 33
31  International / Software / Re: transformar función a libreria on: June 17, 2014, 08:31:43 am
Encantado de haberte ayudado. Puedes modificar el asunto del hilo y agregar [solucionado] para que pueda servir de ayuda a otros.
Saludos
32  International / Software / Re: transformar función a libreria on: June 17, 2014, 12:49:18 am
¿Has puesto la librería en su ruta?
Tiene que estar exactamente en Arduino\libraries\webtoint\webtoint.h
Y junto a él webtoint.cpp.
A mí sí me compiló correctamente.
33  International / Software / Re: paso por cero funcion millis on: June 16, 2014, 09:12:14 am
Perfectamente explicado  smiley-wink.
Puedes corroborar, si quieres, la suposición que propones, aunque no precisamente con 10 bits, porque no es un tipo de datos estándar, pero sí con unsigned long, que es el tipo que nos interesa.
Code:
unsigned long a=0xfffffff0;
unsigned long b=0xf;
unsigned long c=b-a;
Serial.println(c,HEX);

34  International / Software / Re: transformar función a libreria on: June 15, 2014, 05:03:50 pm
Hola de nuevo, EduRoman.
Ten en cuenta que una librería no tiene por qué implementar una clase. En tu caso, y dado que lo único que quieres es incluir una función, lo único que tendrías que incluir en la librería, entre los bloques #ifndef #endif, es el prototipo de la función en el archivo.h y la definición de la función en el archivo.cpp.
Lo único que vas a tener es el problema de transferir tus variables lenVarName y lenVarDig para poder utilizarlas en tu sketch. Una opción es, como te han dicho ya, poder enviárselas como parámetros al llamar a la propia función. Puedes, incluso, definir valores por defecto si no le envías dichos parámetros:
int webtoint( String incomingweb, String keyweb, int lenVarName=7, int lenVarDir=3)
Así que si llamas
int web1 = webtoint(cadenaserver , "sensor6");
lenVarName tomará 7 y lenVarDir 6. Pero si llamas
int web1 = webtoint(cadenaserver , "sensor6",  8, 5 );
lenVarName valdrá 8 y lenVarDir 5.

Así quedaría la librería sin usar clases:

webtoint.h:
Code:
#ifndef web_h
#define web_h
#include <Arduino.h>
int webtoint( String incomingweb, String keyweb, int lenVarName=7, int lenVarDig=3);
#endif
webtoint.cpp:
Code:
#include "webtoint.h"

int webtoint( String incomingweb, String keyweb, int lenVarName, int lenVarDig){
      int indexvar = incomingweb.indexOf(keyweb); //obtiene el inicio del nombre de la variable
      String comando = incomingweb.substring(indexvar+lenVarName+1,indexvar+lenVarName+lenVarDig+1);//crea el substring para meter a la tranformacion
      //    String substring = comando;
      // Crear un array con el largo de la cadena mas un null
      char valueArray[comando.length() + 1];
      // copiar el sub string en el array
      comando.toCharArray(valueArray, sizeof(valueArray));
      // convertir el array en int
      int value = atoi(valueArray);
      //devuelve el valor transformado
      return value;
}
35  International / Software / Re: Cambio de nº telefono modem GSM on: June 14, 2014, 08:31:14 am
En tu código no has llenado con nada myBuffer, así que probablemente sólo contendrá ceros. Te falta llenarlo con tu comando.
sprintf(myBuffer, "AT + CMGS = \"%s\"\r", NUMERO);
36  International / Software / Re: Cambio de nº telefono modem GSM on: June 14, 2014, 02:53:47 am
Hola. El sprintf lo puedes utilizar directamente, al menos en las últimas versiones del IDE, así que a priori sería lo más fácil de implementar.
Lo de modificar la librería print.h no lo he probado nunca, pero sé que se encuentra en varios sitios y dependiendo de tu modelo de arduino le afecta una u otra.
En resumen, yo apostaría por sprintf, que te puedo asegurar que funciona.
Saludos.
37  International / Software / Re: transformar función a libreria on: June 13, 2014, 05:32:14 pm
Hola.
Creo que estás un poco perdido en este momento con lo que es una clase (va mucho más allá de una función).
Bueno; para ir directamente al grano te diré que el constructor de una clase (la función que se llama igual que la propia clase) se declara sin "prefijo" y no te puede devolver un int. Sencillamente se encarga de las tareas a realizar al construir un objeto de esa clase y devolverá un objeto de dicha clase. Por ello dice que no puede convertir un objeto webtoint a int.
Saludos.
38  International / Software / Re: paso por cero funcion millis on: June 13, 2014, 10:04:43 am
Hola.
Yendo por partes, a mí me parece correctísimo que declares como unsigned long ulTimeout, pues los casting que hace arduino al operar con distintos tipos de datos pueden darnos algún susto. Lo qué sí es buena práctica es anteponer const si se trata de una constante, pues además de ahorro de memoria, el compilador te avisará si te despistas e intentas modificarla.
Por otro lado, no termino muy bien de comprender por qué pones al principio

  if (millis() <= ulTimeout){
    ulActual = 0;
  }

Creo que lo que haces es que cuando detectas un overflow, comienzas a contar desde cero, descartando el tiempo parcial que transcurrió desde el último ulActual hasta ese desbordamiento,  ¿no? Entonces, si no calculo mal y antes del desbordamiento ya estabas en timeout, durante los cinco primeros segundos después del desbordamiento no estarás en timeout aunque sigan sin llegar caracteres.
El código que puse en mi post anterior creo (aunque no lo parezca a primera vista) que sí se comportaría bien incluso con desbordamiento de por medio.
39  International / Software / Re: paso por cero funcion millis on: June 13, 2014, 08:47:29 am
Yo no tengo ahora mismo el arduino a mano, pero por si queréis comprobar los códigos, se podrían definir todas las variables de los códigos unsigned long como unsigned int, de forma que podamos tener desbordes cada 65536 milisegundos (un minuto y poco).

Y ya puestos, yo abogo por otro sistema, hala smiley-razz
 smiley-mr-green smiley-mr-green smiley-mr-green smiley-mr-green

Code:
const unsigned int uTimeout=5000;
unsigned int uActual=0;

void setup() {
      Serial.begin(115200);
      uActual=millis()+uTimeout;

}

void loop() {

      if(Serial.available())
            uActual=millis();
      unsigned int uTranscurridos=millis()-uActual;
      if(uTranscurridos>uTimeout){
            digitalWrite(13,HIGH);
      }
      else {
            digitalWrite(13,LOW);
      }
}


40  International / Proyectos / Re: Buenas! alguien dispuesto a dar una charla en Berazategui? on: June 12, 2014, 04:28:18 pm
Prefiero que te lo explique vffgaston, pero si miras su ubicación a la izquierda de sus post, verás que bromeaba.
Ten en cuenta que la broma la has iniciado tú inadvertidamente smiley-wink.
Me adelanto sólo por si acaso no te habías percatado, evitarte pérdida de tiempo, más dada la premura.
Saludos.
41  International / Software / Re: Como concatenar 2 variables tipo byte. on: June 12, 2014, 03:52:12 pm
Hola.
Pues realizando la operación inversa:

Code:
int num=2600;

byte a,b;

void setup(){
a=2600; //Aca toma los 8 bits menos significativos que seria 00101000
b=num>>8; //Aca desplazo 8 bits a la derecha y los dejo como menos significativos que seria 00001010

int c=(b<<8);
c+=a;
}
42  International / Hardware / Re: extender i2c a través de rs485 on: June 11, 2014, 05:31:23 pm
Con todas las cautelas, pues en electrónica estoy pez, y al principio de la página pone "status: not implemented".
Pero tras una rápida búsqueda creo que esto sería medio circuito.
Puedes mirar más cosas en san google.
Si finalmente te atreves con ello, sería interesante que expusieras por aquí tus resultados. Me parece muy interesante.
Saludos.
43  International / Español / Re: Ayuda para codigo on: June 11, 2014, 05:17:31 pm
Efectivamente, la programación actualmente está encaminada a que cuando se detecta la subida de la lectura analógica realice el movimiento del servo, desatendiendo todo lo demás. Es el eterno problema de la programación: ¿cómo hacer varias cosas simultáneamente? La respuesta es "un trozo de tarea en cada momento". En tu caso, podemos, por ejemplo, establecer una variable int para cada servo que cambiaremos a +1, 0 ó -1 según el servo deba estar subiendo, parado o bajando. En cada recorrido del loop sumaremos ese número a cada servo y lo escribiremos en el servo correspondiente, controlando que si llega arriba o abajo del todo, ponerla a cero para que deje de incrementar o decrementar. Quedaría por ver qué debe ocurrir si durante la subida o bajada la lectura analógica cambia (si debe olvidarse y acabar el ciclo o invertir el sentido del movimiento). Mira a ver si este código te sirve de ayuda (está sin comprobar). Teóricamente, con una sola lectura analógica debería controlar los tres servos según tres niveles establecidos (en lugar de mapear utilizo la lectura directa, que debería estar entre 0 y 1023, pero también puedes mapearla)
Code:
#include <Servo.h>

Servo myservo1;
Servo myservo2;
Servo myservo3;

int potpin = 0; 
int lecturaanterior=0;
int lecturanueva;
int valorservo1=0;
int valorservo2=0;
int valorservo3=0;
int incremento1=0;
int incremento2=0;
int incremento3=0;
void setup()
{
      myservo1.attach(9); 
      myservo1.write(valorservo1);
      myservo2.attach(10); 
      myservo2.write(valorservo2);
      myservo3.attach(11); 
      myservo3.write(valorservo3);
      delay(15);
}

void loop()
{
      lecturanueva = analogRead(potpin);           
      if (lecturaanterior <250 && lecturanueva >= 250){    // si la lectura analógica ha saltado por encima de 250
            if(valorservo1==0 || incremento1<0)            // Si está parado en posición 0 o esta decrementando, cambiamos a incremento.
                  incremento1=1;
            else                                           // Si no, cambiamos a decremento.
                  incremento1=-1;
      }
      if (lecturaanterior <500 && lecturanueva >= 500){     
            incremento2 = valorservo2==0 || incremento2<0 ? 1 : -1; // otra forma de escribir el mismo if anterior
      }
      if (lecturaanterior <750 && lecturanueva >= 750){     // igual que los otros dos
            incremento3 = valorservo3==0 || incremento3<0 ? 1 : -1;
      }
      lecturaanterior=lecturanueva;
     
      // Incrementamos los valores de servo según su estado (subiendo, parado, bajando)
      valorservo1 += incremento1;
      valorservo2 += incremento2;
      valorservo3 += incremento3;
      // Si el servo está en un extremo u otro, detenemos incremento o decremento
      if (valorservo1<=0 || valorservo1>=180) incremento1=0;
      if (valorservo2<=0 || valorservo2>=180) incremento2=0;
      if (valorservo3<=0 || valorservo3>=180) incremento3=0;
      // Escribimos los valores correspondientes en cada servo
      myservo1.write(valorservo1);
      myservo2.write(valorservo2);
      myservo3.write(valorservo3);
}
44  International / Hardware / Re: subrov & wii nunchuck on: June 11, 2014, 04:22:47 pm
Yo ni idea de electrónica, pero quizás pudiera interesarte este post. Si funciona, sería perfecto para tí.
Saludos.
45  International / Hardware / Re: subrov & wii nunchuck on: June 10, 2014, 05:25:57 am
Hola.
En lugar de sustituir el nunchuck, también puedes agregarle un arduino básico que lo lea por i2c y se encargue de la transmisión al otro arduino por serie u otro sistema que te proporcione el alcance necesario.
Pages: 1 2 [3] 4 5 ... 33