Bonjour, comme je l'ai cherché sur le forum et que je n'ai rien trouvé. Voici une petite routine pour calculer la date de Pâques. Ce n'est pas mis en forme. Le calcul est valable pour le calendrier Grégorien et jusqu'en 4099, enfin, c'est ce qui est écrit sur le site?
(Easter Date Algorithme) http://dates.gmarts.org/eastalg.htm#geteasterdatec
void setup() {
Serial.begin(9600); // open the serial port at 9600 bps:
Paques();
}
void loop() {
}
void Paques() {
int a;
int b;
int c;
int d;
int e;
int f;
int g;
int h;
int j;
int k;
int m;
int n;
int p;
int y =2016;// c'est l'année
int dy;
int mth;
a = y / 100;
b = y % 100;
c = (3 * (a + 25)) / 4;
d = (3 * (a + 25)) % 4;
e = (8 * (a + 11)) / 25;
f = (5 * a + b) % 19;
g = (19 * f + c - e) % 30;
h = (f + 11 * g) / 319;
j = (60 * (5 - d) + b) / 4;
k = (60 * (5 - d) + b) % 4;
m = (2 * j - k - g + h) % 7;
n = (g - h + m + 114) / 31;
p = (g - h + m + 114) % 31;
dy = p + 1;
mth = n;
Serial.print("Pour l'année ");
Serial.println(y);
Serial.print("jour de paque : ");
Serial.println( dy);
Serial.print(" N° mois : ");
Serial.println( mth);
}
Bonjour,
Pour ne pas perdre la main et très rapidement car je n'ai pas beaucoup de temps :
constexpr byte tailleMax = 4;
char serieChiffres[tailleMax + 1]; // +1 pour le '\0'
constexpr char marqueurDeFin = '\n'; //
int n, p;
void setup() {
Serial.begin(115200); // open the serial port at 9600 bps:
}
void loop() {
if (!serieChiffresRecu()) {
Paques((atoi(serieChiffres)), &p, &n);
Serial.print("jour de paque : ");
Serial.println(p);
Serial.print(" N° mois : ");
Serial.println(n);
}
}
void Paques(int y, int *leJour, int *leMois) {
int a, b, c, d, e, f, g, h, j, k, m;
a = y / 100;
b = y % 100;
c = (3 * (a + 25)) / 4;
d = (3 * (a + 25)) % 4;
e = (8 * (a + 11)) / 25;
f = (5 * a + b) % 19;
g = (19 * f + c - e) % 30;
h = (f + 11 * g) / 319;
j = (60 * (5 - d) + b) / 4;
k = (60 * (5 - d) + b) % 4;
m = (2 * j - k - g + h) % 7;
*leMois = (g - h + m + 114) / 31;
*leJour = ((g - h + m + 114) % 31) + 1;
Serial.print("Pour l'année ");
Serial.println(y);
}
bool serieChiffresRecu() {
static byte indexserieChiffres = 0;
boolean serieChiffresEnCours = true;
int r = Serial.read();
if (r != -1) { // on a reçu un caractère
if (r == marqueurDeFin) {
serieChiffres[indexserieChiffres] = '\0'; // on termine la c-string
indexserieChiffres = 0; // on se remet au début pour la prochaine fois
serieChiffresEnCours = false;
} else {
if ((r != '\r') && (indexserieChiffres < tailleMax))
serieChiffres[indexserieChiffres++] = (char) r; // on stocke le caractère et on passe à la case suivante
}
}
return serieChiffresEnCours;
}
Il y a très certainement mieux à faire mais je n'ai pas trop de temps. Vous saisissez l'année dans le moniteur série et vous appuyez sur entrée ...
je retournerai l'opposé pour ne pas avoir le NOT dans le test ou changer le nom de la fonction, ce serait plus lisible de manière naturelle "si j'ai reçu une série de chiffre, alors je la traite"
constexpr byte tailleMax = 4;
char serieChiffres[tailleMax + 1]; // +1 pour le '\0'
constexpr char marqueurDeFin = '\n'; //
int n, p;
void setup() {
Serial.begin(9600); // open the serial port at 9600 bps:
}
void loop() {
if (serieChiffresRecu()) {
Paques((atoi(serieChiffres)), p, n);
Serial.print("jour de paque : ");
Serial.println(p);
Serial.print(" N° mois : ");
Serial.println(n);
}
}
void Paques(int y, int &leJour, int &leMois) {
int a, b, c, d, e, f, g, h, j, k, m;
a = y / 100;
b = y % 100;
c = (3 * (a + 25)) / 4;
d = (3 * (a + 25)) % 4;
e = (8 * (a + 11)) / 25;
f = (5 * a + b) % 19;
g = (19 * f + c - e) % 30;
h = (f + 11 * g) / 319;
j = (60 * (5 - d) + b) / 4;
k = (60 * (5 - d) + b) % 4;
m = (2 * j - k - g + h) % 7;
leMois = (g - h + m + 114) / 31;
leJour = ((g - h + m + 114) % 31) + 1;
Serial.print("Pour l'année ");
Serial.println(y);
}
bool serieChiffresRecu() {
static byte indexserieChiffres = 0;
boolean serieChiffresEnCours = false;
int r = Serial.read();
if (r != -1) { // on a reçu un caractère
if (r == marqueurDeFin) {
serieChiffres[indexserieChiffres] = '\0'; // on termine la c-string
indexserieChiffres = 0; // on se remet au début pour la prochaine fois
serieChiffresEnCours = true;
} else {
if ((r != '\r') && (indexserieChiffres < tailleMax))
serieChiffres[indexserieChiffres++] = (char) r; // on stocke le caractère et on passe à la case suivante
}
}
return serieChiffresEnCours;
}
Dommage j'aime bien les pointeurs même si c'est plus lisible par référence
Mais je vous suis quand même car c'est bien plus simple et vous avez raison
bool serieChiffresRecu() {
static byte indexserieChiffres = 0;
boolean serieChiffresEnCours = true;
int r = Serial.read();
if (r != -1) { // on a reçu un caractère
if (r == marqueurDeFin) {
serieChiffres[indexserieChiffres] = '\0'; // on termine la c-string
indexserieChiffres = 0; // on se remet au début pour la prochaine fois
serieChiffresEnCours = false;
} else {
if ((r != '\r') && (indexserieChiffres < tailleMax))
serieChiffres[indexserieChiffres++] = (char) r; // on stocke le caractère et on passe à la case suivante
}
}
return ! serieChiffresEnCours;
}
et pour la lisibilité du code
➜
int numJour, numMois;
void loop() {
if (serieChiffresRecu()) {
Paques((atoi(serieChiffres)), numJour, numMois);
Serial.print("jour de pâques : ");
Serial.println(numJour);
Serial.print(" N° mois : ");
Serial.println(numMois);
}
}
un chiffre est reçu s'il n'y a plus de réception en cours, donc il faut mettre le NOT
sinon avec votre nouveau code il faut changer le nom de la variable dans la fonction pour qu'elle soit parlante
bool serieChiffresRecu() {
static byte indexserieChiffres = 0;
boolean receptionTerminee = false; // <=== ici changement de nom
int r = Serial.read();
if (r != -1) { // on a reçu un caractère
if (r == marqueurDeFin) {
serieChiffres[indexserieChiffres] = '\0'; // on termine la c-string
indexserieChiffres = 0; // on se remet au début pour la prochaine fois
receptionTerminee = true;
} else {
if ((r != '\r') && (indexserieChiffres < tailleMax))
serieChiffres[indexserieChiffres++] = (char) r; // on stocke le caractère et on passe à la case suivante
}
}
return serieChiffresEnCours;
}
ou alors pas de variable du tout
bool serieChiffresRecu() {
static byte indexserieChiffres = 0;
int r = Serial.read();
if (r != -1) { // on a reçu un caractère
if (r == marqueurDeFin) {
serieChiffres[indexserieChiffres] = '\0'; // on termine la c-string
indexserieChiffres = 0; // on se remet au début pour la prochaine fois
return true;
} else {
if ((r != '\r') && (indexserieChiffres < tailleMax))
serieChiffres[indexserieChiffres++] = (char) r; // on stocke le caractère et on passe à la case suivante
}
}
return false;
}
Oui @J-M-L c'est encore bien mieux et encore plus simple
Décidément la simplicité c'est pas mon fort
PS : Je n'avais pas lu les messages précédents, oui le smiley n'est pas justifié
Dans mon idée lorsque le tableau est rempli, la condition est vraie mais ce n'était pas mon choix de départ donc j'ai tord sur toute la ligne ...
Vous avez raison, il faut toujours rester lisible pour soit et pour les autres. La dernière version est la meilleure
Bonne journée.