Show Posts
Pages: 1 2 [3] 4 5 ... 27
31  International / Français / Comment créer sa propre librairire en fonction d'une autre on: August 17, 2014, 12:25:41 pm
Bonjour à tous,
Je me replonge dans Arduino smiley-razz smiley
J'ai utilisé une grande librarire qui consiste en plusieurs fichiers. Il est bien mais beaucoup de code est inutile et prend de la mémoire. En plus c'est un peu le cheni.

J'aimerais refaire "la mienne" en reprennant uniquement ce que j'ai besoin, et j'aimerais avoir tout dans un fichier .cpp et .h.

Auriez-vous un tutorial qui explique comme on crée une librarie?
Auriez-vous des info à me donner?

Merci beaucoup
32  International / Français / Mais que fait exactement la fonction puts() on: October 30, 2013, 07:10:38 am
Bonjour,

J'ai lu la définition de la fonction puts(), mais j'ai du mal à comprendre exactement ce qu'elle fait
Code:
// Convert Int to char
        char posiC[2] = {0}; // es-ce que le {0} est indispensable
        sprintf(posiC, "%d", posi);
        puts(posiC);
ou alors mon anglais n'est pas assez bon
Quote
Writes the C string pointed by str to the standard output (stdout) and appends a newline character ('\n').

The function begins copying from the address specified (str) until it reaches the terminating null character ('\0'). This terminating null-character is not copied to the stream.

Notice that puts not only differs from fputs in that it uses stdout as destination, but it also appends a newline character at the end automatically (which fputs does not).
Que va vraiement changer posiC avant et après.
Si je ne me trompe pas,, avant il est bien terminé pas \0 parce que sprintf(), non?
33  International / Français / Re: Comment optimiser mon code en utilisant une variable à la place de deux on: October 30, 2013, 02:38:29 am
Quote
Si le but c'est réellement d'optimiser pourquoi utiliser des char pour stocker un flottant (alors que float est là pour ça) ?
Oui en effet, je vais me concentrer la dessus, pour remplacer les char par des float. (Ma fonction retourne de char).

Toujours dans le but d'optimiser mon code, j'ai eu une reflexion hier soir et je me demande si je devrai pas corriger deux trois trucs.

Je vais donner une exemple de code
Code:
#include <MemoryFree.h>
#include "SIM900.h"
#include <SoftwareSerial.h>
#include <Wire.h>
#include "gps.h" // RAM : 1170 -> 1039
#include "inetGSM.h" // RAM : 891, then 881 when adding serialhwread()
#include <EEPROM.h>

char lon[50];
char lat[50];
char gsm[100];
char dir[50];
char numero[50];

void setup(){}
void loop(){
  // Ici il y a  un timer pour que GetGPS() soit appeler tous les 2mn (je ne l'écris pas, pour faire plus simple)
  GetGPS();
   // Il n'y a pas de timer
  GetGSM();
  // Ici il y a  un timer pour que GetSMS() soit appeler tous les 5mn (je ne l'écris pas, pour faire plus simple)
  GetSMSToCinqMn();
}
void GetGPS(){
  // Fait quelque chose avec les variables lon et lat
}
void GetGSM(){
  // Fait quelque chose avec la variable gsm
   GetDIR();
}
void GetDIR(){
  // Fait quelque chose avec la variable dir
}
void GetSMSToCinqMn(){
  // Fait quelque chose avec la variable numero
}
Dans mon banal exemple, on est d'accord que mon microprocesseur va utiliser 300o de RAM, tout le temps, jusqu'a ce que j'éteigne mon microprocesseur.
Simplement pendant 4mn, il y a 50o qui auccupe la ram pour rien, mais a l a5eme minute la fonction GetSMSToCinqMn() va utiliser 50o.

Je me disais que si je placais les 4 char dans leurs fonction, ca permettrait d'utiliser la mémoire que lorsque le Micropro en a besoin, puis que lorsque l'on quitte une fonction , la mémoire utilisée par un char , est libirée .

