Show Posts
Pages: [1] 2 3 ... 5
1  International / Software / Re: Cargar codigo con processing on: July 07, 2014, 11:00:08 am
Hola Gentec

Mírate este post
http://forum.arduino.cc/index.php?topic=245566.msg1760783#msg1760783


Saludos
2  International / Software / Re: Cambio de nº telefono modem GSM on: June 24, 2014, 01:32:55 pm
Hola katinga
Busca PROGMEM en la referencia,
http://arduino.cc/es/Reference/PROGMEM 
 PROGMEM registra en la memoria de programa un tipo de variable, lo bueno es que no ocupa memoria sram(por cierto me equivoqué anteriormente ) y luego con la macro pertinente la recuperas de la memoria de programa
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html
Declarar variables de esta manera no ocupa memoria sram(que hay muy poca)

puedes crear cadena de caracteres de la siguientes maneras por ejemplo:
char mensaje1[]="0123456789"; ocupa 12 bytes de memoria sram
String mensaje2="0123456789";ocupa 38 bytes de memoria sram, como puede ser eso?
PROGMEM char mensaje3[]="0123456789";queda almacenada en la memoria de programa ocupa 0 bytes en sram

creo haber leído que utilizas un mega con  un lcd, y el gsm, necesitarás crear cadena de caracteres, a ver como las defines......

Mucho ánimo.
3  International / Software / Re: Cambio de nº telefono modem GSM on: June 14, 2014, 11:10:21 am
Hola!

Pues ese código crea un array de String grabada en la SRAM. y la función putline(unsigned fmt,....) lo que hace es recuperar el String del array del fdata con la variable fmt , que luego la manda por el serial sustituyendo "#" por el String que le pongas a la función putline
ejemplo: putline(0,"juan")

putline es una función parecida a sprintf, solo que mucho mas sencilla
te paso otro código rectificado que se me ha ocurrido para integrarlo en tu código, desconozco el funcionamiento de SIM900, y los comandos que necesita para establecer la conexión, míratelo y cambia si es necesario
Se trata de una función comandos que devuelve(no imprime en el serial) un String  al que le añades el otro String que luego tu mandas al SIM900
es una idea...

Code:


                             
                           
/*----------------------------------------------------------------------------*/
/* Define un String en SRAM de los comandos a enviar                                                */
/*----------------comandos SIm900-----------------------------------*/
PROGMEM char f000[] = "AT+CMGF=#\r";
PROGMEM char f001[] = "AT+CMGS=\"#\"\r";
PROGMEM char f002[] = "MENSAJE ARDUINO:#";
 
/*----------------------------------------------------------------------------*/
/* Creamos un array que contendra los comandos                               */
/*----------------------------------------------------------------------------*/
PROGMEM char *fdata[] =               
{  f000,f001,f002                   
};                                     
/*----------------------------------------------------------------------------*/




/* funcion que devuelve un String de la base de datos de comandos Sim900     */
/* El String se indica con la variable fmt en la funcion comandos    */
/*Los String contienen una "#" que es sustituida por por una cadena de caracteres*/
char *comandos(int fmt,...)
{  static char buffer[128];         
   char c;                         
   char *p = buffer;               
   PGM_P f = (PGM_P)pgm_read_word(&(fdata[fmt]));   
   char *q;                       
   va_list ap;                   

   va_start(ap,fmt);                   
   while (c = pgm_read_byte(f))       
   {  ++f;                             
      if (c == '#')                   
      {  q = va_arg(ap,char *);       
         while (*q) *p++ = *q++;       
      }                               
      else *p++ = c;                   
   }                                   
   va_end(ap);                       
   *p = '\0';                         
  return buffer;             
}                                     
/*----------------------------------------------------------------------------*/
/* Test program (Arduino)                                                     */
/*----------------------------------------------------------------------------*/
void setup( )


   Serial.begin(9600);             
   Serial.println(comandos(0,"1"));             
   Serial.println(comandos(1,"34626212324"));               
   Serial.println(comandos(2,"Hola Mundo."));             
 }                                                         
void loop(void)

}

