Show Posts
Pages: 1 2 [3] 4 5 ... 26
31  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?
32  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?
33  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
34  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
35  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
36  International / Français / Comment gérer la taille d'un char on: October 25, 2013, 06:59:59 am
Bonjour à tous,

Me voilà de retour sur mon projet apèrs une petite pause obligatoire  smiley

Je dois répondre a une question de taille d'une variable de type char.

En gros, je dois envoyé des valeurs au format xml. Ces valeurs sont collectées toutes les minutes et enregistrés dans un EPROM.
Je ne souhaite pas que ces valeurs soient envoyés toutes les minutes, mais toutes les 5 minutes. Donc toutes les minutes il y aura 5 set de valeurs
Aussi s'il n'y a pas de réseau 3G, elles peuvent etre envoyé après 10 ou 15 mn, et évidement le contenu de l'EEPROM augmente jusqu'a l'envoi.

L'envoi
Pour envoyé ces valeurs au serveur, j'utilise une fonction d'une librairie
Code:
//inet.httpPOST(host, port, path, coords, "Result", 0);
Format des données
C'est la valiable "coords", de type char, qui contient les données.
Un set de donnée est sous cette forme
Quote
char coords["<fix><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></fix>"]
Mais vu qu'il doit envoye 5 set tous les 5 minutes, la variable "coords" prendra ceci (avec des valeurs différentes bien sure):
Quote
char coords["<fix><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></fix>"]
et s'il n'y a pas de connection réseau, et bien il y a plus de données à envoyé

Donc je dois me mettre dans l'hypothese ou je suis en montagne, mon GPS collecte les données et les stock dans mon EEPROM. Mais en montagne il ne peu ne pas avoir de connection 3G pendant, une heure, ou plus.

Dans mon char coords peut devenir très gros.


Donc j'ai une question, comment puis gérer mon char coords, sans que mon Arduino Mini Pro crash, sachant que j'ai déjà 25k604 de code (sketch size) sur 32k720?????

Je vous remercie pour vos lumières et vous souhaite un bon week.end, d'avance


37  International / Français / Re: Comment incrémenter ceci 0x0100 on: September 30, 2013, 12:44:58 pm
Alors, oui j'ai essayé d'utiliser de int au lieu des long int.
et avec des int ca fonctionne.

Le truc c'est que je suis limitl à 32763  aors que le long int va au moins jusqu'a la valeur max de l'EEPROM soit de 262144.
Je suis conscient qu'il sera extrement rare d'aller jusquà ce grand nombre


Mais bon c'est vrai que j exagere puisque 32763min fait 546 heure.  smiley
38  International / Français / Re: Comment incrémenter ceci 0x0100 on: September 30, 2013, 10:02:50 am
Hello!

Oui j'avais essayéc eci sans succès
Code:
index_EPROM+=1L;

