% (modulo)
% est un opérateur, comme l'est /, +, -, *... L'opération a % b donne le reste de la division entière de a par
b. Prenons un exemple:
si je divise 1458 par 100, et que 1458 et 100 sont des nombres entiers, 1458/100 donne 14 car c'est l'entier arrondi
1458%100 donne 58, c'est le reste!
Au passage si un des deux nombres est un réel (il a été déclaré float) le résultat de 1458/100 donnera 14.58 .
Utilisation
On utilise assez peu l'opérateur modulo, et c'est pourquoi in n'est pas décrit dans mes bases de l'Arduino. Mais nous allons voir deux exemples.
Parité d'un nombre
Je propose que l'on écrive un programme pour tester si un nombre donné est pair ou impaire.
Comme souvent, pour résoudre le problème, on fait "comme si on le faisait à la main". Première méthode: je ne regarde que le dernier chiffre et si c'est 0, 2, 4, 6, ou 8, je dis qu'il est pair sinon je dis qu'il est impair. Pour l'informatique, on pourra faire beaucoup mieux, mais on verra plus tard.
Tant qu'à faire on pourra aussi tester si le nombre est divisible par 5, et par 10 (car il suffit du chiffre des unités.
Pour avoir le chiffre des unités d'un nombre, l'opérateur modulo a toute sa place. N%10 (reste de la division par 10 de N) donne précisément le chiffre des unités de N.
Le nombre proposé sera donné à la console, et tant qu'à faire, on va boucler (par loop()) pour faire plusieurs tests. On n'a pas besoin de terminer le programme, car on ne peut pas arrêter le microcontrôleur ni rendre la main au système d'exploitation. loop() va ressembler à:
//###################################################################
//###################################################################
//#### ####
//#### Olivier Pécheux ####
//#### Olivier@Pecheux.fr ####
//#### (33) +6 69 77 82 58 ####
//#### http://arduino.dansetrad.fr ####
//#### ####
//###################################################################
//###################################################################
// Ce programme affiche le nombre entier tapé à la console. Les
// différents chiffres sont lus les uns après les autres.
void setup()
{
Serial.begin(115200); // Il faut aussi régler la console sur 115200 bauds
// Ne pas oublier aussi de choisir dans la console "nouvelle ligne" seulement
Serial.setTimeout(-1); // Temps de saisie illimitée ou presque
}
String lecture; // Chaîne lue
int nombre; // Contiendra le résultat final
byte unite; // Chiffre des unités des nombre
void loop()
{
// Lecture du nombre à la console
lecture = Serial.readStringUntil('\n'); // Lecture de la chaîne complète
nombre = lecture.toInt(); // Récupération de la valeur contenue dans la chaîne
if (nombre<0) nombre=-nombre; // Au cas où le nombre serait négatif
// Extraction du chiffre des unités
unite = nombre % 10;
// Affichage de la parité
Serial.print("Le nombre ");
Serial.print(nombre);
if ((unite == 0) || (unite == 2) || (unite == 4) || (unite == 6) || (unite == 8))
Serial.println(" est pair");
else Serial.println(" est impair");
// Divisibilité par 5
Serial.print("Le nombre ");
Serial.print(nombre);
if ((unite == 0) || (unite == 5))
Serial.println(" est divisible par 5");
else Serial.println(" n'est pas divisible par 5");
// Divisibilité par 10
Serial.print("Le nombre ");
Serial.print(nombre);
if (unite == 0)
Serial.println(" est divisible par 10");
else Serial.println(" n'est pas divisible par 10");
}
On va faire mieux
En fait, on peut faire beaucoup plus simple. Un nombre est divisible par 2 (respectivement par 3, 4, 5, 6, 7...) si le reste de la division de ce nombre par 2 (respectivement par 3, 4, 5, 6, 7...) est nul.
La méthode fonctionnant pour 2, 3, 4.., on peut faire une boucle pour tester la divisibilité par les premiers nombres. Le programme peut ressembler à:
//###################################################################
//###################################################################
//#### ####
//#### Olivier Pécheux ####
//#### Olivier@Pecheux.fr ####
//#### (33) +6 69 77 82 58 ####
//#### http://arduino.dansetrad.fr ####
//#### ####
//###################################################################
//###################################################################
// Ce programme affiche le nombre entier tapé à la console. Les
// différents chiffres sont lus les uns après les autres.
void setup()
{
Serial.begin(115200); // Il faut aussi régler la console sur 115200 bauds
// Ne pas oublier aussi de choisir dans la console "nouvelle ligne" seulement
Serial.setTimeout(-1); // Temps de saisie illimitée ou presque
}
String lecture; // Chaîne lue
int nombre; // Contiendra le résultat final
byte diviseur; // Pur tester si nombre est divisible par diviseur
void loop()
{
// Lecture du nombre à la console
lecture = Serial.readStringUntil('\n'); // Lecture de la chaîne complète
nombre = lecture.toInt(); // Récupération de la valeur contenue dans la chaîne
if (nombre<0) nombre=-nombre; // Au ca où le nombre serait négatif
// Affichages
for (diviseur = 2; diviseur <= 10; diviseur++)
{
Serial.print("Le nombre ");
Serial.print(nombre);
if ((nombre % diviseur) == 0) Serial.print(" est divisible par ");
else Serial.print(" n'est pas divisible par ");
Serial.println(diviseur);
}
Serial.println(); // Pour séparer les différentes valeurs de départ
}
Deuxième exemple: 5 boucles
On souhaite incrémenter un nombre, et si ce nombre arrive à une certaine valeur, on le repasse à zéro. Si on affiche le nombre, on aura par exemple la succession:
0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3...
Cette succession permet par exemple de gérer en boucle N mouvements, de faire une démo sur un écran dans les 4 directions, ...
Por réaliser cette incrémentation, on ajoute systématiquement 1, puis on ne garde que le reste de la division par 6 pour l'exemple affiché. Notes que si on veut compter non pas par un nombre quelconque mais par une puissance de deux, un et logique fait l'affaire pour moins cher. Le programme peut faire:
//###################################################################
//###################################################################
//#### ####
//#### Olivier Pécheux ####
//#### Olivier@Pecheux.fr ####
//#### (33) +6 69 77 82 58 ####
//#### http://arduino.dansetrad.fr ####
//#### ####
//###################################################################
//###################################################################
// Ce programme affiche la succession 0 1 2 3 4 5 0 1 2 3 4 5 0 1 ...
void setup()
{
Serial.begin(115200); // Il faut aussi régler la console sur 115200 bauds
}
byte nombre = 0; // Nombre qui sera affiché
void loop()
{
// Affichage
Serial.println(nombre);
// Incrémentation
nombre = (nombre + 1) % 6; // ++nombre % 6 donne un avertissement
// Petite attente pour pouvoir lire
delay(500);
}