Fonction MODULO ( %) Pb sur résultat

Bonjour,
je me suis lancé dans l'étude d'un petit projet autour d'un module GPS.
Pour le moment, je teste mes fonctions avec le moniteur serie.
J'utilise la biblio TinyGPSv13 jusque là tout va bien sauf que :

1/- pour determiner le jour de la semaine (necessaire pour calculer si heure été ou hiver) j'utilise l'algorithme de Mike Keith.
Il y a un probleme avec la fonction Modulo (%). Par exemple, pour le 03/06/2014 j'obtients bien 2522.
...
int Mod1 = (23*mois)/9;
int Mod2= ...;
...
int Mod8=k;
int Mod9=Mod1+Mod2+Mod3+Mod4+Mod5-Mod6+Mod7-Mod8;

// j'ai detaillé chaque étape pour controler les valeurs et Mod9 prends la valeur de 2522
//le soucis arrive maintenant :
int Mod = Mod9 % 7;

J'obtiens systématique la valeur de 6 pour Mod alors que je devrais avoir 2.
Donc si vous avez une piste pour m'aider à resoudre ce 1er problème.

2/- Déclaration de variable
je souhaite utiliser ce resultat pour ornementer mon horloge et obtenir un format : Mar 3/6/2014.
j'ai utilisé :

variable Jalpha;
...
si Mod=0 alors Jalpha = Dim;
si Mod=1 alors Jalpha = Lun;
...

Serial.print(Jalpha);

je ne sais pas comment déclarer la variable Jalpha j'ai essayé en int ou char mais à l'affichage du moniteur série j'ai " " ou des nombres.

Merci pour vos aides, et je suis preneur pour toutes info concernants de bons ouvrages didactiques sur la programmation arduino, pas comment faire clignoter une Led, mais pour bien comprendre la structure déclarative de variables et la construction de fonction.

Voir le site OpenClassRoom (ex site du zéro)
http://fr.openclassrooms.com/

Ok merci, je commence à voir l'amorce d'une réponse pour résoudre mon second problême.
Par contre rien qui puisse m'aiguiller pour le soucis rencontré avec la fonction Modulo (%).

ajoute des Serial.print() pour voir l'état des variables de ton calcul.

roland06:
// j'ai detaillé chaque étape pour controler les valeurs et Mod9 prends la valeur de 2252
//le soucis arrive maintenant :
int Mod = Mod9 % 7;

J'obtiens systématique la valeur de 6 pour Mod alors que je devrais avoir 2.
Donc si vous avez une piste pour m'aider à resoudre ce 1er problème.

Juste en passant : 2252 modulo 7 = 5 :*

+1 pour les Serial.print()

Je pense que tu as du faire une erreur de saisie quelque part mais comme tu n’as pas mis ton code on ne peut pas juger

J’ai trouvé la fonction dont tu parles. Il n’y a rien à modifier à part des (int) à ajouter.

byte F1(int y, int m, int d) { // d = 1..31; m = 1..12
  return ((d+=m<3?y--:y-2, (int)floor(23*m/9)+d+4+(int)floor(y/4)
	   - (int)floor(y/100)+ (int)floor(y/400)) % 7); }

edit : Un petit (vraiment très petit) morceau de code pour tester la fonction

char jour[7][5]={"dim.","lun.","mar.","mer.","jeu.","ven.","sam"};

byte F1(int y, int m, int d) { // d = 1..31; m = 1..12
  return ((d+=m<3?y--:y-2, (int)floor(23*m/9)+d+4+(int)floor(y/4)
	   - (int)floor(y/100)+ (int)floor(y/400)) % 7); }

void setup(void){
  Serial.begin(9600);
  for(byte i=3;i<15;i++){
    Serial.print(i);
    Serial.print("/6/2014 = "),
    Serial.println(jour[F1(2014,06,i)]);
  }
}

void loop(void){}

Salut,

int Mod9=Mod1+Mod2+Mod3+Mod4+Mod5-Mod6+Mod7-Mod8;

pourquoi **-**Mod8 ? ce ne serait pas plutôt un + ? (juste comme ça... pareil pour Mod6)

Super_Cinci:
Salut,

int Mod9=Mod1+Mod2+Mod3+Mod4+Mod5-Mod6+Mod7-Mod8;

pourquoi **-**Mod8 ? ce ne serait pas plutôt un + ? (juste comme ça… pareil pour Mod6)

la formule est correcte.
j’ai fait des Serial.print( Mod1 à Mod9) tout est conforme
j’ai mes résultats (verifiés par ailleurs)
3/6/2014 me donne 2522 pour Mod9
4/6/2014 me donne 2523 pour Mod9

le probleme est dans cette ligne :
int Mod = Mod9 % 7 ;
Serial.print(Mod); affiche 6 quelque soit la date alors qu’il devrait etre à 2 (Mardi) pour le 3/6/2014 et à 3 (Mercredi) pour le 4/6/2014
sachant que cette formule nous donne 0:Dim, 1:Lun,…,6:Sam.

fdufnews:
Je pense que tu as du faire une erreur de saisie quelque part mais comme tu n’as pas mis ton code on ne peut pas juger

J’ai trouvé la fonction dont tu parles. Il n’y a rien à modifier à part des (int) à ajouter.

byte F1(int y, int m, int d) { // d = 1..31; m = 1..12

return ((d+=m<3?y–:y-2, (int)floor(23*m/9)+d+4+(int)floor(y/4)
  - (int)floor(y/100)+ (int)floor(y/400)) % 7); }




