summaryrefslogtreecommitdiff
path: root/chapters/c.rst
diff options
context:
space:
mode:
Diffstat (limited to 'chapters/c.rst')
-rw-r--r--chapters/c.rst170
1 files changed, 170 insertions, 0 deletions
diff --git a/chapters/c.rst b/chapters/c.rst
new file mode 100644
index 0000000..2948db4
--- /dev/null
+++ b/chapters/c.rst
@@ -0,0 +1,170 @@
+.. -*- mode: rst -*-
+.. -*- coding: utf-8 -*-
+
+.. role:: raw-latex(raw)
+ :format: latex
+
+La carte Arduino se programme en langage C.
+
+Les types
+=========
+
+La carte Arduino (ou l'ordinateur), ne comprend que le binaire, mais nous
+n'allons pas écrire nos programme en binaire. Nous avons besoin de manipuler
+des nombres pour calculer des délais, mesurer des températures etc. Nous avons
+besoin d'indiquer au programme comment ces données binaires doivent être
+chargée en mémoire pour pouvoir travailler avec.
+
+Chaque type occupe une certaine quantité d'octets en mémoire, en fonction de la
+donnée, et de ce que l'on peut faire avec. Plus la taille mémoire est grande,
+meilleure sera la précision de la valeur (ou la liste des valeurs possibles etc).
+
+L'instruction :index:`sizeof` `sizeof` [#]_ permet de calculer la taille
+d'une variable, elle est utile dans le cas où l'on souhaite faire des calculs
+directement sur la mémoire de l'arduino.
+
+.. [#] https://www.arduino.cc/reference/en/language/variables/utilities/sizeof/
+
+Les booléens
+------------
+
+.. sidebar:: Boole
+
+ L'adjectif booléen vient du nom du mathématicien George Boole qui a travaillé
+ sur la logique et catégorisé ce type qui ne peut prendre que deux valeurs.
+
+Le type booléen représente une valeur binaire `1` ou `0`, ou encore *Oui* ou
+*Non*. Nous l'avons vu quand nous avons utilisé les valeurs `HIGH` ou `LOW` sur
+les sorties de la carte Arduino.
+
+.. code-block:: c
+
+ /* Crée une variable qui servira à savoir s'il faut mettre à
+ jour les données.
+ */
+ bool mettre_a_jour = true;
+ if (mettre_a_jour) {
+ /* fait la mise à jour, puis passe l'indicateur à false
+ pour éviter de le faire une deuxième fois.
+ */
+ mettre_a_jour = false;
+ }
+
+Opérations sur les booléens
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Il existe trois opérations principales que l'on peut retrouver sur les booléens
+et qui permettent de construire la logique du programme.
+
+:et:
+
+ Le *et* (`&&` [#]_ :index:`&&`) permet d'associer deux booléens entre eux, et
+ donne un résultat qui est lui-même booléen, et vaut `true` si les deux sont à
+ `true`.
+
+.. [#] https://www.arduino.cc/reference/en/language/structure/boolean-operators/logicaland/
+
+:ou:
+
+ Le *ou* (`||` [#]_ :raw-latex:`\index{\textbar{} \textbar{}}\marginpar{\texttt{||}}`) permet d'associer deux booléens entre eux, et
+ donne un résultat qui est lui-même booléen, et vaut `true` si l'un ou l'autre
+ est à `true`.
+
+.. [#] https://www.arduino.cc/reference/en/language/structure/boolean-operators/logicalor/
+
+:non:
+
+ Le *non* (`!` [#]_ :raw-latex:`\index{"!}\marginpar{\texttt{!}}`) permet d'inverser la valeur d'un booléen
+
+.. [#] https://www.arduino.cc/reference/en/language/structure/boolean-operators/logicalnot/
+
+.. note::
+
+ Ces opérateurs peuvent se combiner entre eux pour réaliser, on les retrouve
+ dans les tests de condition pour faire des tests évolués. Par exemple, pour
+ mettre à jour l'affichage si la température a changé, ou si la pression a
+ changé, ou s'il s'est écoulé plus d'une heure depuis la dernière mise à jour…
+
+Les nombres entiers
+-------------------
+
+Les nombres entiers permettent de représenter des nombres entre deux bornes.
+Ils peuvent être signés (prendre une valeur négative) ou non.
+
+En fonction de la taille occupée en mémoire, les types auront des plages de
+valeurs possibles plus ou moins importantes :
+
+=============== =============== ================ ===============
+Type Valeur Minimale Valeur Maximale Taille mémoire
+=============== =============== ================ ===============
+`byte` 0 256 1
+`int` -32 768 32 767 2
+`unsigned int` 0 65 536 2
+`long` -2 147 483 647 2 147 483 647 4
+`unsigned long` 0 4 294 967 295 4
+=============== =============== ================ ===============
+
+.. admonition:: Attention
+ :class: warning
+
+ Si jamais la valeur dépasse la limite, aucune erreur ne sera remontée par
+ l'application, mais la valeur va repartir à 0 !
+
+Les nombres flottants
+---------------------
+
+Les nombres flottants peuvent représenter des nombres décimaux, avec toutes les
+valeurs possibles. Cela se fait au prix d'une plus grande consommation de la
+mémoire, et d'une approximation de la valeur.
+
+
+Comparer deux nombres flottants
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Il n'est pas possible de comparer directement deux nombres flottants
+différents, car la probabilité d'avoir exactement deux fois la même valeur est
+quasiment nulle. Il faut utiliser une méthode de ce type, qui permet de
+comparer les deux nombres avec une marge d'erreur :
+
+.. code-block:: C
+
+ bool Equality(float a, float b, float epsilon)
+ {
+ return fabs(a - b) < epsilon;
+ }
+
+Ce code utilise la valeur absolue de la différence des nombres `a` et `b`
+:index:`fabs` pour comparer ce résultat avec le delta.
+
+Les tableaux
+------------
+
+Les tableaux permettent de représenter une *série* de donnée d'un même type.
+
+Le texte
+--------
+
+Le texte est représenté par le type `char` qui peut stocker un caratère. C'est
+pourquoi on utilise souvent des tableaux de caratères qui permettent de stocker
+des mots.
+
+Formatter du texte
+~~~~~~~~~~~~~~~~~~
+
+.. code-block:: C
+
+ char str[80];
+ sprintf(str, "Value of Pi = %f", M_PI);
+
+
+Pour les nombres flottants, il faut d'abord convertir le nombre en texte :
+
+.. code-block:: C
+
+ char str_temp[6];
+
+ /* 4 is mininum width, 2 is precision; float value is copied
+ onto str_temp*/
+ dtostrf(temp, 4, 2, str_temp);
+ sprintf(temperature,"%s F", str_temp);
+