y ahora todo integrado en tu código

Code:
                             
                           
/*----------------------------------------------------------------------------*/
/* Define un String en SRAM de los comandos a enviar                                                */
/*----------------comandos SIm900-----------------------------------*/
PROGMEM char f000[] = "AT+CMGF=#\r";
PROGMEM char f001[] = "AT+CMGS=\"#\"\r";
PROGMEM char f002[] = "MENSAJE ARDUINO:#";
 
/*----------------------------------------------------------------------------*/
/* Creamos un array que contendra los comandos                               */
/*----------------------------------------------------------------------------*/
PROGMEM char *fdata[] =               
{  f000,f001,f002                   
};                                     
/*----------------------------------------------------------------------------*/




/* funcion que devuelve un String de la base de datos de comandos Sim900     */
/* El String se indica con la variable fmt en la funcion comandos    */
/*Los String contienen una "#" que es sustituida por por una cadena de caracteres*/
char *comandos(int fmt,...)
{  static char buffer[128];         
   char c;                         
   char *p = buffer;               
   PGM_P f = (PGM_P)pgm_read_word(&(fdata[fmt]));   
   char *q;                       
   va_list ap;                   

   va_start(ap,fmt);                   
   while (c = pgm_read_byte(f))       
   {  ++f;                             
      if (c == '#')                   
      {  q = va_arg(ap,char *);       
         while (*q) *p++ = *q++;       
      }                               
      else *p++ = c;                   
   }                                   
   va_end(ap);                       
   *p = '\0';                         
  return buffer;             
}                                     
/*----------------------------------------------------------------------------*/
/* Test program (Arduino)                                                     */
/*----------------------------------------------------------------------------*/



#include <SoftwareSerial.h>
SoftwareSerial SIM900 (0, 1);

char NUMERO [] = "+34626212324";
char MENSAJE [] = "Hola Mundo.";
char myBuffer[100]; // buffer de 100 bytes para almacenar la cadena construida.
                    //Puedes contar los caracteres necesarios y ajustar más el tamaño

void setup()
{
  SIM900.begin(19200);
  SIM900power(); 
  delay(20000);  // give time to log on to network.
}
 
void SIM900power()
// software equivalent of pressing the GSM shield "power" button
{
  digitalWrite(6, HIGH);
  delay(1000);
  digitalWrite(6, LOW);
  delay(5000);
}
 