edit : Un petit (vraiment très petit) morceau de code pour tester la fonction


char jour[7][5]={“dim.”,“lun.”,“mar.”,“mer.”,“jeu.”,“ven.”,“sam”};

byte F1(int y, int m, int d) { // d = 1…31; m = 1…12
  return ((d+=m<3?y–:y-2, (int)floor(23*m/9)+d+4+(int)floor(y/4)
  - (int)floor(y/100)+ (int)floor(y/400)) % 7); }

void setup(void){
  Serial.begin(9600);
  for(byte i=3;i<15;i++){
    Serial.print(i);
    Serial.print("/6/2014 = "),
    Serial.println(jour[F1(2014,06,i)]);
  }
}

void loop(void){}

Merci pour ce code, je le testerai ce soir en rentrant.

bricoleau:

roland06:
// j'ai detaillé chaque étape pour controler les valeurs et Mod9 prends la valeur de 2252
//le soucis arrive maintenant :
int Mod = Mod9 % 7;

J'obtiens systématique la valeur de 6 pour Mod alors que je devrais avoir 2.
Donc si vous avez une piste pour m'aider à resoudre ce 1er problème.

Juste en passant : 2252 modulo 7 = 5 :*

+1 pour les Serial.print()

Désolé il s'agit d'une erreur de saisie, le resultat est 2522, donc 2522 modulo 7 =2;

=(

et si au lieu de "int Mod = ..." tu faisais "word Mod = ..." voire remplacer toutes tes déclarations d'int par des word...

Un truc tout neuneu, et ça ne changera rien pour toi, mais ça te permet de repasser sur des entiers non signés (a-t-on déjà vu une date négative?), il est possible que ça foire un peu quand on mélange des signés et non signés...

word ? plutôt unsigned.

roland06:
=(

Si tu t'expliquais tu ne crois pas qu'on gagnerait du temps.
Qu'est-ce qui ne va pas?

XavierMiller:
word ? plutôt unsigned.

quelque part dans le core arduino, il y a la ligne :
#define word uint16_t, et c'est plus facile à écrire XD (encore ce foutu #define! mais celui-là, il passe dans toutes les autres libs! c'est pas juste!)

/* sketch pour tester le calcul automatique
de l'heure ETE ou HIVER avec le logiciel
"Simulator for Arduino" de Virtronics, download :
http://www.virtronice.com.au/Data/SetupF.zip
La date est rentrée sous forme de valeurs analogiques
date =A0, mois = A1, an = A3 (00 à 999) pour années 2000 à 2999.
Dans ce sketch, nous calculons que le jour du passage, on peut
facilement gérer l'heure de passage.
*/


char k; //calcul du jour de la semaine
char jour; //=Mod calcul de HEH (ete/hiver)
char HEH; // =1 pour Heure Hiver, =2 pour Heure Ete
int z; //calcul du jour de la semaine
int Mod; //resultat jour de semaine 0=D,1=L,...6=S
int Mod1; //calcul du jour de la semaine
int Mod2; //calcul du jour de la semaine
int Mod3; //calcul du jour de la semaine
int Mod4; //calcul du jour de la semaine
int Mod5; //calcul du jour de la semaine
int Mod6; //calcul du jour de la semaine
int Mod7; //calcul du jour de la semaine
int Mod8; //calcul du jour de la semaine
int Mod9; //calcul du jour de la semaine
int annee; //calcul du jour de la semaine



void setup(){
}

void loop () {
  //calcul de Mod = jour semaine
  int date = analogRead(A0);
  int mois = analogRead(A1);
  int an = analogRead(A2);
  annee = an+2000;
  if (mois<3){
    z = annee - 1;
    k = 0;
  }
  else {
    z = annee;
    k = 2;
  }
  Mod1 = ((23*mois)/9);
  Mod2 = date;
  Mod3 = 4;
  Mod4 = annee;
  Mod5 = z/4;
  Mod6 = z/100;
  Mod7 = z/400;
  Mod8 = k;
  Mod9 = Mod1 + Mod2 + Mod3 + Mod4 + Mod5 - Mod6 + Mod7 - Mod8;
  Mod = Mod9 % 7;
  jour = Mod;

// Calcul heure Ete / heure Hiver
if (mois<3){
    HEH = 1;
}
if (mois == 3){
  if ((date-jour)>24){
    HEH = 2;
  }
  else{
    HEH = 1;
  }
}
if ((mois>3)&&(mois<10)){
  HEH = 2;
}
if (mois==10){
  if((date-jour)>24){
    HEH = 1;
  }
  else{
    HEH = 2;
  }
}
if (mois>10){
  HEH=1;
}
 

}

avant d’integrer ce module dans mon programme global, avez vous des remarques ou des simplifications possibles…

J'ai un comentaire : AnalogRead retourne une valeur entre 0 et 1024, ce qui n'est pas une plage plausible pour un mois ou un jour.

Et comment encoder 2014 ???

avec le simulateur, c’est le seul moyen de pouvoir faire varier … une variable.
en faisant varier l’entree A0 de 1 à 31 pour les jours, A1 de 1 à 12 pour les mois, A3 pour les année 14 pour 2014, 15 pour 2015…
apres dans le montage final, les valeurs seront celles du GPS renvoyées par TinyGPS.

Ne serait-ce pas plus facile d'envoyer des valeurs par le port série ?