Show Posts
Pages: 1 2 [3] 4 5 ... 33
31  International / Español / Re: Convertir char[] a byte[] on: June 27, 2014, 05:02:31 pm
Bueno; creo que tal vez tienes un poco de lío sobre cómo se pueden almacenar distintos tipos de datos. Es algo típico, pero te aseguro que si comprendes bien qué estás almacenando en memoria y cuántos bytes de memoria ocupa, habrás salvado un gran hándicap de la programación en C (y programación en general). No entiendo tu concepto "guardar cada valor hexadecimal". Quiero entender que te refieres a guardar una serie de valores numéricos de ocho bits (osea entre 0 y 255) en un array de bytes. Si es eso, no tiene nada que ver con el hexadecimal. El hexadecimal o decimal es tan solo una forma de presentarnos a los humanos un valor de forma más "cómoda" que el binario. Por supuesto que puedes guardar o enviar un número en hexadecimal, pero para la máquina no deja de ser una cadena de caracteres que no tiene nada que ver con el valor que representa, a no ser que se la transformemos a un tipo de dato numérico comprensible para ella (byte, int, float...).
Bueno; no te lío más. Prueba este código a ver si es a lo que te referías:
Code:
      byte codi[16];

      for(int i=0; i<16; i++){
            while(!Serial.available()) ;
            codi[i] = Serial.parseInt();
      }

      for(int i=0; i<16; i++)
            Serial.println(codi[i], HEX);

Deberás enviar 16 valores separados por comas, espacios u otro caracter antes de ver el resultado.
Saludos
32  International / Español / Re: Convertir char[] a byte[] on: June 26, 2014, 04:55:03 pm
Hola. Si no me equivoco, las dos cadenas contienen el mismo dato; pero Serial.print diferencia char de byte a la hora de imprimir: cuando es char imprime el carácter ascii y cuando es byte imprime el valor.
Normalmente deberías declarar la cadena según lo que quieras almacenar en ella (en este caso estás almacenando caracteres, creo). No obstante si haces un cast,
Serial.println((char)codi)
creo que deberías obtener la misma salida.
33  International / Proyectos / Re: Activar relé mediante señal 5v intermitente y pulsador de parada on: June 26, 2014, 08:41:06 am
Ahora con el negativo del buzzer conectado nada mas enchufar la placa se activa el relé un instante y se desactiva, cosa que antes ni siquiera hacía, tendré que revisar el código. Al accionar el pulsador me hace el efecto contrario, me activa el relé mientras está pulsado.

Gracias
Prueba a invertir la lógica en tu programa, porque muchos relés funcionan al contrario (activan con LOW y desactivan con HIGH).
34  International / Software / Re: TIEMPO DE EJECUCION DE LAS INSTRUCCIONES on: June 24, 2014, 08:47:43 am
Si no necesitas exactitud plena, también puedes leer millis() justo antes de llamar a la función y tras retornar de ella. Luego restas la primera medida de la segunda, y tendrás aproximadamente los milisegundos transcurridos:

unsigned long antes=millis();
mifuncion();
unsigned long despues=millis();
unsigned long transcurridos= despues-antes;

Saludos.
35  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
36  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.
37  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);

38  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;
}
39  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);
40  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.
41  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.
42  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.
43  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);
      }
}


44  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.
45  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;
}
Pages: 1 2 [3] 4 5 ... 33