Suis-je bien juste?
Donc je me demandais si c'était une bonne idée de modifier ainsi, sachant que les fonctions ne vont jamais etre appelée en meme temps, mais l'une après l'autre, séquencée par un timer.
Code:
#include <MemoryFree.h>
#include "SIM900.h"
#include <SoftwareSerial.h>
#include <Wire.h>
#include "gps.h" // RAM : 1170 -> 1039
#include "inetGSM.h" // RAM : 891, then 881 when adding serialhwread()
#include <EEPROM.h>


void setup(){}
void loop(){
  GetGPS();
  GetGSM();
  // Ici il y a  un timer pour que GetSMS() soit appeler tous les 5mn (je ne l'écris pas, pour faire plus simple)
  GetSMSToCinqMn();
}
void GetGPS(){
   char lon[50];
   char lat[50];
   inet.getGps(lon,lat); // fonction d'une librairie, racourcie qui va exécuter la command AT pour avoir les positions gps
  // Fait quelque chose avec la variable lon, lat
    Serial.println(lon);
    Serial.println(lat);
}
void GetGSM(){
  // Fait quelque chose avec la variable gsm
    char gsm[100] ="100_caracteres_pour_l_exemple......."
   GetDIR(gsm);
}
float GetDIR(int pos){
   char dir[50];
   float numero;
  // Question le dir pour afficher ce qui le nuemro la la position pos
  return numero;
}
void GetSMSToCinqMn(int pos, String text){
  // Fait quelque chose avec la variable pos en envoi un sms en utilisant le numero a la position pos du directory
   float numero;
  strcpy(numero,GetDir(pos);); //OK il y a pas 50 caractere, mai faisons comme..
   //fonction tiré de ma librairie
   inet.sendSMS(numero,text);
}
Dans cette exemple, on est d'accord que la mémoire de mon microcontroller sera utilisée que lorsque les fonctions sont appelées.

Donc quand la fonction GetSMS sera appelé, les 100o utlisé par GetGPS seront libérés?

Voilà, on est d'accord que ce code ne marchera pas comme ca, mais c'est plus pour faire part d'une autre maniere de placer mes variable qui consome de la mémoire.

Voyez-vous ce que j'essaye de dire, malgré ces exemples de code non fonctionnels  smiley ?
34  International / Français / Re: Comment peut-on fusionner des valeurs autrement qu'avec strcat() on: October 28, 2013, 10:01:23 am
Je me'excuse B@atto, mais je vais encore te tenir tête  smiley smiley smiley smiley
Peut etre que je me suis mal expliqué, ou peut etre que je t'ai pas compris à 100% et je m'en excuserai.

