Show Posts
Pages: 1 [2] 3 4 ... 32
16  International / Español / Re: Ayuda, sacar int de un arreglo de chars on: July 11, 2014, 05:30:44 pm
Hola.
Está sin probar, así que igual tiene algún fallo, pero creo que te puede dar una idea:

Code:
void setup()
{
  Serial.begin(9600);
}
 
char cadena[10]; //Sólo vamos a almacenar un valor numérico, así que con diez caracteres debería sobrar.
char motor; // El caracter que identificará al motor cuyo valor leemos
char leido;
int posicion=0;  //Variable para cambiar la posición de los caracteres del array
int valor;  //Variable del valor entero
 
void loop()
{
    while(Serial.available()>0) //Mientras haya datos en el buffer ejecuta la función
    {
      leido=Serial.read();
      if ( (leido>'0'&&leido<='9') || leido=='-' ){  // Si es un carácter numérico
            cadena[posicion++]=leido;
            // aquí podríamos controlar posición por si acaso se sobrepasa la longitud prevista de cadena
      } else { // si no es numérico
            if ( motor >='A' && motor <='C' ) { // cotejamos que el motor actual es válido
                  cadena[posicion]=0; //Ponemos un final de cadena para cortar
                  Serial.print("Motor=");
                  Serial.print(motor);
                  Serial.print(", Valor=");
                  valor=atoi(cadena);
                  Serial.println(valor);
            }
            posicion=0;
            motor=leido; // Si no es numérico lo establecemos como caracter indicador de motor
      }
    }
 }
17  International / Español / Re: COMO GUARDAR 100 DATOS QUE SE TOMAN POR MEDIO DE UNSENSOR EN ARDUINO on: July 11, 2014, 04:36:41 pm
Hola.
A ver; una variable float ocupa 32 bits, que son 4 bytes; es decir que ocuparían 4 X 100 =400 bytes, y no 3200, siempre que los guardes en formato nativo (no como cadenas de texto, por ejemplo). Si son double ocuparían 800 bytes.
Lógicamente, en una tarjeta SD podrías almacenarlos directamente como un archivo de texto y tendrías muchísima más capacidad, pero para 100 datos la EEPROM puede ser suficiente.
Saludos.
18  International / Español / Re: COMO GUARDAR 100 DATOS QUE SE TOMAN POR MEDIO DE UNSENSOR EN ARDUINO on: July 11, 2014, 01:51:27 pm
Para 100 datos creo que sería suficiente con el espacio disponible en la propia EEPROM del arduino.
Para mayor capacidad necesitarías un módulo y una tarjeta SD.
19  International / Proyectos / Re: Ayuda! Cadena de caracteres Arduino on: July 08, 2014, 05:37:23 pm
Hola.
Si funciona, eso es en principio lo importante, así que tu enfoque es válido.
Uno un poco más "estándar" sería recibir toda la cadena agregándola en un String cadenarecibida (hasta recibir el \r) y después analizar el string, buscando el patrón "H2S=":
Code:
int encontrado=cadenarecibida.indexOf("H2S="); // si encuentra en la cadena, indexOf nos dice en qué posición
if (encontrado>=0) // indexOf devuelve -1 si no se encontró coincidencia
    subcadena1=cadenarecibida.subString(encontrado+4,encontrado+9); // extraemos la subcadena entre 4 y 9 caracteres a partir de donde comienza "H2S="
Echa un vistazo a las funciones indexOf y subString en la referencia.
Saludos.
20  International / Proyectos / Re: Ayuda! Cadena de caracteres Arduino on: July 08, 2014, 09:08:21 am
Hola.
¿La cadena es un char *, un objeto string, o tan solo quieres extraer ese dato y desechar el resto mientras la recibes por serial?
21  International / Proyectos / Re: Ayuda! Cadena de caracteres Arduino on: July 07, 2014, 05:00:59 pm
Hola.
Contrapregunta:
¿Cómo distingues tú el dato que te interesa en medio de la cadena?
Lo que se suele utilizar en los logs son, bien longitudes de datos fijas, con lo que sabes en qué posición están los caracteres a extraer, o bien utilizar un separador de datos y, además, si no sabes en qué posición correlativa está, un patrón que preceda al dato.
Por ejemplo, puedes utilizar comas para separar los datos y una letra que te indique qué dato viene. Por ejemplo:
t12.56,h1232,v11.75\n

El proceso sería:
1. leo caracter.
2. dependiendo del caracter leído, sé qué parámetro viene a continuación, y me dispongo a leerlo.
3. Con parseint (o parsefloat si es flotante) leo el dato numérico. El comando va a leer hasta que se encuentre un carácter no numérico (coma o salto de línea).
4. vuelta a comenzar.

