Final version (I hope)

This commit is contained in:
Nathanaël Restori 2012-11-13 20:23:13 +01:00
parent ed1a8bd8b4
commit 08f945abf1
2 changed files with 61 additions and 25 deletions

View File

@ -55,12 +55,12 @@ J'ai décidé de faire mon \gls{TM}\footnote{Les mots en \textbf{gras} sont des
Je suis aussi passionné par l'informatique en général (autant au niveau matériel que logiciel), la programmation ainsi que les logiciels libres.
\section{Présentation du travail}
Pour mon travail, j'ai choisi un sujet en rapport avec la robotique car ce sujet m'intéresse.
Pour mon travail, j'ai choisi un thème en rapport avec la robotique car ce domaine m'intéresse.
J'ai d'abord dû trouver un sujet plus précis. Suite à une discussion avec M.~Salanon, je me suis tourné vers l'étude d'un \gls{bus} de données (l'I²C) et la programmation d'une sorte de station météo.
J'ai dû choisir le matériel puis le commander depuis les États-Unis (le choix de matériel disponible en Suisse étant plus limité et pas forcément moins cher).
J'ai ensuite étudié le fonctionnement du \gls{bus} en théorie, puis \enquote{assemblé} et programmé la station. J'ai aussi réalisé un programme pour tester le fonctionnement de l'I²C à l'aide d'un oscilloscope.
J'ai dû choisir le matériel puis le commander aux États-Unis (le choix de matériel disponible en Suisse étant plus limité et pas forcément moins cher).
J'ai ensuite étudié le fonctionnement du \gls{bus} en théorie, puis \enquote{assemblé} et programmé la station. J'ai également réalisé un programme pour tester le fonctionnement de l'I²C à l'aide d'un oscilloscope.
J'ai fini par réaliser des mesures à l'aide de la station météo dans mon frigo et par vérifier le fonctionnement du \gls{bus} en pratique.
@ -73,13 +73,13 @@ Un logiciel libre est un logiciel qui respecte quatre libertés essentielles\foo
\item la liberté de distribuer aux autres des copies de vos versions modifiées (liberté 3) ; en faisant cela, vous donnez à toute la communauté une possibilité de profiter de vos changements ; l'accès au \gls{code source} est une condition nécessaire.
\end{enumerate}
On retrouve aussi le terme \enquote{\emph{open source}}. Le terme logiciel libre est défini par la \gls{FSF} tandis celui d'open source est défini par l'\gls{OSI}. En pratique, ces deux termes désignent la même chose.
On retrouve aussi le terme \enquote{\emph{open source}}. Le terme logiciel libre est défini par la \gls{FSF}, tandis que celui d'open source est défini par l'\gls{OSI}. En pratique, ces deux termes désignent la même chose.
Les sources des logiciels sont soumis à des licences spécifiques garantissant ces libertés. Les plus connues sont la \gls{GPL}, la \gls{BSD} ou la MIT (une copie de cette dernière est disponible à l'annexe \ref{app:mit}).
Les sources des logiciels sont soumises à des licences spécifiques garantissant ces libertés. Les plus connues sont la \gls{GPL}, la \gls{BSD} ou la MIT (une copie de cette dernière est disponible à l'annexe \ref{app:mit}).
Quelques logiciels libres connus sont Firefox, LibreOffice/OpenOffice.org, Linux, Thunderbird et VLC.
Ce \gls{TM} est donc entièrement articulé autour de logiciels et matériels libres~: \LaTeX{} et vim pour l'écriture de ce rapport, Arduino comme plate-forme, CMake et gcc pour la \gls{compilation}, gnuplot pour les graphiques. Tout le code produit est donc placé sous licence MIT.
Ce \gls{TM} est donc entièrement articulé autour de logiciels et matériels libres~: \LaTeX{} et vim pour l'écriture de ce rapport, Arduino comme \gls{plate-forme}, CMake et gcc pour la \gls{compilation}, gnuplot pour les graphiques. Tout le code produit est donc placé sous licence MIT.
\section{Conventions d'écriture}
Les mots en \textbf{gras} sont des mots définis dans le glossaire ou sont des acronymes.
@ -90,7 +90,7 @@ Les textes écrits avec \verb|cette police d'écriture| sont des extraits de cod
Ce chapitre est basé sur un article de Wikipédia\footcite{i2c-wikipedia} ainsi qu'un autre article\footcite{i2c-aurel32}. Toutes les images ont été faites par \enquote{Emiaille} et sont sous licence \emph{Creative Commons paternité partage à lidentique 3.0 (non transposée)}.
\section{Le bus I²C}
Le \gls{bus} I²C a été développé par Philips en 1982. La première norme (notée 1.0) a été publiée en 1992 et la dernière (noté 4.0) en 2012.
Le \gls{bus} I²C a été développé par Philips en 1982. La première norme (notée 1.0) a été publiée en 1992 et la dernière (notée 4.0) en 2012.
Quelques exemples d'utilisations courantes\footcite{i2c-wikipedia-en}~:
\begin{itemize}
@ -111,7 +111,7 @@ L'I²C a plusieurs caractéristiques intéressantes~:
\item Il est multi-maîtres~: plusieurs objets peuvent contrôler le \gls{bus}.
\item Il est multi-esclaves~: plusieurs objets peuvent répondre à un maître.
\item C'est un \gls{bus} série~: chaque information est découpée en plusieurs morceaux de taille fixe.
\item C'est un \gls{bus} synchrone~: possède une horloge propre (imposée par le maître qui veut parler).
\item C'est un \gls{bus} synchrone~: il possède une horloge propre (imposée par le maître qui veut parler).
\item C'est un \gls{bus} bidirectionnel half-duplex~: les informations peuvent circuler dans les deux sens mais dans un seul à la fois.
\item Il peut communiquer à des vitesses allant de 100 kbit/s à 5 Mbit/s.
\end{itemize}
@ -127,7 +127,7 @@ Ces équipements sont connectés entre eux à l'aide de deux lignes~:
Il faut toutefois une troisième ligne pour avoir une masse commune à tous les équipements.
Ceux-ci doivent être alimentés avec le même potentiel (pour avoir la même référence comme niveau haut) mais peuvent être alimentés par différentes sources.
Les échanges ont toujours lieu entre un maître et un esclave et sont toujours débutés par le maître. Cependant, rien n'empêche à un équipement de passer du statut de maître au status d'esclave et vice-versa.
Les échanges ont toujours lieu entre un maître et un esclave et sont toujours débutés par le maître. Cependant, rien n'empêche à un équipement de passer du statut de maître au statut d'esclave et vice-versa.
Pour permettre à plusieurs maîtres de pouvoir imposer un niveau haut ou un niveau bas sur les lignes en même temps, des sorties à collecteur ouvert (ou à drain ouvert pour des circuits CMOS) sont utilisées. Deux résistances \enquote{pull-up} ($R_P$) tirent les lignes au niveau haut ($V_{DD}$).
@ -141,7 +141,7 @@ Pour permettre à plusieurs maîtres de pouvoir imposer un niveau haut ou un niv
\subsection{Niveaux électriques}
Les états logiques sont définis proportionnellement à la tension de la ligne et de la masse (tableau \ref{tab:etat-niveau}).
L'état logique \enquote{0} ou \enquote{LOW} est l'état \enquote{dominant}, tandis que l'état logique \enquote{1} ou \enquote{HIGH} est l'état \enquote{récessif}. Cela veux dire que, si un équipement impose l'état \enquote{LOW} et qu'un autre impose l'état \enquote{HIGH}, la ligne sera à l'état \enquote{LOW}.
L'état logique \enquote{0} ou \enquote{LOW} est l'état \enquote{dominant}, tandis que l'état logique \enquote{1} ou \enquote{HIGH} est l'état \enquote{récessif}. Cela veut dire que, si un équipement impose l'état \enquote{LOW} et qu'un autre impose l'état \enquote{HIGH}, la ligne sera à l'état \enquote{LOW}.
\begin{table}[h]
\begin{center}
@ -163,7 +163,7 @@ L'état logique \enquote{0} ou \enquote{LOW} est l'état \enquote{dominant}, tan
\subsection{L'encodage}
Tout d'abord, en informatique, les informations sont envoyées sous forme de \enquote{0} et de \enquote{1}. Un \enquote{0} ou un \enquote{1} s'appelle un bit. Souvent, les informations sont envoyées sous forme de paquets de huit bits. On appelle ces huit bits un octet (ou \emph{byte} en anglais).
Pour transmettre un bit, le maître doit d'abord placer la ligne SCL au niveau \enquote{LOW} puis placer la ligne SDA au niveau voulu (\enquote{LOW} pour transmettre un \enquote{0} ou \enquote{HIGH} pour transmettre un \enquote{1}). Ensuite, il place la ligne SCL au niveau \enquote{HIGH} attend un temps défini par la vitesse et la norme utilisées puis replace la ligne SCL au niveau \enquote{LOW}. Un bit vient d'être transmis. Il recommence pour transmettre le bit suivant. Tant que la ligne SCL est au niveau \enquote{HIGH}, la ligne SDA ne doit pas changer d'état.
Pour transmettre un bit, le maître doit d'abord placer la ligne SCL au niveau \enquote{LOW} puis placer la ligne SDA au niveau voulu (\enquote{LOW} pour transmettre un \enquote{0} ou \enquote{HIGH} pour transmettre un \enquote{1}). Ensuite, il place la ligne SCL au niveau \enquote{HIGH}, attend un temps défini par la vitesse utilisée (voir la sous-section suivante) puis replace la ligne SCL au niveau \enquote{LOW}. Un bit vient d'être transmis. Il recommence pour transmettre le bit suivant. Tant que la ligne SCL est au niveau \enquote{HIGH}, la ligne SDA ne doit pas changer d'état.
\begin{figure}[H]
\centering
\includegraphics{figures/I2C/I2C_Encodage.eps}
@ -171,6 +171,36 @@ Pour transmettre un bit, le maître doit d'abord placer la ligne SCL au niveau \
\label{fig:I2C_Encodage}
\end{figure}
\subsection{Temps de pause et vitesse}
Il existe cinq vitesses de transmission :
\begin{itemize}
\item \enquote{Standard mode} $\leq$ 100 kbit/s;
\item \enquote{Fast mode} $\leq$ 400 kbit/s;
\item \enquote{Fast plus mode} $\leq$ 1 Mbit/s;
\item \enquote{High-speed mode} $\leq$ 3,4 Mbit/s;
\item \enquote{Ultra-fast mode} $\leq$ 5 Mbit/s.
\end{itemize}
Pour chacune de ces vitesses, un temps de pause minimum est défini pour le niveau \enquote{LOW} et le niveau \enquote{HIGH} (voir le tableau \ref{tab:time}). Pour les deux vitesses les plus élevées, il n'est pas défini de manière statique.
\begin{table}[h]
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
Mode & $t_{LOWmin}$ & $t_{HIGHmin}$ \\
\hline
Standard & 4,7μs & 4μs \\
\hline
Fast & 1,3μs & 0,6μs \\
\hline
Fast plus & 0,5μs & 0,26μs \\
\hline
\end{tabular}
\end{center}
\caption{Temps de pause minimum}
\label{tab:time}
\end{table}
\subsection{La commande START}
La commande START est une transgression à la règle d'encodage. Elle est utilisée pour signaler le début d'une \gls{trame}.
Pour envoyer un START, la ligne SDA doit passer de l'état \enquote{HIGH} à \enquote{LOW} pendant que la ligne SCL est à l'état \enquote{HIGH}.
@ -204,7 +234,7 @@ En fait, il s'agit de la commande START qui est envoyée entre un START et un ST
\end{figure}
\subsection{L'acquittement}
Quand le récepteur a reçu un octet, il envoie la commande ACK pour signaler qu'il l'a bien reçu ou la commande NACK pour signaler un problème lors de la réception.
Quand le récepteur a reçu un octet, il envoie la commande ACK pour signaler qu'il l'a bien reçu, ou la commande NACK pour signaler un problème lors de la réception.
Quand le récepteur est un maître, il peut envoyer un NACK pour demander l'arrêt de la lecture avant d'envoyer un STOP.
Pour envoyer un ACK, le récepteur envoie simplement un bit \enquote{0}. Pour envoyer un NACK, le récepteur envoie simplement un bit \enquote{1}.
\begin{figure}[H]
@ -240,13 +270,13 @@ L'octet est composé de deux parties~:
Il y a quelques adresses \enquote{spéciales}\footnote{Les X tout à droite correspondent au bit R/W. Les autres X, l'y et le z peuvent être soit un \enquote{1}, soit un \enquote{0}.}~:
\begin{itemize}
\item 00000000~: utilisée pour parler à tous les esclaves (appelé \emph{broadcast} en anglais);
\item 00000000~: utilisée pour parler à tous les esclaves (appelée adresse de \emph{broadcast} en anglais);
\item 0000001X~: utilisée pour accéder aux composants CBUS (ancêtre de lI²C);
\item 0000010X~: réservée pour dautres systèmes de \gls{bus};
\item 0000011X~: réservée pour des utilisations futures;
\item 00001XXX~: utilisée pour les composants haute-vitesse;
\item 11111XXX~: réservée pour des utilisations futures;
\item 11110yzX~: utilisée pour l'adressage sur 10 bits;
\item 11110yzX~: utilisée pour l'adressage sur 10 bits.
\end{itemize}
\subsubsection{L'adressage sur 10 bits}
@ -309,12 +339,12 @@ Si les deux maîtres ont envoyé exactement la même chose, il n'y aura pas de c
\chapter{Le matériel}
\section{Le choix de la plate-forme}
Il existe de nombreuses \glspl{plate-forme} en robotique~: par exemple, le Boe-Bot de Parallax, utilisé dans les cours facultatifs de robotique de M.~Gardon. J'ai fait le choix d'un Arduino car c'est une plate-forme de plus en plus répandue, peu chère (20 € pour une carte programmable). On trouve de nombreux exemples de \gls{DIY}\glsadd{DIYg}, elle est programmable en \gls{C++} (il est donc possible d'utiliser des \glspl{bibliotheque}) et c'est du \gls{materiel libre}.
Il existe de nombreuses \glspl{plate-forme} en robotique~: par exemple, le Boe-Bot de Parallax, utilisé dans les cours facultatifs de robotique de M.~Gardon. J'ai fait le choix d'un Arduino car c'est une \gls{plate-forme} de plus en plus répandue, peu chère (20 € pour une carte programmable). On trouve de nombreux exemples de \gls{DIY}\glsadd{DIYg}, elle est programmable en \gls{C++} (il est donc possible d'utiliser des \glspl{bibliotheque}) et c'est du \gls{materiel libre}.
Pour pouvoir afficher les mesures des capteurs en direct et à travers le réseau, j'ai choisi un Arduino Ethernet (voir la photo de couverture).
\section{Les capteurs}
J'ai décidé de faire une station météo. Nous avons besoin d'un thermomètre (figure \ref{fig:BMP085}), d'un hygromètre (figure \ref{fig:BMP085} aussi), d'un baromètre (figure \ref{fig:TSL2561}) et d'un capteur de luminosité (figure \ref{fig:DHT22}). J'ai ajouté une horloge (figure \ref{fig:ChronoDot}) qui nous permettra d'avoir l'heure à laquelle les mesures ont été prises. Tous les capteurs ont été commandés sur le site d'Adafruit. L'hygromètre ne se connecte malheureusement pas en I²C, aucun capteur de ce type n'étant disponible.
J'ai décidé de faire une station météo. Nous avons besoin d'un thermomètre (figure \ref{fig:BMP085}), d'un baromètre (figure \ref{fig:BMP085} aussi), d'un hygromètre (figure \ref{fig:DHT22}) et d'un capteur de luminosité (figure \ref{fig:TSL2561}). J'ai ajouté une horloge (figure \ref{fig:ChronoDot}) qui nous permettra d'avoir l'heure à laquelle les mesures ont été prises. Tous les capteurs ont été commandés sur le site d'Adafruit. L'hygromètre ne se connecte malheureusement pas en I²C, aucun capteur de ce type n'étant disponible.
\vfill
@ -354,7 +384,7 @@ J'ai décidé de faire une station météo. Nous avons besoin d'un thermomètre
\vfill
\section{Les limitations}
J'ai vite été confronté à une limitation~: la mémoire de l'Arduino ne peut contenir seulement 32'256 octets de code compilé. Il ne peut donc pas contenir en même temps les \glspl{bibliotheque} pour utiliser les capteurs en I²C, le port RJ45 et la carte SD. La solution a été de couper le programme en deux~: il y a donc un code pour afficher les mesures en direct à travers un navigateur web et un code pour prendre des mesures de manière régulière et les enregistrer.
J'ai vite été confronté à une limitation~: la mémoire de l'Arduino ne peut contenir que 32'256 octets de code compilé. Il ne peut donc pas contenir en même temps les \glspl{bibliotheque} pour utiliser les capteurs en I²C, le port RJ45 et la carte SD. La solution a été de couper le programme en deux~: il y a donc un code pour afficher les mesures en direct à travers un navigateur web et un code pour prendre des mesures de manière régulière et les enregistrer.
\vfill
@ -370,18 +400,18 @@ J'ai vite été confronté à une limitation~: la mémoire de l'Arduino ne peut
\chapter{Le logiciel}
\section{En général}
Les programmes sont composés de deux fonctions principales. La fonction \verb|setup()| qui s'exécute une fois au démarrage du programme et la fonction \verb|loop()| qui est exécutée en boucle. La première sert à initialiser et configurer les capteurs et les puces tandis que la deuxième sert à traiter les informations.
Les programmes sont composés de deux fonctions principales. La fonction \verb|setup()| qui s'exécute une fois au démarrage du programme et la fonction \verb|loop()| qui est exécutée en boucle. La première sert à initialiser et configurer les capteurs et les puces, tandis que la deuxième sert à traiter les informations.
Plusieurs \glspl{bibliotheque} sont utilisées. Comme bibliothèques internes\footnote{Fournies avec l'Arduino.}, sont utilisées~: \verb|Ethernet| pour la puce de contrôle du port RJ45, \verb|SD| ainsi que \verb|SPI| pour la carte SD et \verb|Wire| pour l'I²C. Comme bibliothèques tierces\footnote{Fournies par d'autres personnes/enterprises/projets sur Internet.}, sont utilisées~: \verb|BMP085| pour le capteur de température et de pression, \verb|Chronodot| pour l'horloge, \verb|DHT| pour le capteur d'humidité, \verb|TSL2561| pour le capteur de luminosité et, pour finir, \verb|WebServer| pour servir les pages web.
La partie logicielle est coupée en deux programmes~: un enregistreur et un serveur web. Les sources sont disponibles respectivement à l'annexe \ref{app:logger} et à l'annexe \ref{app:web}.
Un troisième programme sera utilisé pour tester en pratique le protocole I²C à l'aide d'un oscilloscope et vérifier si la théorie correspond à la pratique. Le \gls{code source} est disponible à l'annexe \ref{app:i2cpractise}.
Un troisième programme sera utilisé pour tester en pratique le protocole I²C à l'aide d'un oscilloscope et pour vérifier si la théorie correspond à la pratique. Le \gls{code source} est disponible à l'annexe \ref{app:i2cpractise}.
\section{L'enregistreur}
La fonction \verb|setup()| commence par initialiser la carte SD, puis initialise les différents capteurs. Elle configure ensuite le capteur de luminosité et finit par vérifier si le fichier \enquote{DATA.TSV} existe. S'il n'existe pas, elle le crée et y enregistre les en-têtes (un exemple de ce fichier est disponible à l'annexe \ref{app:data}).
La fonction \verb|loop()| récupère les différentes données des capteurs puis les enregistre. Elle finit en faisant une pause d'un temps définit.
La fonction \verb|loop()| récupère les différentes données des capteurs puis les enregistre. Elle finit en faisant une pause d'un temps défini.
\section{Le serveur web}
La fonction \verb|setup()| commence par initialiser la puce de contrôle du port RJ45 et le serveur web, configure ce dernier, puis initialise les différents capteurs. Elle configure ensuite le capteur de luminosité. Elle finit par appeler \verb|sendNtpPacket()| qui va interroger un serveur \gls{NTP} pour mettre à jour l'heure de l'horloge.
@ -393,7 +423,7 @@ La fonction \verb|defaultCmd()| se contente d'envoyer la page d'index dont le \g
La fonction \verb|sensorsJsonCmd()| récupère les valeurs des capteurs puis les envoie dans le format \gls{JSON}. Un exemple est fourni à l'annexe \ref{app:sensors}.
\subsection{La page d'index}
Une fois la page téléchargée par le navigateur web, du JavaScript est exécuté. Ce JavaScript va télécharger la page \enquote{sensors.json} de manière régulière, analyser son contenu puis mettre à jour le tableau qui contient les valeurs.
Une fois la page téléchargée par le navigateur web, du \gls{JavaScript} est exécuté. Ce \gls{JavaScript} va télécharger la page \enquote{sensors.json} de manière régulière, analyser son contenu puis mettre à jour le tableau qui contient les valeurs.
Une capture d'écran de la page est disponible à l'annexe \ref{app:screenshot}.
@ -499,13 +529,13 @@ Si on veut lire une partie du registre, il faut commencer par envoyer en écritu
Si l'on veut écrire, après avoir sélectionné la case, il faut continuer à écrire un octet. Cet octet sera écrit à l'endroit sélectionné. Deux choix s'offrent ensuite~: écrire encore un octet qui sera placé dans la case suivante ou envoyer un STOP.
Les nombres envoyés pour mes essais sont donc des sélections de case. L'horloge a renvoyé un NACK car la case n° 170 ou 255 n'existe pas et la sélection a par conséquent échouée. Elle a, au contraire, renvoyé un ACK pour la case n° 0 car celle-ci existe. En effet~: en informatique, les tableaux et les registres sont numérotés à partir de 0 et non de 1.
Les nombres envoyés pour mes essais sont donc des sélections de case. L'horloge a renvoyé un NACK car la case n° 170 ou 255 n'existe pas et la sélection a par conséquent échoué. Elle a, au contraire, renvoyé un ACK pour la case n° 0 car celle-ci existe. En effet~: en informatique, les tableaux et les registres sont numérotés à partir de 0 et non de 1.
\chapter{Le cas du frigo}
\section{Les mesures}
Pour accomplir cette expérience, la station météo a été placée dans un sachet plastique contenant du silica gel ainsi qu'une rallonge pour l'hygromètre pour qu'il puisse être exposé à l'humidité du frigo. La station météo a ensuite été placée pendant une heure au frigo. Voici mes premières constatations~: premièrement, l'humidité ne dépassait jamais 70~\%, deuxièmement, la température ne descendait jamais au dessous de 8~°C (voir la figure \ref{fig:1}).
Un deuxième essai a été réalisé, sans sachet plastique cette fois-ci. Le montage a été placé deux heures au frigo. Cette fois-ci, la température s'est stabilisée à environ 5~°C mais on constate une chute de la puissance après environ une heure. Cela est probablement dû au fait que les piles ne fournissent plus d'énergie à basse température, la puissance augmentant une fois sortie du frigo (voir la figure \ref{fig:2}).
Un deuxième essai a été réalisé, sans sachet plastique cette fois-ci. Le montage a été placé deux heures au frigo. Cette fois-ci, la température s'est stabilisée à environ 5~°C mais on constate une chute de la puissance après environ une heure. Cela est probablement dû au fait que les piles ne fournissent que peu d'énergie à basse température, la puissance augmentant une fois sortie du frigo (voir la figure \ref{fig:2}).
Un autre essai a ensuite été réalisé. Cette fois-ci, les piles ont été remplacées par un adaptateur qui fournissait du 9~volts. La station météo a été placée dans le frigo, pendant une nuit. Cette fois-ci, l'expérience s'est bien déroulée~: il n'y a pas eu de perte de puissance.
@ -527,7 +557,7 @@ La luminosité est nulle tout au long de l'expérience sauf quand la station a
\end{figure}
\subsection{L'humidité en fonction de la température}
La figure \ref{fig:t-h} représente l'humidité en fonction de la température entre trois heures et quart du matin et sept heures et demi du matin. D'après les cours de M.~Bonnaz, je m'attendais à voir une courbe de pente négative, symétrique à celle-ci. En effet~: plus l'air est chaud, plus il peut accueillir d'humidité, donc l'humidité relative devrait diminuer. Mais ça ne fonctionne que si l'on part du principe que l'eau ne se condense que lorsque l'humidité atteint 100~\% (ce qui était fait dans les exercices du cours).
La figure \ref{fig:t-h} représente l'humidité en fonction de la température entre trois heures et quart du matin et sept heures et demi du matin. D'après les cours de M.~Bonnaz, je m'attendais à voir une courbe de pente négative, symétrique à celle-ci. En effet~: plus l'air est chaud, plus il peut accueillir d'humidité, donc l'humidité relative devrait diminuer. Mais ça ne fonctionne que si l'on part du principe que l'eau ne se condense uniquement lorsque l'humidité atteint 100~\% (ce qui était fait dans les exercices du cours).
Mais d'où peut donc venir cette différence~? Faisons un peu de calcul~:

View File

@ -20,7 +20,7 @@
\newglossaryentry{code source}
{
name=code source,
description={on peux considérer le code source comme la \enquote{recette du cuisine} du programme. Il décrit ce que doit faire le programme, quand et comment}
description={on peux considérer le code source comme la \enquote{recette de cuisine} du programme. Il décrit ce que doit faire le programme, quand et comment}
}
\newglossaryentry{compilation}
@ -47,6 +47,12 @@
description={protocole servant à relier un nom de domaine (www.gymnasedeburier.ch) à une adresse IP (84.16.80.62)}
}
\newglossaryentry{JavaScript}
{
name=JavaScript,
description={language permettant de créer des scripts exécutés par le navigateur web}
}
\newglossaryentry{horloge temps reel}
{
name=horloge temps réel,