Chez Yoctopuce il y a un petit réfrigérateur qui sert à tenir au frais le stock de pâte à braser, quelques bouteilles d'eau et des pique-niques occasionnels. On a remarqué que la petite pichenette qu'on a tous l'habitude de donner à la porte ne suffit pas toujours à la fermer. Elle reste alors entre-ouverte pendant des heures avant que quelqu'un ne s'en rende compte. On soupçonne que c'est du au poids des bouteilles d'eau rangées dans la porte. On pourrait probablement résoudre le problème en penchant légèrement le frigo à l'aide de cales, mais on a préféré un overkill à la Yoctopuce....
l'objet du délit
Le cœur du problème consiste donc à détecter si la porte du frigo est correctement fermée ou non. Plutôt que d'utiliser un contacteur mécanique on a décidé d'utiliser une méthode optique, plus facile à mettre au point et probablement plus stable dans le temps.
Premiers tests
L'idée est d'utiliser un Yocto-Proximity pour détecter la porte. On a séparé la partie capteur et on a utilisé Yocto-Visualization pour déterminer le meilleur emplacement qui permette de mesurer s'il y a un espace entre le coffre du frigo et le joint de la porte.
On a finalement choisi de placer de capteur dans l'angle supérieur du coffre, du coté opposé à la charnière, et orienté vers le bas. A cet endroit, en théorie, on mesure la distance entre le haut du frigo et le joint de la porte lorsqu'elle est fermée ou le sol lorsque la porte est ouverte.
La meilleure position pour le capteur
La réalité est un peu plus nuancée à cause des reflets mais on distingue malgré tout parfaitement quand la porte est restée entre-ouverte.
On distingue très bien quand la porte est entre-ouverte
De plus, placé à cet endroit le capteur reste caché et protégé des chocs et de la poussière.
Réalisation
En observant le frigo un peu attentivement, on a réalisé que non seulement l'espèce de plan de travail posé dessus se démonte facilement, mais qu'en plus il y a dessous un espace de 2cm de haut dans lequel on peut facilement cacher l'essentiel de l’électronique. Y placer la partie principale du Yocto-Proximity et vieux YoctoHub-Wireless-SR qui traînait par là a été un jeu d'enfant. Notez qu'on aurait très bien pu utiliser un YoctoHub-Wireless-n avec une petite antenne patch.
La partie électronique , rien de bien compliqué.
Pour signaler que la porte n'est pas fermée on a choisi d'utiliser un Yocto-MaxiBuzzer qu'on a simplement aimanté sur le coté du frigo, il est un peu trop gros pour être caché sous le plan de travail.
Amélioration optionnelle
Il se trouve que Yocto-MaxiBuzzer dispose d'un driver de LED RGB. On a n'a pas résisté à la tentation d'ajouter une barrette de LED dans l'espace libre juste au dessus de la porte. Nous n'avons qu'un seul frigo, mais on imagine que si on en avait toute une rangée, on serait assez content de pouvoir déterminer du premier coup d’œil lequel a un problème.
On a ajouté une barrette de LED, juste pour frimer
Programmation
La partie programmation est relativement triviale: un simple script python de quatre douzaines de lignes suffit à gérer le problème.
from yocto_api import *
from yocto_proximity import *
from yocto_buzzer import *
from yocto_colorledcluster import *
# IP address of the hub handling the devices
hubAddr = "192.168.1.98"
# Some quick and dirty global variables
maxOpenTime = 15
doorIsOpen = False
openSince = datetime.datetime.now()
# automatically called when the sensor value changes
def proximityValueChangeCallback(fct, value):
global doorIsOpen
global openSince
isOpen = int(value) >10
if not (doorIsOpen) and isOpen:
print("Door is open!")
openSince = datetime.datetime.now()
doorIsOpen =True
elif not (isOpen) and doorIsOpen:
print("Door is closed.")
doorIsOpen =False
print("Starting fridge's door monitoring...")
YAPI.DisableExceptions()
errmsg = YRefParam()
# Setup the API to use the remote hub
if YAPI.RegisterHub(hubAddr, errmsg) != YAPI.SUCCESS:
sys.exit(hubAddr+"init error" + errmsg.value)
# look for proximity sensor
proximitySensor = YProximity.FirstProximity()
if proximitySensor is None:
sys.exit("No proximity sensor found on "+hubAddr)
# look for buzzer
buzzer = YBuzzer.FirstBuzzer()
if buzzer is None:
sys.exit("No buzzer found sensor on "+hubAddr)
# look for led driver, but don't complain if not found
ledCluster = YColorLedCluster.FirstColorLedCluster()
# We definitely want to hear the buzzer -> full power
buzzer.set_volume(100)
# install a callback, automatically called when the door moves
proximitySensor.registerValueCallback(proximityValueChangeCallback)
# main loop
while True:
if doorIsOpen and (datetime.datetime.now()-openSince).total_seconds() >maxOpenTime:
if not(ledCluster is None ): ledCluster.set_rgbColor(0,12, 0xFF0000 );
buzzer.playNotes(",C32^ C32^ C8")
openSince = datetime.datetime.now()
if not(ledCluster is None ): ledCluster.rgb_move(0, 12, 0x000000, 5000);
YAPI.UpdateDeviceList(errmsg) # traps plug/unplug events
YAPI.Sleep(500, errmsg) # traps others events
Le résultat est assez efficace, tant que la porte reste ouverte un bip retentissant se fait entendre toutes les quinze secondes et un flash rouge est clairement visible au dessus de la porte.
La porte est restée entre-ouverte, le frigo n'est pas content
Conclusion
Grâce à ce petit bricolage réalisé en quelques heures, la porte du frigo est désormais fermée correctement. Si on était un peu curieux on pourrait utiliser l'enregistreur de données du Yocto-Proximity et Yocto-Visualization pour savoir quand la porte a été ouverte. Pour finir, notons que si la température à l'intérieur du frigo était un paramètre critique, on aurait facilement pu ajouter un capteur de température au système.