Some fixes

This commit is contained in:
Nathanaël Restori 2012-10-27 15:50:57 +02:00
parent f2faca454c
commit d21f38f24b
4 changed files with 94 additions and 56 deletions

View File

@ -30,6 +30,21 @@
static uint8_t bcd2bin (uint8_t val) { return val - 6 * (val >> 4); }
// no-cost stream operator as described at
// http://sundial.org/arduino/?page_id=119
template<class T>
inline Print &operator <<(Print &obj, T arg)
{ obj.print(arg); return obj; }
template<class T>
inline Print &operator >>(Print &obj, T arg)
{
for (unsigned int mask = 0x80; mask; mask >>= 1) {
obj.print(mask&arg?'1':'0');
}
return obj;
}
void setup() {
Serial.begin(9600);
@ -68,38 +83,42 @@ void setup() {
Serial.println();
Serial.println("What\tByte\tCorrespondance");
Serial.println("------------------------------");
Serial.print("seconds\t"); Serial.print(blah[0]); Serial.print("\t"); Serial.println(ss);
Serial.print("minutes\t"); Serial.print(blah[1]); Serial.print("\t"); Serial.println(mm);
Serial.print("hours\t"); Serial.print(blah[2]); Serial.print("\t"); Serial.println(hh);
Serial.print("days\t"); Serial.print(blah[4]); Serial.print("\t"); Serial.println(d);
Serial.print("monthes\t"); Serial.print(blah[5]); Serial.print("\t"); Serial.println(m);
Serial.print("years\t"); Serial.print(blah[6]); Serial.print("\t"); Serial.println(y);
Serial.print("temp\t"); Serial.print(blah[17]); Serial.print("\t"); Serial.println(ttc);
Serial.print("temp\t"); Serial.print(blah[18]); Serial.print("\t"); Serial.println(portion);
Serial
<< "seconds\t" << blah[0] << "\t" << ss << "\r\n"
<< "minutes\t" << blah[1] << "\t" << mm << "\r\n"
<< "hours\t" << blah[2] << "\t" << hh << "\r\n"
<< "days\t" << blah[4] << "\t" << d << "\r\n"
<< "months\t" << blah[5] << "\t" << m << "\r\n"
<< "years\t" << blah[6] << "\t" << y << "\r\n"
<< "temp\t" << blah[17] << "\t" << ttc << "\r\n"
<< "temp\t" << blah[18] << "\t" << portion << "\r\n";
Serial.println();
Serial.println("Byte\tContent");
Serial.println("---------------");
Serial.print("0\t"); Serial.println(blah[0]);
Serial.print("1\t"); Serial.println(blah[1]);
Serial.print("2\t"); Serial.println(blah[2]);
Serial.print("3\t"); Serial.println(blah[3]);
Serial.print("4\t"); Serial.println(blah[4]);
Serial.print("5\t"); Serial.println(blah[5]);
Serial.print("6\t"); Serial.println(blah[6]);
Serial.print("7\t"); Serial.println(blah[7]);
Serial.print("8\t"); Serial.println(blah[8]);
Serial.print("9\t"); Serial.println(blah[9]);
Serial.print("10\t"); Serial.println(blah[10]);
Serial.print("11\t"); Serial.println(blah[11]);
Serial.print("12\t"); Serial.println(blah[12]);
Serial.print("13\t"); Serial.println(blah[13]);
Serial.print("14\t"); Serial.println(blah[14]);
Serial.print("15\t"); Serial.println(blah[15]);
Serial.print("16\t"); Serial.println(blah[16]);
Serial.print("17\t"); Serial.println(blah[17]);
Serial.print("18\t"); Serial.println(blah[18]);
Serial.print("19\t"); Serial.println(blah[19]);
Serial.println("Byte\tDecimal\tBinary");
Serial.println("----------------------");
Serial
<< "0\t" << blah[0] << "\t" >> blah[0] << "\r\n"
<< "1\t" << blah[1] << "\t" >> blah[1] << "\r\n"
<< "2\t" << blah[2] << "\t" >> blah[2] << "\r\n"
<< "3\t" << blah[3] << "\t" >> blah[3] << "\r\n"
<< "4\t" << blah[4] << "\t" >> blah[4] << "\r\n"
<< "5\t" << blah[5] << "\t" >> blah[5] << "\r\n"
<< "6\t" << blah[6] << "\t" >> blah[6] << "\r\n"
<< "7\t" << blah[7] << "\t" >> blah[7] << "\r\n"
<< "8\t" << blah[8] << "\t" >> blah[8] << "\r\n"
<< "9\t" << blah[9] << "\t" >> blah[9] << "\r\n"
<< "10\t" << blah[10] << "\t" >> blah[10] << "\r\n"
<< "11\t" << blah[11] << "\t" >> blah[11] << "\r\n"
<< "12\t" << blah[12] << "\t" >> blah[12] << "\r\n"
<< "13\t" << blah[13] << "\t" >> blah[13] << "\r\n"
<< "14\t" << blah[14] << "\t" >> blah[14] << "\r\n"
<< "15\t" << blah[15] << "\t" >> blah[15] << "\r\n"
<< "16\t" << blah[16] << "\t" >> blah[16] << "\r\n"
<< "17\t" << blah[17] << "\t" >> blah[17] << "\r\n"
<< "18\t" << blah[18] << "\t" >> blah[18] << "\r\n"
<< "19\t" << blah[19] << "\t" >> blah[19] << "\r\n";
}
void loop() {

View File

@ -73,8 +73,8 @@ void setup() {
if (file) {
Serial.print("Creating data.tsv");
file.println("#Time\t\t\tT [°C]\tP [Pa]\tAlt [m]\tHr [%]\tLx "
"[lux]");
file.println("#Time\t\t\tT [°C]\tP [Pa]\tAlt [m]\tHr [%]\t"
"Lx [lux]");
file.close();
Serial.println("DONE");
} else {

View File

@ -117,10 +117,13 @@ void sensorsJsonCmd(WebServer &server, WebServer::ConnectionType type,
server.httpSuccess("application/json");
server << "{ \"sensors\": ["
<< "{\"data\":\"" << time.hour() << ":" << time.minute()
<< ":" << time.second() << " " << time.day() << "/"
<< time.month() << "/" << time.year() << "\"},"
server << "{ \"sensors\": [" << "{\"data\":\""
<< time.hour() << ":"
<< time.minute() << ":"
<< time.second() << " "
<< time.day() << "/"
<< time.month() << "/"
<< time.year() << "\"},"
<< "{\"data\":" << temperature << "},"
<< "{\"data\":" << pressure << "},"

View File

@ -18,8 +18,8 @@
\setmainlanguage{french}
\title{La lumière s'éteint-elle dans le frigo ?}
\subtitle{ou bla bli blu}
\author{Nathanaël \textsc{Restori}}
\subtitle{Étude d'un bus en vue d'acquisition de données}
\author{Nathanaël Restori}
\date{\today}
\bibliography{bibliographie.bib}
@ -39,7 +39,12 @@
\chapter*{Remerciements}
\thispagestyle{empty}
Je remercie bla bla bla...
Je tient à remercier M.~Salanon pour ses conseils, son aide et pour m'avoir suivi tout au long de ce TM et M.~Gelsomino pour m'avoir permis de réaliser ce TM.
Je remercie aussi mes parents et ma sœur pour leur aide et leur relecture.
Merci aussi à l'équipe d'Adafruit pour son engagement envers le libre et pour sa documentation.
\vfill
Image de couverture par \enquote{oomlout}, sous licence \emph{Creative Commons Attribution-Share Alike 2.0 Generic (CC BY-SA 2.0)}.
@ -227,7 +232,7 @@ Si les deux maîtres on envoyer exactement la même chose, il n'y aura pas de co
\chapter{Le matériel}
\section{Le choix de la plate-forme}
Il existe de nombreuse \gls{plate-forme} en robotique~: par exemple, le Boe-Bot de Parallax, utilisé dans les cours facultatifs de robotique de M. \textsc{Gardon}. J'ai fait le choix d'un Arduino car cette un plate-forme de plus en plus répandue, peu chère (20 € pour une carte programmable) et puissante. On trouve de nombreux exemples de \gls{DIY}\glsadd{DIYg}, elle est programmable en \gls{C++} (donc il est possible d'utiliser des \glspl{bibliotheque}) et c'est du \gls{materiel libre}.
Il existe de nombreuse \gls{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 cette un plate-forme de plus en plus répandue, peu chère (20 € pour une carte programmable) et puissante. On trouve de nombreux exemples de \gls{DIY}\glsadd{DIYg}, elle est programmable en \gls{C++} (donc il est possible d'utiliser des \glspl{bibliotheque}) et c'est du \gls{materiel libre}.
\section{Les capteurs}
Il a été décidé de faire une station météo. Nous avons donc 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é sur le site d'Adafruit. L'hygromètre ne se connecte malheureusement pas en I²C, aucun capteur de ce type n'étant disponible.
@ -284,6 +289,8 @@ Plusieurs \glspl{bibliotheque} sont utilisées. Comme bibliothèques tierces, so
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 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. Il configure ensuite le capteur de luminosité et finit par vérifier si le fichier DATA.TSV existe, le crée si il n'existe pas et y enregistre les en-tête (un exemple de se fichier est disponible à l'annexe \ref{app:data}).
@ -306,9 +313,14 @@ J'ai essayé de réunir les deux programmes en un seul en allégeant les \glspl{
J'ai aussi cherché s'il était possible de mettre un système d'exploitation sur l'Arduino et qu'il puisse charger les programmes sur la carte SD, mais je n'ai rien trouvé.
\section{Le programme pour tester en pratique l'I²C}
Cette fois-ci, l'entièreté du programme se situe dans la fonction \verb|setup()|. On commence par initialiser la classe \verb|Wire| puis commencer à transmettre sur le bus. D'abord, l'adresse de l'horloge est transmise, puis on positionne le curseur du registre à zéro et on lit les vingt premiers octets du registre qui continent l'heure, la date et la température. Ces données sont traitées pour être lisible puis on les affiche dans un tableau afin de savoir si la communication c'est bien passée. Pour finir, on affiche un tableau des vingt octets sous leurs formes décimales et binaires. %TODO: mettre un exemple en annexe
\chapter{Test de l'I²C en pratique}
\chapter{Le cas du frigo}
\section{Les mesures}
Pour réaliser 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 les premières constatations : premièrement, l'humidité ne dépassait jamais 70\%, deuxièmement, la température ne descendait jamais au dessous de 8° (voir la figure \ref{fig:1}).
Pour réaliser 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 les premières constatations : premièrement, l'humidité ne dépassait jamais 70 \%, deuxièmement, la température ne descendait jamais au dessous de 8° (voir la figure \ref{fig:1}).
Un deuxième essais a donc é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° Celsius 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 raugmentant une fois sortie du frigo (voir la figure \ref{fig:2}).
@ -321,7 +333,7 @@ Tout d'abord, la température commence par descendre de manière qui semble expo
La pression a diminué pendant la nuit, mais cela n'est pas lié au frigo.
L'humidité oscille aussi de manière périodique entre environ 40\% d'humidité et 70\% d'humidité après deux heures dans le frigo. On voit un grand pique vers huit heure du matin.
L'humidité oscille aussi de manière périodique entre environ 40 \% d'humidité et 70 \% d'humidité après deux heures dans le frigo. On voit un grand pique vers huit heure du matin.
La luminosité est nulle tout au long de l'expérience sauf quand la station a été placée et retirée du frigo. On remarque un pique vers huit heure du matin. La porte a donc été ouverte à cette heure ci.
\begin{figure}[H]
@ -332,7 +344,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 heure et quart du matin et sept heure de demi du matin. D'après les cours de monsieur \textsc{Bonnaz}, je m'attendais à voir une courbe de pente négative, symétrique à celle-ci. En effet : plus l'air est chaud, plus il peux accueillir de l'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 heure et quart du matin et sept heure de 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 peux accueillir de l'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).
Mais d'où peux donc venir cette différence ? Faisons un peu de calcul :
@ -350,7 +362,7 @@ En remaniant les formules, on trouve :
\glsadd{H}\glsadd{m}\glsadd{V}\glsadd{M}\glsadd{n}\glsadd{P}\glsadd{R}\glsadd{T}\glsadd{Hr}\glsadd{Heq}\glsadd{Peq}
Sachant que le frigo fait environ 200 litres, qu'à 4 °C l'humidité relative est de 43\% et que la pression à l'équilibre est de 813 Pa, qu'à 6.6 °C l'humidité relative est de 70\% et que la pression à l'équilibre est de 975 Pa, on peux calculer la quantité de vapeur dans le frigo à 4 et 6.6 °C.
Sachant que le frigo fait environ 200 litres, qu'à 4 °C l'humidité relative est de 43 \% et que la pression à l'équilibre est de 813 Pa, qu'à 6.6 °C l'humidité relative est de 70 \% et que la pression à l'équilibre est de 975 Pa, on peux calculer la quantité de vapeur dans le frigo à 4 et 6.6 °C.
À 4 °C, le frigo contient environ 0.55 grammes de vapeur et à 6.6 °C, il en contient 1.06 grammes.
Si l'on part du principe que le frigo est étanche, la pente de la courbe peux donc s'expliquer par le fait que 0.51 grammes d'eau s'évaporent et se condensent à chaque cyclique, ce qui est une quantité raisonnable.
@ -407,6 +419,10 @@ Si l'on part du principe que le frigo est étanche, la pente de la courbe peux d
\label{app:sensors}
\inputminted[linenos]{json}{input/sensors.json}
\chapter{I2CPractise.ino}
\label{app:i2cpractise}
\inputminted[linenos]{cpp}{../arduino/I2CPractise/I2CPractise.ino}
\chapter{Graphiques}
\label{app:graphs}