En fait, je me suis mis dans le cas ou j'était en montage, par exemple. La haut, il y a peu de chance d'avoir du réseau 3G, mais il y aura du GPS.
Si je me promene 1h à 3h, il faut que mon module garde les positions. Sopit pour une heure, c'est
120x ca (sachat que %s est remplacer par 15 caratere
Code:
<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>

Donc je ne crois pas que la RAM suffira.

Maintenant ce que je n'ai pas préciser, j'ai une petite fonction qui control la RAM restant.
Par exemple. s'il retse 150o, il en envera 1 x le code ci-dessus
S'il reste 250, il envera deux fois le code ci-dessus. Mais l'envoi se fera une fois.
 C'est la que j'ai besoin d'empiler ces deux set. avec un truc du genre strcat.

Ainsi la RAM restaera une "memoire tampon". Pour l'envoi.

Aussi, je opeux en effet, réfléchir pour fractionner la chaine de caractere, mais si je la fractionne, j'aurai plus de connection au server pour l'envoi.
Par exemple, si je la fractionne, j'aurai deux envoi pour avoir le tout sur le serveur.

Vois-tu pourquoi? Quoi, peut etre que je me trompe encore  smiley-fat smiley
35  International / Français / Re: Comment peut-on fusionner des valeurs autrement qu'avec strcat() on: October 28, 2013, 08:27:30 am
ok, bon dans tous les cas, si je n'ai pas de réseau pour envoyer les données il faut bien que je les stok a quelque part. De plus, actuellement, il me reste 500o de la RAM du Arduino, et ceci va encore diminuer.

Ceci dit, je suis toujours face au meme même problème pour fusionner des données comme le fait strcat()

en plus simple:
J'ai une valeur das la variable, et je dois àjouter, mais pas remplacer ceci à coords
Code:
// Ceci va l'écraser, mais je veux ajouter
sprintf(coords,"<fix><co><%s</co><lo>%s</lo></fix>",cou,lon);
36  International / Français / Re: Comment peut-on fusionner des valeurs autrement qu'avec strcat() on: October 28, 2013, 06:12:33 am
Quote
Surtout que je ne vois pas du tout l'utilité de l'EEPROM : si c'est pour tout recopier en entier dans la RAM ensuite, ça ne sert strictement à rien, autant tout stocker dans la RAM dès le début ...
Ben j'utilise un EEPROM dans le cas ou je n'ai pas de réseau, mais les positions GPS sont valable avec l'antenne GPS. Dans ca cas, je ne veux pas les perdre et je les enregistre dans l'EEPROM, jusqu'a ce que le réseau est valable. Il faudrait alors envoyer plus de donnée pour quel l'EPROM se retrouve avec le minimum d'enregistrement et avant qu'on turnoff le module
37  International / Français / Re: Les math et arduino, division de nombre on: October 28, 2013, 03:52:40 am
D'acord alors je suis très intéressé parce que tu viens d'écrire.

Si j'ai cette fonction, je dois déclarer les variable suivante
Code:
char lon['15'];
char lat['15'];
char alt['15'];
char tim['15'];
char vel['15'];
gps.getPar(lon,lat,alt,tim,vel);
Donc j'ai 75 octect et parce my fonction getPart me demande des char.

Aussi, es-ce que je ne peux pas remplacer
Code:
char lon['15'];
par
Code:
float lon;
J'ai essayé hier soir et ca a gugé. ET si je ne me trompe pas, de cette maniere je peux réduire l'utilisation de ma mémoire ainsi. Je ne comprends pas trop de conseil et comment faire.
38  International / Français / Re: Comment peut-on fusionner des valeurs autrement qu'avec strcat() on: October 28, 2013, 03:44:44 am
Salut fdufnews
Quote
Dans deux autres fils tu pleures après quelques octets et là tu veux concaténer des chaînes de la mort
smiley smiley Oui je comprend ta remarque. En effet, je suis limite avec la mémoire mais j'ai encore de la marge. Le problème c'est que j'essaye d'envoye plusieurs set de donnée en une fois pour "vider" mon EEPROM. Et le set de donnée et cette chaine de la mort, et la j'ai pas le choix car c'est ces valeur que je souhaite enregistré sur ma base de donné. Si j'ai encore assez de RAM, ben je souhaite envoyé deux set avec des valeurs différente, Si j'ai encore de la mémoire, et ben j'envoie 3 set de valeur ainsi de suite.

C'est pourquoi je souhaitais que ma variable "coords" prenne cette valeur dans le cas de deux set. (en ademttant que les %s seront remplacer par les valeurs
Code:
<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>
<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>
et sil y a encore de la place, 3 set
Code:
<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>
<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>
<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>

C'est pourquoi je cherche à savoir comment merger des donnée, pour voir ce que ca donne.

Je me suis à l'évidence que je n'arriverai pas envoyé une heure d'enregistrement, en seul coup. Quoi du moins, je n'ai pas trouver la solution alors je m'adapte.

Alors si toute les 30 sec j'enregistre 1 set de valeur dans ma memoire, et si toutes les 10 sec, j'envoie 3 set sur le serveur, je viderai rapidement mon EEPROM. Mais ceci dans le cas ou il y a eu une longue absence de réseau. Si non , j'enregstre, j'envoi, j'envoi rien, j'envoi rien, j'enregistre, j'envoi rien, j'envoi rien, etc

C'est vrai qu'au départ, je souhaite, récolté 5 set, ou plus  (un tous les 30 sec), et envoyer les 5 d'un coup. mais je me suis mis à l'évidence qu'em terme de mémoire , c'était mission imposible.
39  International / Français / Comment peut-on fusionner des valeurs autrement qu'avec strcat() on: October 27, 2013, 04:17:22 pm
Bonjour bonjour à tous,

Je pouvais concatener des valeur avec la fonction strcat(), ou strncat()

Cependant, je "rempli" une varaible avec sprintf comme ceci
Code:
sprintf(coords,"<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>",cou,lon,lat,alt,tim,vel,sta,ind);
Le binz, c'est que ce bout de code est dans une boucle for, et dans certain cas, il doit s'ajouter d'autre ligne, comme celle ci-dessus et je ne dois pas écraser la valeur existante de "coords", mais y ajouter.

J'ai essayé avec strcat, un peu comme ca
Code:
strcat(coords,sprintf(coords,"<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>",cou,lon,lat,alt,tim,vel,sta,ind);)
mais évidement, la valeur en deuxième parametre coince.

Comment puis-je alors concatener ces valeurs dans coords?

M'avez-vous compris?

Milles mercis pour vos lumières
40  International / Français / Re: Les math et arduino, division de nombre on: October 27, 2013, 03:48:19 pm
Salut Super_cinci
Quote
tu n'es pas à un octet près
Oui c'est vrai, mais je suis tellement limite que j'essaye de grapiner partout.
Quote
par exemple au lieu de stocker des chaines de caractères, mets-les dans des float, ça fait 4 octets au lieu de 15
Oui en effet. Le problème qui se pose, c'est que j'utilise une librairire qui est bien (si je pouvais la remplacer, je serai comme meme content) mais je n'ai rien trouvé d'aussi complémentaire. C'est qu'il y a de mieux, pour le moment.
En effet, je pourrais utiliser des float. le problème c'est que cette librairie demande des char.

Par exemple, la fonction qui me retourne les positions GPS est la suivante
Code:
gps.getPar(lon,lat,alt,tim,vel);
Code:
char GPSGSM::getPar(char *str_long, char *str_lat, char *str_alt, char *str_time, char *str_speed)
{
char ret_val=0;
char *p_char;
char *p_char1;
gsm.SimpleWriteln("AT+CGPSINF=0");
gsm.WaitResp(5000, 100, "OK");
if(gsm.IsStringReceived("OK"))
ret_val=1;

//longitude
p_char = strchr((char *)(gsm.comm_buf),',');
p_char1 = p_char+1;  //we are on the first char of longitude
p_char = strchr((char *)(p_char1), ',');
if (p_char != NULL) {
          *p_char = 0;
    }
strcpy(str_long, (char *)(p_char1));

// latitude
p_char++;
p_char1 = strchr((char *)(p_char), ',');
if (p_char1 != NULL) {
          *p_char1 = 0;
    }
strcpy(str_lat, (char *)(p_char));

// altitude
p_char1++;
p_char = strchr((char *)(p_char1), ',');
if (p_char != NULL) {
          *p_char = 0;
    }
strcpy(str_alt, (char *)(p_char1));

// UTC time
p_char++;
p_char1 = strchr((char *)(p_char), ',');
if (p_char1 != NULL) {
          *p_char1 = 0;
    }
strcpy(str_time, (char *)(p_char));

// TTFF
p_char1++;
p_char = strchr((char *)(p_char1), ',');
if (p_char != NULL) {
          *p_char = 0;
    }

// num
p_char++;
p_char1 = strchr((char *)(p_char), ',');
if (p_char1 != NULL) {
          *p_char1 = 0;
    }

// speed
p_char1++;
p_char = strchr((char *)(p_char1), ',');
if (p_char != NULL) {
          *p_char = 0;
    }
strcpy(str_speed, (char *)(p_char1));

return ret_val;
}
et lon, lat, alt, tim et vel doivent etre des char. C'est la fonction qui le demande et je ne me sens pas compétent pour modifier cette fonction. Donc voilà, pour le moement, je fais avec et essaye d'obtimiser au mieux  smiley

Cette librairire est si non très bien mais énorme avec plein de fichiers.
J'aurais juste besoin d'une librairie qui me donne des fonctions qui me permettent de
  • Recolter des position GPS
  • Envoyer des données à un serveur distant, http (ou/et TCP)
  • Envoyer et lire des SMS
  • Enregister/effacer des numeros sur la carte SIM
  • Lire un ou des numero sur la carte SIM
  • Lire le niveau de batterie
  • Lire le IMEI
mais bon pour le moment, elle répond à mon besoin  smiley
41  International / Français / Les math et arduino, division de nombre on: October 27, 2013, 05:16:17 am
Bonjour à tous,

Par mesure de prévention j'aimerais controler la mémoire restante afin de savoir ce que je peux utiliser, sans faire cracher mon applic.

J'ai pour cela une petite fonction qui me retourne en int , la memoire restante. Je ne me souviens plus ou j'ai trouvé cette librairie, mais j'utilise MemoryFree, pour ceux qui la connaisse. (j'utilise un fonction en plus, car j'aimerais que des led flash s'il y a plus sufisemment de mémoire
Code:
CheckMEM();

Afin de savoir combien de fois, ma mémoire restante peu etre attribuer é ce que j'ai besoin , je pensais diviser la mémoire restante par l'addition de ce que vous coyez ci-dessous + 83
Code:
#define SIZECOU 15
#define SIZELON 15
#define SIZELAT 15
#define SIZEALT 15
#define SIZETIM 15
#define SIZEVEL 15
#define SIZESTA 1
#define SIZEIND 7
83+SIZECOU+SIZELON+SIZELAT+SIZEALT+SIZETIM+SIZEVEL+SIZESTA+SIZEIND
Sauf que CheckMEM retourn un int et que le #define, je ne sais pas si je dois le considérer pour un byte ou un int ou quoi
Comment puis rendre compatible tout ca?
Je préfere aussi utiliser des byte car 1 octet alors un int en prend 4
Code:
byte resultat;
resultat = CheckMEM() / (83+SIZECOU+SIZELON+SIZELAT+SIZEALT+SIZETIM+SIZEVEL+SIZESTA+SIZEIND);

if(resultat < 1){
// Ne fait rien
}else if(resulultat == 1){
// Fais une fois
}else if(resultat == 2){
// Fais deux fois
}

etc...
Je peux aussi faire ca avec un switch, je coirs que le switch est préférable pour l'optimisation ...

Voyez vous mon calcul?
42  International / Français / Re: Comment gérer la taille d'un char on: October 27, 2013, 12:33:35 am
Ok aussi, je peux commencer à diminuer certain char.

Par exemple, j'ai 4 char qui fau aussi ofice de tempo

lon, lat, vel, alt, time

Dans l'exemple de la librairie que j'utilise il est indiqué qu'il faut les déclarer ainsi

Code:
char lon[15]
char lat[15]
char alt[15]
char vel[15]
char time[15]
gps.getPar(lon,lat,alt,tim,vel);

Serial.println(lon);
Serial.println(lat);
Serial.println(alt);
Serial.println(vel);
Serial.println(time);

Maintenant une latitude ou altitude à 15 numero, ca fait peut etre un peu beaucoup surtout que ca fini souvent avec 4-5 zéro et 10 après la virgule.

Donc je me suis dit que je pouvais changer ainsi
Code:
char lon[9]
char lat[9];
char alt[9];
char vel[9];
char time[14]; //20131027073510, YYYYMMDDHHMMSS

Mais la je ne risque pas de fait bloquer mon programme vu que les chiffres sont plus grand que le char?
Si non, dois-je modifier aussi ,ma librairie pour qu'elle retourne des chiffre a 8 ou 14 chiffres?
43  International / Français / Re: Comment optimiser mon code en utilisant une variable à la place de deux on: October 26, 2013, 12:22:19 pm
Quote
Quote
Et toi tu la stockes dans:
Code:

char xmlLon[15]

Oui c'est juste, j'ai corrigé mon post après que tu aies répondu

Quote
Tu as parfaitement le droit d'écrire
Code:

sprintf(lon,"<lo>%s</lo>",lon);
Donc ca écrase la valeur précédente?
Je me sens tellement bete par rapport à ca. J'avais une fois essayé, mais ca m'avait généré une erreur, et depuis j'ai fait comme. Ou j'ai du confondre, Bref......

Merci
44  International / Français / Comment optimiser mon code en utilisant une variable à la place de deux on: October 26, 2013, 10:01:04 am
Bonjour à tous,

J'utilise due xvariable pour vusionner des valeurs. Soit

Code:
char lon[15]; // qui vaut 45.56543234444\0 (14+1)
et
Code:
char xmlLon[24]; //<lo>45.56543234444</lo>\0

Afin que la valeur de lon soit au fomat XML, j'utilise cette fonction
Code:
sprintf(xmlLon,"<lo>%s</lo>",lon);
Ce qui m'enbete c'est que j'utilise 30o de ma mémoire et j'ai bien entendu plusieur cas comme celui-ci.
Alors dans le but d'otimiser ma mémoire comment pourrais-je faire pour utiliser une variable et supprimer la varibale xmlLon, de maniere a ce que lon prenner la valeur de "<lo>45.56543234444</lo>\0"???

Merci
45  International / Français / Re: Comment gérer la taille d'un char on: October 25, 2013, 07:39:32 am
Hai, ben le problème c'est qu'il me reste 191 de mémoire. Donc je ne peux pas faire grand chose.

Quote
Comment optimiser : il y a beaucoup de caractère qui reviennent, autant les mettre dans la flash (fonction F()), et ne stocker dans l'EEPROM que ce qui nécessaire (tes coordonnées). Et lorsque tu as du réseau tu recomposes et tu envois.
En fait tout est stocké dans mon EEPROM

Tout ca, c'est extrait de l'EEPROM
Quote
<co>123456</co><lo>46.23546542341</lo><la>462.3546542341</la><al>457.0000000000</al><ti>20131025122500</ti><ve>1.00000000000</ve><st>1</st><co>123457</co><lo>46.23546542341</lo><la>462.3546542341</la><al>457.0000000000</al><ti>20131025122500</ti><ve>1.00000000000</ve><st>1</st><co>123458</co><lo>46.23546542341</lo><la>462.3546542341</la><al>457.0000000000</al><ti>20131025122500</ti><ve>1.00000000000</ve><st>1</st><co>123456</co><lo>46.23546542341</lo><la>462.3546542341</la><al>457.0000000000</al><ti>20131025122500</ti><ve>1.00000000000</ve><st>1</st><co>123459</co><lo>46.23546542341</lo><la>462.3546542341</la><al>457.0000000000</al><ti>20131025122500</ti><ve>1.00000000000</ve><st>1</st>

Simplement pour envoyé au serveur avec la fonction
Code:
inet.httpPOST(host, port, path, coords, "Result", 0);
La variable doit etre grande pour tout contenir
Pages: 1 2 [3] 4 5 ... 27