De quoi s’agit-il ?
Il s’agit
d’une application mobile qui permet de :
- Recevoir les informations de température ;
- Recevoir les informations de PH
- Recevoir les informations de salinité ;
- Gérer L’éclairage ;
- Gérer Le niveau d’eau dans la cuve technique ;
Cela se traduit par 6 composants logiciels qui assument ces fonctions. Sur la photo, on retrouve la température en haut à gauche, le pH en haut au milieu, la densité en haut à droite, la gestion de l’éclairage en bas à gauche et enfin la gestion du niveau de la cuve technique en bas à droite.
Les informations passives (température, pH et densité) sont mises à jour toutes les 5 minutes par défaut et sont paramétrables.
Comment cela fonctionne ?
Description générale :
La tablette
fonctionne sous Androïd. La programmation des applications se fait en java. Il existe un très bon tutorial pour débuter en programmation sous Androïd : http://openclassrooms.com/courses/creez-des-applications-pour-android.
Le système
est composé d’une application java sur la tablette qui joue le rôle de
« client » et d’un circuit intégré qui joue le rôle de «
serveur ». (Microcontrôleur Arduino).
Le
« Client » (la tablette, le smartphone, le PC…) envoie des requêtes
(donne-moi la température, donne-moi le Ph, donne-moi la densité) et affiche la réponse sur l’interface
utilisateur. Le « Client » peut aussi envoyer des commandes (Prend en
compte ces nouveaux horaires pour l’éclairage, prend en compte ces nouveaux niveaux
pour le déclenchement de la pompe)
Les composants principaux :
L’Arduino
Le cœur du système est une carte Arduino[i] (www.arduino.cc). C’est un circuit intégré programmable libre de droit. Pour rassurer les lecteurs novices ou sans connaissances en électronique, Il y a 6 mois, je ne savais pas que cela existait et je n’avais aucune idée de son fonctionnement. Une fois le premier choc passé, on arrive très rapidement à faire clignoter une diode et à se lancer dans des applications plus complexes.
Ce
microcontrôleur dispose de 14 entrées sorties numériques et 6 entrées analogiques.
L’intensité maximum est de 40 mA par sortie pour une intensité maximale en sortie de 200 mA.
L’intensité maximum est de 40 mA par sortie pour une intensité maximale en sortie de 200 mA.
L’Ethernet Shield
Ce composant permet à l’Arduino de se
connecter à internet via un câble Ethernet classique. Il s’emboite parfaitement
sur la carte Arduino. Il existe d’autres solutions ( Wifi, Blutooth, …). J’ai personnellement ma « box »
internet dans le meuble sous l’aquarium. J’ai opté pour ce composant que je
peux connecter très facilement.
Les capteurs :
Capteur de Ph :
J’utilise une sonde Ph. Elle est parfaitement compatible avec l’arduino pour un prix raisonnable.
http://dfrobot.com/wiki/index.php/PH_meter(SKU:_SEN0161.
Capteur de Température :
Il existe plusieurs types de capteur de
température. J’en ai choisi un inoxydable et étanche.
Capteur de niveau et pompe :
Après
beaucoup de recherche sur les différentes possibilités techniques. Je me suis
réalisé mon propre détecteur de niveau (Cf. description technique).
Capteur de salinité :
Je n’ai pas
trouvé de capteur électronique à un prix raisonnable pour effectuer cette
mesure. J’utilise donc ici aussi une méthode maison (Cf. description technique).
Description technique :
L’alimentation électrique :
- L’Arduino doit être alimenté par une tension entre 7
et 12 V
- La pompe doit être alimentée en 12V, 1,2 ampère.
- Le circuit PCF8583 (horloge interne) doit être
alimentée en 5V et perd ses informations (l’heure, les heures d’allumage
et d’extinction des néons) si il y a une coupure de l’alimentation
Les bases de l’Arduino :
L’Arduino
dispose de 6 entrées analogiques. Concrètement, cela signifie que la carte est
capable de lire une tension entre 0 et 5V (ni plus, ni moins, c’est à notre
charge de s’assurer que cette tension soit comprise entre ces valeurs, sinon
vous risquez d’endommager la carte).
La
carte se relie de manière très simple à un PC grâce à un câble USB (non
fourni). Ensuite, il suffit d’installer les drivers et nous voilà prêt pour
notre premier programme.
Un programme
Arduino ressemble beaucoup à du C. Il existe de très bons tutoriels sur cet
outil et l’apprentissage est assez facile.
L’Arduino dispose de 14 entrées sorties numériques et 6 entrées analogiques. Les sorties numériques permettent de mettre une borne dans un état « HIGH » à +5V ou dans un état « LOW » à 0V. Les entrées numériques (qui sont les même que les sorties) permettent de déterminer si un état est « HIGH » ou « LOW ». Les Entrées analogiques permettent de transformer une tension entre 0V et 5V en un entier entre 0 et 1024. Ces entrées analogiques sont particulièrement utiles pour lire la température, le pH et la densité.
Les
sorties numériques me servent de commande. Les Pin 4, 10, 11, 12,13 sont
utilisés par l’Ethernet Shield et ne peuvent pas être utilisés en
programmation.
Lecture de la température :
Le
capteur de température est un composant électronique tout simple qui vaut
quelques euros (trois euros environ). Sa particularité est d’être étanche et
d’être en inox, ce qui est plutôt pratique pour un capteur qui sera en
permanence dans l’eau de mer.
Ce
capteur a une résistance proportionnelle à la température (plus la température
augmente, plus la résistance diminue). A 20°C, la résistance est d’environ 10K
Ohm.
Le
principe consiste à faire un pont diviseur de tension sur ma tension de base de
12V pour transformer ma tension en une valeur entre 0V et 5V qui variera en
fonction de la température. On envoie alors cette tension sur l’entrée
analogique de l’Arduino.
En
programmation « arduino », cela se fait de manière très simple avec
une fonction :
Int
Temp = AnalogRead(A0) ;
Cette fonction lit la tension appliquée à la borne A0, la traduit en un nombre en 0 et 1024 (0=0V ; 1024=5V) et stocke le résultat dans la variable « Temp ».
Le schéma de
principe est présenté ci-dessous :
Ce
montage délivre une tension entre 0 et 5V sur l’entrée analogique de l’Arduino.
La tension fournie est 12*R/(R+12K). Il suffit après de transmettre la valeur
lue au client (la tablette, pc, téléphone…)
Le
problème est que ce montage consomme en permanence du courant alors que la
température n’est mesurée que toute les 5 minutes.
L’astuce est
de commander le passage du courant quand on souhaite mesurer la température, on
obtient un montage un peu plus complexe mais qui ne consomme que quand on
l’utilise…
On ajoute au
montage un transistor. Quand le transistor reçoit sur sa base un petit courant,
il devient conducteur entre son collecteur et l’émetteur. La diode est juste là
pour faire jolie et s’allumer quand la carte reçoit une demande de température.
Étalonnage : Le client reçoit une valeur entre 0 et 1024, ce qui ne signifie rien. Il y a donc nécessité d’étalonner avec deux sources de température connues.
Lecture du PH :
La sonde est livrée avec 3 fils, un pour le
+5V, un pour la terre (0V) et un pour une entrée analogique. Comme pour la
température, on lit la valeur à l’aide de la fonction :
Int Ph = AnalogRead(A0) ;
et on obtient la valeur du pH. C’est aussi simple que cela.
Int Ph = AnalogRead(A0) ;
et on obtient la valeur du pH. C’est aussi simple que cela.
J’ai
rencontré pour ce montage un problème sur l’alimentation. Il est précisé dans
la documentation que la sonde doit être alimentée en 5V précisément, or
l’Arduino délivre du 5V théorique sur ses sorties numériques et si l’on rajoute
une diode, la tension chute de 0.6V. La tension n’est alors plus suffisante.
Comme pour la température, je souhaite aussi commander cette sonde de façon à
mesurer le Ph à intervalles réguliers (toutes les 5 minutes).
Le
schéma devient plus compliqué et fait intervenir un transistor de type NPN et
un transistor de type PNP. J’utilise aussi une diode Zener pour garantir du 5,1
V constant, elle devient passante si une tension supérieure est appliquée.
Le
premier transistor (à gauche) est un transistor de type NPN. Si aucun courant
n’est appliqué sur sa base (Etat de la sortie numérique à LOW), alors le
transistor est bloqué. Dans ce cas, le deuxième transistor est bloqué car sa
base est à un potentiel inférieur à 12V qui correspond au potentiel du nœud
« S ».
Si
un courant n’est appliqué sur sa base (Etat de la sortie numérique à HIGH),
alors le transistor est passant. Dans ce cas, le potentiel du nœud
« S » diminue et vaut 12-R*i. Un courant provient alors de la base du
transistor PNP qui devient passant et alimente la sonde à 5.1V précisément.
Lecture de la densité :
J’utilise exactement le même principe que pour la température. Ensuite il faut faire un étalonnage en tenant compte de la température.
Mise à jour 02/06/2016 : Cette méthode ne fonctionne pas dans le temps. J'utilise une autre méthode un peu plus complexe à mettre en œuvre avec un courant alternatif dans une bobine... Cela fonctionne et fera l'objet d'un prochain article détaillé.
Gestion du niveau d’eau
Quand le
niveau d’eau descend sous un niveau minimum, la pompe se déclenche et remplit
la cuve technique d’eau osmosée jusqu’au
niveau maximum. En comptant une réserve de 40 litres d’eau osmosée et une
évaporation d’environ 2 litres par jour. L’autonomie est de 20 jours environ
Le niveau Min
et Max sont réglable avec la tablette. Il y a plusieurs solutions pour résoudre
ce problème. Un flotteur type « chasse d’eau » ne me permet pas
d’avoir les niveaux réglables. Les solutions à base de laser sont chères, j’ai donc opté pour un chapelet de résistance
pour détecter le niveau d’eau.
Info mise à jour 02/06/2016 : J'utilise un autre système pour mesurer le niveau de l'eau beaucoup plus fiable, voir le lien suivant : détection de niveau
Gestion
de l’éclairage :
C’est
la partie la plus complexe.
J’ai
personnellement une rampe de 8 T5 de 54W qui nécessite 3 prises de courant 220
VAC. La première prise commande 4 néons, la deuxième commande les quatre néons
restants et enfin la troisième commande des leds de faible puissance et les
ventilateurs.
Pour
commander les prises, j’utilise des relais de puissance.
Ce sont de petits appareils qui se comportent comme des interrupteurs, ils sont fermés si on applique du 5V et ouverts par défaut ( photo ci-dessus à droite). La gestion des heures d’éclairage est assurée par une puce PCF 8385 ( photo ci-dessus à gauche). J’ai passé de nombreuses heures à comprendre et tester le fonctionnement de cette puce.
Ce sont de petits appareils qui se comportent comme des interrupteurs, ils sont fermés si on applique du 5V et ouverts par défaut ( photo ci-dessus à droite). La gestion des heures d’éclairage est assurée par une puce PCF 8385 ( photo ci-dessus à gauche). J’ai passé de nombreuses heures à comprendre et tester le fonctionnement de cette puce.
L’horloge
possède les informations de temps (adresse 00 à 0F) et de la RAM de libre (à
partir de l’adresse 10 jusqu’à FF) ce qui permet de stocker les moments où les
néons doivent s’allumer et s’éteindre. J’ai divisé la journée en tranches de 30
minutes ( 00 :00 00 :30 01 :00 etc..), cela représente 48
créneaux horaires qui occupent les adresses 20 à 57. Chaque adresse stocke l’information sur les 3 prises.
X
|
X
|
Prise 3
|
Prise 3
|
Prise 2
|
Prise 2
|
Prise 1
|
Prise 1
|
00 :
signifie ne change rien
01 :
Allume
10 :
Eteint
11 : Non
utilisé
Ainsi, si à
l’adresse 30 j’ai l’information 00 00 01 00, cela signifie allume la prise 2 à
05 :00 du matin. Quand on clique sur le bouton « envoyer » de la
tablette, en fait celle-ci envoie 48 octets (+1 octet de commande) pour remplir les adresses 20 à 57
de la puce.
Dialogue Client / Serveur
Pour
dialoguer entre eux, j’utilise des sockets. L’arduino écoute en permanence. La
tablette envoie des requêtes ou des commandes.
Requête envoyée par Client (Tablette,
smartphone, Pc…)
|
Réponse de l’Arduino
|
||
50
|
1
octet : demande de Température
|
Byte1
Byte2
|
2 octets =
1 nombre entre 0 et 1024 traduit côté client en température
|
51
|
1
octet : Demande de pH
|
Byte1
Byte2
|
2 octets =
1 nombre entre 0 et 1024 traduit côté client en pH
|
52
|
1
octet : Demande de densité
|
Byte1
Byte2
|
2 octets =
1 nombre entre 0 et 1024 traduit côté client en densité
|
53 Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 Byte7 […] Byte48
|
49
octets : allumage et extinction des néons
|
Aucune,
prise en compte et intégration dans l’horloge
|
|
54 Byte1
|
2
octets : niveaux cuve
|
Aucune,
prise en compte
|
Conception circuit imprimé :
Une fois que
l’on a testé que tout fonctionne, il reste à rendre cela un peu plus propre
pour que cela s’intègre bien avec la « freebox » dans le salon.
J’utilise un
logiciel qui s’appelle Kicad pour le dessin de mon circuit imprimé. ( un logiciel libre)
Combien le système coûte :
Au-delà des
nombreuses heures de développement de test et d’essai. Les prix de chaque
élément est très raisonnable.
Arduino :
25 euros
Ethernet
Schield : 25 euros
Sonde
Ph :25 euros
Sonde
Température : 3 euros
Divers
composants électroniques (résistances, led, transistors, relais, horloge,
connecteurs, circuits imprimé vierge ) : 10 euros
Pour moins de
100 euros, le système est fonctionnel.
Les améliorations :
Il manque un boîtier pour faire quelque chose de plus "professionnel", je n'ai pas investi dans une imprimante 3D. Ensuite sur le fond, l'objectif est de partir deux semaines en vacances sans interventions humaines. Je souhaiterai :- Ajouter la distribution de nourriture
- Ajouter la vidéo de l'aquarium sur la tablette car rien ne remplace l'image pour détecter les problèmes...
Si vous avez
trouvé cet article intéressant, faites moi part de vos commentaires.
Mise à jour 06/06/2017.
Au départ en écrivant ces lignes, je ne pensais pas en faire un véritable outil, juste quelques idées pour partager. Si vous m'avez lu jusque là, c'est que le domaine vous intéresse et quelques personnes qui me demande si mon système est à vendre. je vous serais très reconnaissant de répondre à mon petit sondage de 10 questions qui m'aidera à savoir si je dois franchir le pas pour l'industrialiser. Merci par avance.
Mise à jour 06/06/2017.
Au départ en écrivant ces lignes, je ne pensais pas en faire un véritable outil, juste quelques idées pour partager. Si vous m'avez lu jusque là, c'est que le domaine vous intéresse et quelques personnes qui me demande si mon système est à vendre. je vous serais très reconnaissant de répondre à mon petit sondage de 10 questions qui m'aidera à savoir si je dois franchir le pas pour l'industrialiser. Merci par avance.
[i]
Il existe d’autres circuits intégrés qui font
le même travail, notamment la série des microcontrôleurs PIC..