IoT : Relevés périodiques de mesures avec pico pi en mode deep-sleep

Il s’agit de créer un IoT qui va prendre périodiquement 2 mesures : la température et l’humidité ambiante. La mesure s’effectue toutes les 20mn, et entre deux mesures, le système est placé en mode deep-sleep.

Le mode « deep-sleep » est choisi pour que l’unité centrale reste autant que possible à la température ambiante,et n’affecte donc pas la mesure effectuée grâce au capteur placé à proximité. Le programme prend les mesures, les envoie vers une base de donnée puis se met en sommeil. À chaque réveil, la carte se réinitialise et réitère ce processus. Il n’y a pas de boucle.

Composants

  • Carte « Pico PI W » :
  • Capteur HT22 :

 

Câblage

Programme embarqué

Stockage des informations

Rendu graphique

Dans le cas présent, 3 objets connectés, placés dans des lieux différents envoient leurs informations vers une base de données par une simple requête HTTP.
La librairie javascript chart.js est utilisée pour le rendu.

Programmer l’Arduino avec python (ICN)

L’objectif est de piloter une carte arduino, à partir d’un programme en python s’exécutant dans l’ordinateur.
La carte arduino est programmée de manière à dialoguer avec une librairie python:

  • dans la carte arduino, le programme arduinoPy.ino est préalablement installé. Si ce n’est pas le cas, il s’installe simplement avec l’IDE «Arduino»
  • dans votre répertoire de travail, vous disposez de la librairie pyduino.py

Carte d'extensionPlan de la carte

Librairie python

pyduino.py

Ce fichier est à copier dans le même dossier que votre programme.
Vous ne devez pas le modifier, sauf si vous modifiez également le fichier « arduinoPy.ino » fourni plus bas.

Utilisation de la librairie

Exemple

from pyduino import *
import time

a = Arduino('/dev/ttyACM1')
time.sleep(3)
pos = 100
for i in range(0,1000):
   if i%2 == 0:    
        a.S0(1)
        a.S1(0)
   else:
        a.S0(0)
        a.S1(1)
   if i%3 == 0:
        a.S2(1)
        a.S3(0)
   else:
        pos = 100 - pos
        a.M2(pos)
        a.S2(0)
        a.S3(1)
   v  = a.E0() + 2*a.E1()
   print(' '+ repr(v) + '; A1 = ' + repr(a.A(1)) + '; A6 = '
            + repr(a.A(6)))
   a.M1(60*v)
   a.M0(60*v)
   time.sleep(0.1)

TP de mise en œuvre de la carte d’extension avec python

Firmware Arduino

arduinoPy.ino

Pour être pris en compte par le logiciel arduino, ce fichier est à placer dans un dossier arduinoPy.

Arduino / python : documentation

Introduction

 

La carte, associée à la librairie python, permet de gérer:

  • 2 entrées digitales E0 et E1 reliées à des boutons poussoirs
  • 4 sorties digitales S0 à S3 connectées à des LEDS
  • 6 entrées analogiques de A1 à A6
  • 3 PWM pour servomoteurs, M0, M1 et M2

Pour utiliser la carte, il suffit de déclarer une variable de type Arduino, puis d’utiliser cette variable comme dans les exemples qui suivent.

Initialisation de la carte

Pour être connecté à la carte, il faut exécuter

a = Arduino()

Le constructeur prend un paramètre optionnel pour s’adapter au système.

Exemple sous linux

from pyduino import *
import time

a = Arduino('/dev/ttyACM0')
time.sleep(3)

Exemple sous Windows

from pyduino import *
import time

a = Arduino('COM10')
time.sleep(3)

La valeur par défaut est ‘/dev/ttyACM0’.
Vous pouvez modifier cette valeur par défaut dans votre fichier pyduino.py, elle
est facile à repérer.

Remarque : sous linux, cela peut être /dev/ttyACM1 , /dev/ttyUSB0
et soux windows COM11 , COM12

La connexion à la carte arduino par le port série  redémarre la carte.
Les 3 secondes sont là pour attendre que l’initialisation soit complète.

Les sorties digitales

Elles sont au nombre de 4, accessibles par les méthodes :
 a.S0(<valeur>),  a.S1(<valeur>), a.S3(<valeur>),  a.S4(<valeur>)

ou <valeur> vaut 0 ou 1 pour éteindre ou allumer la sortie correspondante

Exemple

from pyduino import *
import time

a = Arduino('/dev/ttyACM0') # à adapter
time.sleep(3)

i = 0
while True:
    if i%2 == 0:
       a.S0(1)
       a.S1(0)
    else:
       a.S0(0)
       a.S1(1)
    if i%3 == 0:
       a.S2(1)
       a.S3(0)
    else:
       a.S2(0)
       a.S3(1)
    i = i+1

.

Les entrées digitales

On peut en utiliser 2 à partir des boutons placés sur la carte:

v0 = a.E0()
v1 = a.E1()

v0 vaut 1 si le bouton E0 est enfoncé, et 0 sinon
v1 vaut 1 si le bouton E1 est enfoncé, et 0 sinon

Exemple


from pyduino import *
import time

a = Arduino('/dev/ttyACM0')
time.sleep(3)
while True:
   v0 = a.E0()
   v1 = a.E1()
   print(' v0 = '+ v0 + ' et v1 = ' + v1)

Les entrées analogiques

On peut en utiliser 6 (numérotées de 1 à 6).

val = a.A1() renvoie une valeur entière (entre 0 et 400), qui est une valeur numérisée proportionnelle à la tension renvoyée par le capteur.
On peut aussi écrire val = a.A(1) ce qui permet de traiter plusieurs entrées de capteurs dans une boucle.

Exemple


from pyduino import *
import time

a = Arduino('/dev/ttyACM0')
time.sleep(3)

while True:
    print(' A1 = ' + repr(a.A(1)))

Les sorties PWM pour les moteurs

Installez un moteur sur la sortie M0 (voyez le plan)


from pyduino import *
import time

a = Arduino('/dev/ttyACM0')
time.sleep(3)

while True:
    a.M0(0)
    time.sleep(1)
    a.M0(180)
    time.sleep(1)
    a.M0(90)
    time.sleep(1)