Es una idea básica, pero creo que te puede dar alguna idea de cómo comenzar a planificarlo.
Saludos.
22  International / Hardware / Re: conectar lcd a arduino a unos 12 metros on: July 04, 2014, 05:39:26 pm
¿El caos que se te forma con i2c extendido con RS485 sabes si es por problema de hardware o de software? ¿No tengo ni idea de cómo son exactamente esos lcd, pero ¿no compartirán la misma dirección, por ejemplo?
23  International / Software / Re: Placa de 8 Relés controlada remotamente por Arduino on: July 01, 2014, 06:10:55 pm
Hola.
Se puede reducir bastante el código, haciendo bucles en zonas repetitivas y usando un array para los pines. No está probado, pero creo que te puedes hacer una idea.
Code:
/*
     Arduino Ethernet Shield
 Control Remoto de Reles v1.0  
 */

#include <SPI.h>
#include <Ethernet.h>

//Declaración de la direcciones MAC e IP. También del puerto 80
byte mac[]={
      0xDE,0xAD,0xBE,0xEF,0xFE,0xED}; //MAC
IPAddress ip(10,10,10,100); //IP
EthernetServer servidor(80);

const int PIN_LED[]={
      5, 6, 7, 8, 9, 11, 12, 13};

void setup()
{
      Ethernet.begin(mac, ip); //Inicializamos con las direcciones asignadas
      servidor.begin();

      for (int i=0; i<8; i++) {
            pinMode(PIN_LED[i],OUTPUT);
            digitalWrite(PIN_LED[i],LOW);
      }
}

void loop()
{
      EthernetClient cliente = servidor.available();
      if(cliente)
      {
            while(cliente.connected())//Cliente conectado
            {
                  String readString1("");
                  if(cliente.available())
                  {
                        char c=cliente.read();
                        if(readString1.length()<30)//Leemos petición HTTP caracter a caracter
                        {
                              readString1.concat(c); //Almacenar los caracteres en la variable readString
                        }
                        if(c=='\n')//Si la petición HTTP ha finalizado
                        {
                              for (int encontrado = readString1.indexOf("LED"); encontrado>=0; encontrado=readString1.indexOf("LED",encontrado)) {
                                    int numLed = readString1.charAt(encontrado+3) - '0';
                                    if (numLed>=0 && numLed<8 && readString1.charAt(encontrado+4)=='=') {
                                          char comando=readString1.charAt(encontrado+5);
                                          if (comando=='T')
                                                digitalWrite(PIN_LED[numLed], HIGH);
                                          else if (comando=='F')
                                                digitalWrite(PIN_LED[numLed], LOW);
                                    }
                              }
                              //Cabecera HTTP estándar
                              cliente.println("HTTP/1.1 200 OK");
                              cliente.println("Content-Type: text/html");
                              cliente.println();        
                              //Página Web en HTML
                              cliente.println("<html>");
                              cliente.println("<head>");
                              cliente.println("<title>CRR v1.0</title>");
                              cliente.println("<h2><font color='#2076CD'>Control Remoto de Reles v1.0</font color></div></h2>");
                              cliente.print("<body bgcolor='#444444'>");
                              cliente.println("</head>");
                              
                              for (int i=0; i<8; i++) {
                                    cliente.print("<h3>RELE "); cliente.print(i); cliente.println("</h3>"); // poner cliente.print(i+1) si se quiere numeración 1-8 en lugar de 0-7
                                    cliente.println("<input type=submit value=ON style=width:50px;height:25px onClick=location.href='./?LED"); cliente.print(i); cliente.println("=T\'>");
                                    cliente.println("<input type=submit value=OFF style=width:50px;height:25px onClick=location.href='./?LED"); cliente.print(i); cliente.println("=F\'>");
                                    cliente.print("Estado: ");
                                    cliente.print(digitalRead(PIN_LED[i])?"ON":"OFF");
                              }

                              cliente.println("</body>");
                              cliente.println("</html>");
                              cliente.stop();//Cierro conexión con el cliente
                              readString1="";
                        }
                  }
            }
      }
}

Ah. Revisa los pines utilizados para los relés. Si estás usando arduino uno, los pines SPI son los 10, 11, 12 y 13; en mega 50,51,52 y 53.
24  International / Proyectos / Re: Proyecto: Localización en un Plano on: June 27, 2014, 05:11:20 pm
Parece muy interesante la idea  smiley-wink. Me gustaría (y seguro que a más gente) ir conociendo vuestras alegrías y penas en el desarrollo (por supuesto, ayudar también si es necesario y posible) y la exactitud que se pueda llegar a alcanzar.
Saludos.
25  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
26  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.
27  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).
28  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.
29  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
30  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.
Pages: 1 [2] 3 4 ... 32