void sendSMS()
{
  SIM900.print(comandos(0,"1");                                                        // AT command to send SMS message
  delay(100);
   SIM900 . println (comandos(1,NUMERO));                            // Nº Tfno a enviar el SMS
   delay ( 100 ) ;
   SIM900 . println (comandos(2,MENSAJE));                       // Mensaje a enviar
  delay(100);
  SIM900.println((char)26);                       // End AT command with a ^Z, ASCII code 26
  delay(100);
  SIM900.println();
  delay(5000);                                     // give module time to send SMS
  SIM900power();                                   // turn off module
}
 
void loop()
{
  sendSMS();
  do {} while (1);

Saludos
4  International / Software / Re: Cambio de nº telefono modem GSM on: June 14, 2014, 03:52:53 am
hola a todos

También puedes crearte tu propio sprinf, mira este código que te dará la idea perfecta

Code:

#include <avr/pgmspace.h>
#include <stdarg.h>

#define PC PROGMEM char
#define MAXLIN 128                     /* Output line buffer size             */
#define SUB '#'                        /* Substitution character              */
/*----------------------------------------------------------------------------*/
/* Define the format strings                                                  */
/*----------------------------------------------------------------------------*/
PC f000[] = "<p>The phone number of # is #</p>";
PC f001[] = "<p>#'s membership type is #</p>";
/*----------------------------------------------------------------------------*/
/* Array of pointers to above format strings                                  */
/*----------------------------------------------------------------------------*/
PROGMEM PGM_P fdata[] =                /* There must be an entry here for     */
{  f000,f001                           /*  each string above                  */
};                                     /*  end: array of pointers             */
/*----------------------------------------------------------------------------*/
/* Retrieve format string, make substitutions, and output formatted line      */
/*----------------------------------------------------------------------------*/
void putline(unsigned fmt,...)
{  static char buffer[MAXLIN];         /* Line buffer (SRAM)                  */
   char c;                             /* Character from format string        */
   char *p = buffer;                   /* Output pointer                      */
   PGM_P f = (PGM_P)pgm_read_word(&(fdata[fmt]));  /* Format string pointer   */
   char *q;                            /* Substitution data pointer           */
   va_list ap;                         /* Parameter list reference            */

   va_start(ap,fmt);                   /* Initialize ap                       */
   while (c = pgm_read_byte(f))        /* While format characters remain      */
   {  ++f;                             /* Advance format pointer              */
      if (c == SUB)                    /* Is this a substitution character    */
      {  q = va_arg(ap,char *);        /* If so, get string pointer param     */
         while (*q) *p++ = *q++;       /* Append param string to buffer       */
      }                                /*  end: if substitution               */
      else *p++ = c;                   /* Output ordinary char to buffer      */
   }                                   /*  end: while format chars remain     */
   va_end(ap);                         /* Done with parameter list            */
   *p = '\0';                          /* Terminate the output string         */
   Serial.println(buffer);             /* Output the buffered string          */
}                                      /*  end: putline()                     */
/*----------------------------------------------------------------------------*/
/* Test program (Arduino)                                                     */
/*----------------------------------------------------------------------------*/
void setup(void)
{  char *name = "John Smith";          /* 1st substitution item               */
   char *phone = "123-456-7890";       /* 2nd substitution item               */
   char *mtype = "Senior";             /* 3rd substitution item               */

   Serial.begin(9600);               /* Initialize serial connection        */
   putline(0,name,phone);              /* O/P formatted line with subs        */
   putline(1,name,mtype);              /* O/P second formatted line           */
}                                      /*  end: setup()                       */
void loop(void)
{  /* stub */
}

saludos
5  International / Software / Re: Como convertir un entero a su "ascii" on: June 13, 2014, 04:44:24 am
Hola daklon
Se llama hacer casting a variable
6  International / Software / Re: Como concatenar 2 variables tipo byte. on: June 12, 2014, 04:41:04 pm
prueba con:

Code:
#include <EEPROM.h>

int addr = 0;
byte a,b,c=1;long d,e,num=640000;
void setup()
{
  Serial.begin(9600);
  Serial.println(num,BIN);
 a=num;
  b=num>>8;
  c=num>>16;
  Serial.println(a,BIN);
  delay(300);
  Serial.println(b,BIN);
  delay(300);
  Serial.println(c,BIN);
  delay(300);
 
 num=c;num=num<<8|b;num=num<<8|a;

  Serial.println(num,BIN);
  delay(300);}

void loop()
{
 

 
}
7  International / Software / Re: Como concatenar 2 variables tipo byte. on: June 12, 2014, 04:05:02 pm
hola  shikamarucb.

Para unir 2 byte transformándolo a un int tendrías que añadir 8 ceros con el operador "<<" después con el operador "|" concatenar
si son más de 2 byte continuas añadiendo ceros y concatenas en  una variable acorde a los bytes
mírate las siguientes páginas:
http://arduino.cc/es/Reference/BitwiseAnd
http://arduino.cc/es/Reference/Bitshift

Code:
int num=2600;
byte b,a;
void setup(){
  Serial.begin(9600);
  Serial.print("num "); Serial.println(num,BIN);
 a=(byte)num ;
 Serial.print("a  ");   Serial.println(a,BIN);
b=num>>8;
Serial.print("b  "); Serial.println(b,BIN);
Serial.println("===========");

num=b  ;num=num<<8|a;
     Serial.print("num ");  Serial.println(num,BIN);

}
void loop(){
 
}

Saludos
8  International / Software / Re: paso por cero funcion millis on: June 12, 2014, 04:56:45 am
Hola jmaria bienvenido.

mírate este post en el cual encontraras varias soluciones a tu inquietud del desborde de millis()

http://forum.arduino.cc/index.php?PHPSESSID=6hvp1mu4ktkpnqo3fssd1pldf5&topic=236010.msg1706229#msg1706229


Saludos
9  International / Proyectos / Re: control arduino con visual on: June 10, 2014, 08:48:50 pm
Hola whaa.

mírate este código  que seguro que te da alguna idea, para tu proyecto.

Code:

long esnum(    char *n){
  char c;char num[9],*_num=num;long numero=0;
 
while(c=*n){*n++;
if (c=='-' || c<='9' && c>='0'){*_num++=c;}
 else {*num='\0'; numero=-2;break;}
}
*_num='\0';
if (numero>=-1){numero=atoi(num);}
 
return numero;
}
  char lectura[30];    

void setup(){
  pinMode(13,OUTPUT);
  Serial.begin(9600);
 
 
 
}


void loop(){

  
  
  long timer =millis();unsigned int timer2=timer%1000;
 if (timer2<300 && timer>200 ){
if (Serial.available()>0)
  {
 byte pos;                          
                  
     while(Serial.available()>0){  
    lectura[pos]= Serial.read() ;
    pos=pos+1;        
                                                                
 delay(3);    
    }
lectura[pos]='\0';
 
 edita(lectura);
  }
}
  
}



void edita( char *datos){
    Serial.flush() ;

  char _datos[500];*_datos='\0';strcpy(_datos,datos);strcat(_datos,"\0");
   char *pch;
char dat1[20]; char dat2[20]; char dat3[20];
    byte cuent=0;
pch=strtok(_datos," " );
   while (pch !='\0'){
   if (cuent==0){strcpy(dat1,pch);strcat(dat1,"\0");cuent=1;}
else if (cuent==1){strcpy(dat2,pch);strcat(dat2,"\0");cuent=2;}
else   if (cuent==2){strcpy(dat3,pch);strcat(dat3,"\0");cuent=3;}
 
   pch=strtok('\0'," ");
   }
 
 
 
   *_datos='\0';strcpy(_datos,"PRINT PRINTLN DIGITALWRITE");strcat(_datos,"\0");  
   signed char  pos=-2,cuenta=0 ;
   pch=strtok(_datos," ");
   while (pch !='\0'){
     if (strcmp(pch,dat1)==0){pos=cuenta;

 break;}
 cuenta++;
   pch=strtok('\0'," \r\n");
   }
if(pos==-2){Serial.println("eing!!");return;}

signed char numdat=pos;
   int  numint1=-2;
   int numint2=-2;
  
 switch (pos) {

  
  case 0:// PRINT
 Serial.print(dat2);
  break;
case 1://PRINTLN
 Serial.println(dat2);

 break;
 case 2: //  DIGITALWRITE
 numint1=esnum(dat2);numint2=esnum(dat3);
 if (numint1==-2 || numint2==-2){Serial.println("ERROR NO NUMERO");}
 else if (numint1>=14 || numint1<=1){Serial.println("ERROR PIN NO DISPONIBLE");}
 else if (numint2>=2 || numint2<=-1){Serial.println("ERROR ESTADO NO DISPONIBLE");}
else {digitalWrite(numint1, numint2);
 Serial.println("OK");}
   break;
}

}

 

desde la consola serial del ide de  arduino puedes mandar imprimir (PRINT  o PRINTLN),  ejemplo: PRINT Hola que tal!?
también puedes cambiar el estado del pin 13 (DIGITALWRITE) ejemplo: DIGITALWRITE 13 1



Espero que te sea de ayuda


Saludos
10  International / Español / Re: Bloqueo de Arduino por comunicación serie on: May 16, 2014, 04:11:31 am
Pues no se... umm  se me ocurre que compruebes si el serial esta bien y si no lo finalices y lo vuelvas a arrancar a ver si suena la campana

coloca este código a ver si te funciona

Code:
.........
if (!Serial){Serial.end();
  Serial.begin(9600); delay(3); }

}  /FIN DEL LOOP


saludos
11  International / Español / Re: Bloqueo de Arduino por comunicación serie on: May 16, 2014, 03:04:27 am
Hola NaneBL.

Motores industriales ....? seguro que generan mucho picos a la hora de conmutar esos relees, y es eso por lo que se te bloquea el arduino, mira de colocar filtros a esos relees.

me imagino un grupo de relees que por la parte DC ya vienen con sus filtros (diodos y opto), y además con sus 2 voltages DC para el control de la maniobra, pero por la parte AC que filtros tienes para los picos?

infórmate sobre varistores y filtros snubers los cuales te absorberán esos picos en la parte AC


Saludos.
12  International / Software / Re: Ayuda para el primer gran reto de un dummy on: May 02, 2014, 02:29:57 pm
Hola de nuevo, pues probando, probando....

encontré la manera de cambiar el valor de millis(), alterando el valor de una de las variables de la función
prueba este código:

Code:
extern volatile unsigned long timer0_millis  ;

 void setup()
{
  Serial.begin(9600);
   Serial.println("EMPEZAMOS  " );delay(300);

  timer0_millis=10000;// cambiamos valor de millis


 }

void loop()
{
 Serial.println(millis());
  if(millis() > 18000)
  {
 timer0_millis=0;
  }
  
 
 
  
 }

esta variable se encuentra en el archivo wiring.c
http://github.com/arduino/Arduino/blob/master/hardware/arduino/cores/arduino/wiring.c
desconozco si puede alterar el funcionamiento de arduino con tanto cambio

saludos
13  International / Software / Re: Ayuda para el primer gran reto de un dummy on: May 02, 2014, 11:22:16 am
Hola Marcial, creo que te puede funcionar si la función PintaTiempo no dura mas de 10 ms
mira el tiempo que tarda en ejecutarse no vaya a ser que en el momento  que desborda no compruebe millis()<10, o incrementa 10 ms para que no pase

Code:
....
   Valores[0] = Valores[1] = Valores[2] = Valores[3] = 0;
      T_High=0;
    }
   long timer=micros();
  PintaTiempo();
