1. Introduction

Le fait de se réveiller peut être facile et certaines personnes sont d'attaque dès le levé, mais pour certaine personne le réveil peut se révéler plus compliqué. Le réveil sonne mais il est trop tôt on se dit:" je peux rester 10 minutes de plus j'arriverais quand même à l'heure." et on appuie sur la touche "snooze" du réveil une fois, puis deux jusqu'à se retrouver en retard. Ou alors simplement l'éteindre mais la tête dans les vapes se rendormir aussitôt.

C'est pourquoi j'ai pensé à créer un dispositif de réveil qui sonnera tant que l'on ne sera pas levé. Mais qui pourra aussi analyser le sommeil en regardant les mouvements du matelas les stocké et pouvoir les mettre sous forme de graphique. Et à l'aide du graphique ainsi obtenu évaluer la qualité du sommeil, si le sommeil a plutôt été agité ou alors au contraire si il a été calme.

Pour faire je prévois d'utiliser un raspberry pi qui sera relié à un accéléromètre et un buzzer (via un pi wedge pi +). L'accéléromètre mesurera le mouvement durant la nuit en l'enverra au raspberry Pi qui enverra toute les mesures prises dans une base de données my_sql. A partir de la base de données ainsi créée faire un graphique pour pouvoir observer les mouvements au fil de la nuit, et pour faire cela je souhaite utiliser du PHP qui ira chercher les infos dans la base de données et donc créera ces graphiques. Pour ce qui est de la partie réveil à l'heure voulue le buzzer sonne tant que l'accéléromètre n'a pas détecté de mouvement supposant que la personne s'est levée.

2. Matériel et méthodes

2.1 Liste du matériel

  • Raspberry pi B+ 1.2
  • Pi wedge B+
  • Sparkfun MPU-9150, il combine un mpu-6050 (qui fait gyroscope et accéléromètre) et magnétomètre. Nous n'aurons pas l'utilité d'un magnétomètre alors nous le considérerons comme un mpu-6050 au niveau du codage.
  • Buzzer

2.2 Méthodes

Avant de commencer

Tout d'abord, il va falloir pour mener à bien notre projet installer plusieurs programmes,modifier des choses sur notre raspberry pi pour que tout puisse fonctionner:

Vu que nous allons utiliser l'accéléromètre mpu-6050 il va nous falloir faire en sorte d'activer I2C sur le raspberry car c'est sous cette forme que l'accéléromètre va envoyer les données. Pour ce faire je vous envoie sur ce tuto dans lequel la méthode est expliquée très clairement. Soyez attentif à la version de votre raspberry car elle est importante, en effet , comme expliqué dans le tuto, si votre raspberry est en 3.18 ou plus il faudra faire plus de modifications. Pour connaître la version de votre raspberry tapez simplement :

$ uname -a

et vous obtiendrez la version de votre raspberry.

Vous aurez aussi besoin d'installer un serveur mysql sur le raspberry pour pouvoir stocker les données récupérées par l'accéléromètre. Pour installer votre propre serveur mysql suivez ce tuto.

Et pour finir il nous faudra aussi installer nginx et PHP pour pouvoir afficher les données les données de la base de données de manière graphique sur un site. Pour ce faire suivez ce tuto

schéma

acc.png Montage reliant le raspberry à l'accéléromètre

code et progammation

D'abord il vous faut créer votre propre base de données, et il faut créer une table qui accueillera nos données pour ça il faut créer la table "enregistrement" pour ce faire il faut taper ceci dans mysql:

CREATE TABLE `enregistrement` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

 `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  
`x` int(10) NOT NULL COMMENT 'FK x',

 `y` int(10) NOT NULL COMMENT 'FK y',

 `z` int(10) NOT NULL COMMENT 'FK z',
  PRIMARY KEY (`id`),
  
KEY `time` (`time`)
)
 ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

L'id s'incrémentera automatiquement, x,y et z sont des valeurs de maximum 10 caractère non-nulle et se sont des foreign key vu qu'elles viendront de notre programme, et on aura la date et l'heure précise de l'arrivée de la valeur dans la base de données grâce à au timestamp.

Pour voir les codes en entier ça se passe ici.

Le code acc0.c est le code qui permet de lire les données de l'accéléromètre et de les envoyées dans notre base de données. Les premières lignes du codes définissent les librairies utilisée. stdio.h permet d'utiliser la logique dans nos programmes, i2c-dev.h, stdlib.h, fcntl.h, ioctl.h, types.h servent à utiliser i2c, arpa/inet.h et mysql.h servent pour mysql et finalement time.h qui ajoute la notion de dates et d'heures au programme. Les lignes commençant par "#define" et les suivantes servent à configurer et à vérifier la connexion via i2c avec l'accéléromètre. Il faut configurer la connexion avec la base de données mysql.

  MYSQL mysql;
    mysql_init(&mysql);
    mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"option");

    if(!mysql_real_connect(&mysql,"localhost","francesco.ugolin","UQUdRhMeDPXusaJA","francesco",0,NULL,0)){
        printf("Une erreur s'est produite lors de la connexion à la bbd \n");
       printf(mysql_error(&mysql));
        exit(1);}

Soit le connexion arrive à être établi ou alors si ce n'est pas le cas on sort du programme.

Il faut aussi envoyer les valeurs récoltées par notre accéléromètre dans notre base de données pour cela il faut utiliser cela: (xaccel,yaccel et zaccel étant les valeurs de l'accélération en x,y et z)

char cmd[512];
   snprintf(cmd,512, "INSERT INTO enregistrement (x, y, z) VALUES (%d, %d, %d)\n", (int)xaccel, (int)yaccel, (int)zaccel);
   mysql_query(&mysql,cmd);

En effet, un simple

mysql_query(&mysql,"INSERT INTO enregistrement (x, y, z) VALUES (xaccel, yaccel, zaccel)")

ne fonctionne pas et ne retourne à notre base de données uniquement des 0. Il faut donc "imprimer" avec la commande "snprintf" la commande dans une variable (cmd dans notre cas) qui là aura les valeurs voulues et, finalement, réinjecter cette commande dans le mysql_query pour envoyer les bonnes valeurs.

J'ai aussi ajouté le fait que le programme s'arrête à une heur donée.

if (time_->tm_hour==7 && time_->tm_min==30 ) {
        printf("heure du reveil\n");
        exit(1);}

Dans cette exemple l'heure du réveil est 7h30. En effet quand la valeur des heures (time_->tm_hour) est égale à 7 et que la valeur des minutes (time_->tm_min) est égal à 30 alors le programme s'arrête, mais uniquement si les deux conditions sont respectées.

Maintenant que le programmes est fini, il faut le compiler et en faire un exécutable pour ça il faut rentrer cette commande dans le terminal:

$ gcc -o acc0 $(mysql_config --cflags) acc0.c $(mysql_config --libs)

Cette commande va créer un exécutable "acc0" à partir du fichier "acc0.c". Les "$(mysql_config --libs)" sont nécessaire car du mysql est utilisé dans le code et sans eux la compilation ne se fait pas. Et pour lancer "acc0" il suffit de rentrer cela dans le terminal:

$ sudo ./acc0

Passons maintenant au fichier PHP. Après avoir réalisé les instructions donner dans le tutoriel faite ceci:

cd /usr/share/nginx/www

Et créer ici votre fichier index.php Je me connecte à ma base de donnée au début du fichier :

       <?php
       $database = mysql_connect("localhost", "francesco.ugolin","UQUdRhMeDPXusaJA");
        
        mysql_select_db("francesco", $database);?>

Et je vais créer un tableau contenant les données récupérées par le programme "acc0". Je commence par définir les entrée du tableau.

<thead> 
 <tr>
         <?php $entree = array("id","heure","x","y","z"); ?>
<?php 
 for ($index = 0; $index < sizeof($entree); $index++){ ?>
     <th><?php print $entree[$index]; ?></th>
<?php } ?>
 </tr>
   </thead>

Je crée une variable "entree" contenant ("id","heure","x","y","z"). Avec le "for" je met ces caractères dans la bonnes colonnes, "index" correspond au numéro de la colonne et est comprise entre 0 et le nombre d'éléments que compte "entree" et augmentera de 1 à chaque boucle. Avec ça on écrit à la colonne 0 l'élément 0 de "entre" c'est-à-dire "id", à la colonne 1 l'élément 1 de "entree" c'est-à-dire "heure" etc... Et pour mettre les données de la base de données au bonne endroit j'utilise ça:

<?php $r= mysql_query("select * from enregistrement");?>

<tbody>
<?php while($data = mysql_fetch_array($r)){ ?>
<tr>
        <th><?php print $data['id'];?></th>
        <th><?php print $data['time'];?></th>
 	<th><?php print $data['x'];?></th>
        <th><?php print $data['y'];?></th>
        <th><?php print $data['z'];?></th>
</tr>
<?php } ?>
</tbody>

Dans la colonne 0 il ira chercher les "id" dans la base de données , dans la colonne 1 il ira chercher les "time" etc...

Pour rajouter un peu de couleur au tableau vous pouvez également le lie à un fichier css.

 <link rel="stylesheet" type="text/css" href="style.css" />

Maintenant il vous suffit sur le navigateur internet du raspberry de taper "localhost" et vous atterrirez sur une page sur laquelle on peut voir le tableau.

3. Résultats

Les données arrive effectivement jusque dans le tableau qui les affiche correctement: 2015-05-12-154324_1776x952_scrot.png

4. Discussion

Les résultats semblent être de prime abord probent. Mais il doit y avoir un problème au niveau de l'accéléromètre car les valeurs sont extrêmement étranges. Mais surtout ne cesse de varier sans raison, par exemple dans l'image du tableau ci-dessus l'accéléromètre était immobile pourtant les valeurs ne sont jamais les mêmes. C'est pour cette raison que dans la version finale du projet le réveil intégré n'est pas présent, j’étais sensé lancé une sonnerie et ne l'arrêté que si un mouvement suggérant le réveil de l'homme dormant, et le fait qu'un mouvement soit en permanence détecté rend cela impossible. Je n'ai pas non plus réussi à intégrer une sonnerie qui se lancerais à une heure définie, tous mes essais ce sont soldé par l'impossibilité de compiler quand je tentais de rajouter "l'option réveil-matin". Un graphique était aussi prévu à la place du tableau de la version finale. En effet réaliser un graphique en php s'est révélé plus compliqué que prévu et je n'ai pas réussi à créer un graphique, et la date de rente approchant j'ai plutôt opté pour un tableau. Mais néanmoins, et malgré le fait de ne pas avoir atteint tous mes objectifs lors de ce projet, ce projet n'en a pas été moins enrichissant, en effet au travers de mon travail j'ai touché à beaucoup de choses. J'ai appris à utiliser un raspberry pi, j'ai coder en c, j'ai utiliser du mysql et même créer ma propre base de données et finalement ai utilisé du php.

5. Conclusion

Le but qui était fixé au début de ce projet n'a été atteint que à moitié. J'arrive à envoyer de données et en faire un tableau mais le réveil n'est pas là et le tableau était sensé être un graphique. Un moyen plus facile pour faire le réveil aurait été de travailler avec arduino et au niveau de l'horloge utiliser une chip RTC, car arduino est un environnement plus facile à appréhender que le c brut. Mon projet au final est plus un proof of concept qu'un véritable produit fini utilisable dans la vie de tous les jours. Mais il ne faudrait pas tant de travail que cela qu'il puisse fonctionner pleinement, il faudrait résoudre le problèmes des données en constant mouvement alors qu'il n'y a pas de raison, coder un graphique en PHP. Mais malgré le fait qu'il ne fonctionne pas entièrement il m'a aussi permis d'aborder de mutiples aspects de l'informatique ce qui me rend par conséquent tout de même satisfais du résultat .

6. Références

l'heure en c

tuto PHP et nginx

tuto i2c

tuto serveur mysql

Code mpu-6050

exemple PHP