Les math et arduino, division de nombre

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

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

#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

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?

oui, mais... s'il te reste 258 octets de mémoire, tu liras resultat = 2... un byte est limité dans la plage [0, 255], alors qu'un int, c'est [-32 767, 32 767] pour seulement 2 octets...

Vu que tu travailles avec des chaines de caractères, tu n'es pas à un octet près... réfléchis plutôt à comment optimiser les données de ton GPS, par exemple au lieu de stocker des chaines de caractères, mets-les dans des float, ça fait 4 octets au lieu de 15...

et un #define n'occupe absolument pas de mémoire

Salut Super_cinci

tu n'es pas à un octet près

Oui c'est vrai, mais je suis tellement limite que j'essaye de grapiner partout.

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

gps.getPar(lon,lat,alt,tim,vel);
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 :slight_smile:

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 :slight_smile:

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

Le fait que la fonction te demande des chaînes de caractères ne t'impose pas de les stocker de ton coté sous la même forme. tu peux très bien les stocker dans ton EEPROM (ou dans un tableau en RAM) sous forme de flottants plus économes en mémoire et les convertir en chaînes de caractères au moment où tu en as besoin lorsque tu passes les valeurs à ta fonction.

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

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

char lon['15'];

par

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.