Serial.println(micros()-timer);
  }
 AntDigito=BtnDigito;
}....


mira también el tiempo total de loop

hace poco me encontré con este post para controlar el valor de millis() pero no me funciona con la ide 1.0.5 no se...
http://forum.arduino.cc/index.php?PHPSESSID=6nscr46kg15gv6p8bgurcoh6v7&topic=44844.15
14  International / Software / Re: Ayuda para el primer gran reto de un dummy on: May 01, 2014, 11:22:01 am
Hola rarito_forever Y Marcial.

Prueba con esta función que llama a la dirección de memoria 0 con lo que reinicializa el arduino, acuérdate de grabar las variables de alguna manera "EEPROM"

Code:
void(* resetFunc) (void) = 0;//función de reinicio
void setup()
{
  Serial.begin(9600);
   Serial.println("EMPEZAMOS  " );delay(300);
 
 }

void loop()
{
  Serial.println(millis());
  if(millis() > 1000)
  {
   Serial.println("RESET RESET  RESET  " );delay(300);
resetFunc(); 

}
 }


Espero que te sea de ayuda

saludos
15  International / Software / Re: CAMBIAR LA FORMA DE PROGRAMAR on: April 21, 2014, 07:23:18 am
Hola pincho41700

Pues no es necesario el crear el puntero, son manías mías para poder recorrer arrays mediante "++" o "--"

Prueba este otro código es  el mismo

Code:
void loop(){
if (SIM900.available()>0)
  {
 char lectura[10];   // array de char
 byte pos;          // creamos un puntero  para saber donde meter el char                  
                  
     while(SIM900.available()>0){  // mientras tengamos un char en el bufer
    lectura[pos]= SIM900.read() ; // llamamos al  lectura y  metemos el char en su posición
    pos=pos+1;      //   subimos una posición en el array    
                                                                
 delay(3);    // le damos un tiempo de espera para que no se pierda ningún char del bufer
    }
lectura[pos]='\0';
 
Serial.println("Llamada entrante...");
Serial.println(lectura);
  }
}



saludos
Pages: [1] 2 3 ... 5