J'ai reproduit cette exrcice afin d'exclure une partie de mon code.
Ceci me permets de tester aJSON (qui ne marche pas, ca n'affiche le format JSON, mais doit encore chercher  smiley https://github.com/interactive-matter/aJson/blob/master/README.md ),

Mais avant, je souhaiterai comprendre et résoudre l'incrémentation qui ne dépasse pas 10L. J'ai mis les commentaire, dans le code.
Ha, ne le lisez pas le tout. Le probleme se situe dans setup() et dans loop(). Mais si c'est reglé dans setup(), ben ca regler dans loop()  smiley

Par contre je dois mettre le code me dehor du post, a cause de la limitation du nombre de caratctere:
http://www.hello-web.net/temp/forum2.html
39  International / Français / Re: Comment incrémenter ceci 0x0100 on: September 29, 2013, 04:30:55 pm
Hello,

Je constate qu'il y a un probleme au niveau de l'incrémentation (index)

Ceci est mon index
Code:
unsigned long int index_EPROM = 0L;

Je l'incrlmente simplement comme ceci

Code:
index_EPROM++;

Le truc c'es qu'il ne depasse pas 10. Ensuite il recommence à 0.
C'est pas bisard alors qu'on est en long int?
40  International / Français / Re: Comment remplacer une valeur d'une varaiable on: September 28, 2013, 03:23:16 pm
Ok, merci fdufnews,

Juste encore un petit détail.

On es d'accord, si je t'ai bien compris, que ci je compatre

int c = 0;
et unsigned long int d = 22222222222;

c doit être alors un long int alors?
J'aurai tendance à dire, non, qu'il n'y a pas besoin.

Mais tu as écris
Quote
Évidemment la remarque sur le type long s'applique aussi aux variables qui vont utiliser cette constante.
Qui me met donc dans le doute.
Dans un sens ca me semble logique que la variable c doit est un long int, si du coup elle prend une valeur supérieur à 65536.
Mais si elle ne devait pas être supérieur à 65536 (ce qui ne sera pas mon cas), elle peut rester en int.

non?
41  International / Français / Re: Comment remplacer une valeur d'une varaiable on: September 28, 2013, 02:30:21 pm
J'ai rwgardé un peu la doc arduino

Es-tu sure de ca ?
Code:
const unsigned long int eprom_size = 262144L ; //32768  // taille de l'EPROM en octets
ne serait-ce pas
Code:
const unsigned long eprom_size = 262144L ; //32768  // taille de l'EPROM en octets
sans le int? Qu'es-ce qui diffère réellement?

Mais au final, il faudrait que je moifie pas mal de petite chose
Code:
unsigned int index2_EPROM =0;
unsigned long int index_EPROM = 0L; // PARCE QU?IL PEUT MONTER JUSQU A 262144
const unsigned long int eprom_size = 262144L; // Micro proc : 24LC256
const unsigned long int eprom_inc = 84L; // PARCE QU IL EST DIVISER AVEC eprom_size (J aurai peut etre un probleme avec celui-la...

// Si index2_EPROM est plus grand que 0, alors loop toute l'eeprom. index2_EPROM est > 0, car l'eeprom a été remplie et est donc pleine.
// (les enregistrement suivants, aurons repris à 0x0000).
if(index2_EPROM>0){
    // Si oui index_EPROM prend la valeur maximal que peut avoir index_eprom, sachant que l'eprom 24LC256 à 250k
    index_EPROM += ((eprom_size/eprom_inc)-1);
    index2_EPROM = 0;
   
  }
  // Loop the eeprom
  for(long int c=0; c <= index_EPROM; c++){ // PARCE QU'IL EST COMPARER AVEC index_EPROM QUI PEUT MONTER JUSQU A 262144L
    readEEPROM(rom,(eprom_inc*c)+eprom_cou, course_id);
    readEEPROM(rom,(eprom_inc*c)+eprom_lon, lon);
    readEEPROM(rom,(eprom_inc*c)+eprom_lat, lat);
    readEEPROM(rom,(eprom_inc*c)+eprom_alt, alt);
    readEEPROM(rom,(eprom_inc*c)+eprom_tim, time);
    readEEPROM(rom,(eprom_inc*c)+eprom_vel, vel);
    readEEPROM(rom,(eprom_inc*c)+eprom_sta, _stat);
   
    // Convert into XML format (has to be done very soon)

   // Merge in coords
    sprintf(coords, "g=%s,%s,%s,%s,%s,%s,%s,%s",course_id,lon,lat,alt,time,vel,_stat,c);
   #ifdef DEBUG
      // Display the red values, but will be soon built in XML format
      Serial.println(coords);
  #endif
   }
 
  index_EPROM = 0L; // L PAREC QUE C EST UN LONG
En gros, c'est ca si j ai bien compris fdufnews. N'es-ce pas?
42  International / Français / Re: Comment remplacer une valeur d'une varaiable on: September 28, 2013, 12:31:41 pm
Salut,
Merci pour cette Remarque qui a sont importance. J ai compile sans avoir de message d erreur, Mais je n ai pas encore tester le cas ou.

Je vais Donc me pancher la dressus. Merci pour ce detail  smiley
43  International / Français / Re: Comment remplacer une valeur d'une varaiable on: September 27, 2013, 05:09:08 pm
ok
Quote
du coup, 256Ko = 256 x 1024 octets = 262144 octets
En effet, j'ai voulu arondir à 256000. De toute maniere je crois que j'ai beaucoup de marge. Ceci etant dit, j'ai comme meme modifier à 262144
Quote
un conseil : définis in truc genre index_eprom_max dès le début
Oui c'est bien ce que j'ai fait. Il est en tete de mon script
Code:
const unsigned int eprom_size = 262144; //32768  // taille de l'EPROM en octets

Quote
l'opérateur "+=" incrémente,
l'opérateur "=" affecte.
Super, c'est maintenant très très claire.

je suis super content. Car ca semble vraiment bien fonctionner. Je dois encore tester et vérifier pour continuer serainement  smiley
J'étais vraiment bloqué mais là, j'ai déjà pu deja attaqué la lecture de l'eeprom pour l'envoi, grâce a tes exemples. Ca ma vraiment débloqué:
Code:
writeEEPROM(rom,(eprom_inc*index_EPROM)+eprom_lon,lon);

Encore merci.

Prochain gors chapitre : XML; mettre ce qui est collecter par la boucle
Code:
for(int c=0; c <= index_EPROM; c++){}
au fomat XML pour envoyer une fois, le tout, après la boucle, sur le serveur! Mais j'ai déjé une piste.
44  International / Français / Comment remplacer une valeur d'une varaiable on: September 27, 2013, 03:58:32 pm
Bonjour à tous,

je mexcuse pour cette question si bête, mais ca me plane dans un doute.


Sachant que
Code:
unsigned int index_EPROM = 0;
const unsigned int eprom_size = 256000; // Micro proc : 24LC256
const unsigned int eprom_inc = 84;

// Si index2_EPROM est plus grand que 0, alors loop toute l'eeprom. index2_EPROM est > 0, car l'eeprom a été remplie et est donc pleine.
// (les enregistrement suivants, aurons repris à 0x0000).
if(index2_EPROM>0){
    // Si oui index_EPROM prend la valeur maximal que peut avoir index_eprom, sachant que l'eprom 24LC256 à 250k
    index_EPROM += ((eprom_size/eprom_inc)-1);
    index2_EPROM = 0;
    
  }
  // Loop the eeprom
  for(int c=0; c <= index_EPROM; c++){
    readEEPROM(rom,(eprom_inc*c)+eprom_cou, course_id);
    readEEPROM(rom,(eprom_inc*c)+eprom_lon, lon);
    readEEPROM(rom,(eprom_inc*c)+eprom_lat, lat);
    readEEPROM(rom,(eprom_inc*c)+eprom_alt, alt);
    readEEPROM(rom,(eprom_inc*c)+eprom_tim, time);
    readEEPROM(rom,(eprom_inc*c)+eprom_vel, vel);
    readEEPROM(rom,(eprom_inc*c)+eprom_sta, _stat);
    
    // Convert into XML format (has to be done very soon)

   // Merge in coords
    sprintf(coords, "g=%s,%s,%s,%s,%s,%s,%s,%s",course_id,lon,lat,alt,time,vel,_stat,c);
   #ifdef DEBUG
      // Display the red values, but will be soon built in XML format
      Serial.println(coords);
  #endif
   }
  
  index_EPROM = 0;


Dans un préceédent post, on m'avait expliquer que
Code:
index_EPROM += ((eprom_size/eprom_inc)-1);
était la meme chose que
Code:
index_EPROM = index_EPROM + ((eprom_size/eprom_inc)-1);
Donc le premier est plus simple en écriture
Dans ce cas on parle "d'incrémentation" ou d'addition.

Donc dans mon code, si-dessus, ceci est faux
Code:
index_EPROM += ((eprom_size/eprom_inc)-1);
Car il incrémente alors que je veux remplacer, et devrait être
Code:
index_EPROM = ((eprom_size/eprom_inc)-1);
pour prendre sa valeur.

Donc on est bien d'accord ensemble?

J'ai un peu honte de poser cette question, car je donne probablement la réponse et peut etre que je suis encore confu avec les chars.

Vlaaaa, au pire des cas j'ai un blâme  smiley-cry
45  International / Français / Re: Comment incrémenter ceci 0x0100 on: September 27, 2013, 05:54:56 am
Super. Milles mercis pour tout ces explications. C'est super cool.

Quote
Pour la bière, t'inquiète, je n'oublie pas, méfiance si un jour tu viens en vacances dans le coin!
J'y étais, y a ....deux ans. Et comme ca été vraiment bien, ca sera en grand plaisir de revenir.

 smiley-cool
Pages: 1 2 [3] 4 5 ... 26