Envoyer une notification sur son téléphone - Niveau facile

Il est assez courant qu'avoir une carte équipée d'un capteur (température, niveau d'eau, ouverture de porte) et que l'on souhaite recevoir sur son téléphone une notification quand un événement se produit. Pour ce faire, il nous faut une carte connectée à internet. Le module ESP8266/32 s'impose pour un projet aussi simple.

Nous allons mettre ce scénario en pratique dans un exemple concret : Nous allons lire la température et envoyer une notification en cas de risque de verglas donc lorsque celle-ci passe en dessous de 3°

Premier montage

ComplémentMatériel nécessaire

  • Une carte ESP8266 ou ESP32. J'utiliserai une Wemos D1 mini pour cet exemple

  • Un capteur de température DHT22 que l'on trouve seul ou sur carte (ici sur amazon). On peut même le trouver sous forme de shield pour la wemos D1 mini ce qui élimine tout processus de câblage. Ce module est très précis et est parfaitement supporté par MicroPython.

  • Une breadboard et des fils... et une connexion Wifi !

Pour la notification, nous utiliserons le service en ligne gratuit pushbullet (il faut créer un compte) qui est simple mais très efficace. Il faudra installer sur son smartphone l'application pushbullet (iOS ou android) pour recevoir les notifications.

MéthodeLe montage

Pour le montage, rien de plus élémentaire : On connecte le module DHT22 sur le 3,3V de la carte Wemos (attention, elle fonctionne sur 3,3V et non 5V. Mettre 5V sur ses broches d'entrées-sorties va l'endommager). On connecte la broche de sortie du DHT22 sur la broche D5 de la wemos (par exemple), et le GND sur le GND de la carte.

MéthodeLe code

Le code est pratiquement immédiat car la librairie python gérant le capteur DHT22 est intégrée à la distribution que nous avons installée.

1
import dht
2
import machine
3
import time
4
5
d = dht.DHT22(machine.Pin(14))
6
7
while True:
8
    d.measure()
9
    print("Temp (C): ",d.temperature())
10
    print("Hum (%) : ",d.humidity())
11
    time.sleep(10)

ComplémentBrochage du Wemos D1

Si le code se passe de commentaires, il est nécessaire de préciser l'usage de Pin(14) alors que le capteur est branché sur la broche D5 ! C'est nouveau pour nous car sur CircuitPython, la librairie board masque cette difficulté de traduction de nom des broches. Ici, c'est à nous de savoir que la broche D5 de la Wemos correspond sur l'esp8266 au GPIO14. La commande Pin attend le numéro de broche de l'ESP. Voici un tableau pour s'y retrouver avec le Wemos D1 mini. On y lit bien que D5 correspond à Pin(14).

Broche Wemos

Fonction

Pin sur l'ESP8266

TX

UART Transmit

TXD

RX

UART Receive

RXD

A0

Entrée analogique (max 3.3V)

A0

D0

IO

GPIO16

D1

IO, SCL(I2C)

GPIO5

D2

IO,SDA(I2C)

GPIO4

D3

IO, 10k Pull-Up

GPIO0

D4

IO, 10k Pull-Up, LED intégrée

GPIO2

D5

IO, SCK(SPI)

GPIO14

D6

IO, MISO(SPI)

GPIO12

D7

IO, MOSI(SPI)

GPIO13

D8

IO, 10K Pull-Down, SS(SPI)

GPIO15

G

Ground

GND

5V

5V (USB)

absent

3.3V

3,3V

3.3V

RST

Reset

RST

Pousser une notification via pushbullet

Pour cette partie, vous devrez disposer d'un compte pushbullet (gratuit) et avoir installé l'application pushbullet sur votre téléphone (iOS ou android).

Une fois connecté sur votre espace personnel pushbullet, sous l'onglet Settings / Account, vous devrez récupérer votre jeton d'accès en cliquant sur Create Access Token. Vous obtiendrez une clé API qu'il faudra copier et coller dans votre programme dans la variable API_KEY

MéthodeLe programme

Voici le programme. Il contient le code pour la connexion Wifi. Si dans le paramétrage de MicroPython, vous avez réalisé la connexion dans le boot.py, inutile de vous embarasser de ce code, supprimez-le. Si la connexion n'est pas faite, complétez simplement les paramètres Wifi.

Modifiez la variable API_KEY avec le jeton d'accès obtenu depuis le site de pushbullet.

1
import dht
2
import machine
3
import time
4
import network # Si connexion dans ce script
5
import sys
6
import json
7
import urequests
8
9
# Connexion Wifi
10
# Supprimer cette partie si elle est 
11
# faite automatiquement au demarrage de la carte
12
# dans le boot.py
13
############################
14
# Debut configuration Wifi #
15
############################
16
WIFI_SSID     = 'MON_SSID'
17
WIFI_PASSWORD = 'MON_PASSWD'
18
19
# turn off the WiFi Access Point
20
ap_if = network.WLAN(network.AP_IF)
21
ap_if.active(False)
22
23
# connect the device to the WiFi network
24
wifi = network.WLAN(network.STA_IF)
25
wifi.active(True)
26
wifi.connect(WIFI_SSID, WIFI_PASSWORD)
27
28
# wait until the device is connected to the WiFi network
29
MAX_ATTEMPTS = 20
30
attempt_count = 0
31
while not wifi.isconnected() and attempt_count < MAX_ATTEMPTS:
32
    attempt_count += 1
33
    time.sleep(1)
34
35
if attempt_count == MAX_ATTEMPTS:
36
    print('could not connect to the WiFi network')
37
    sys.exit()
38
39
################################
40
# fin de la configuration Wifi #
41
################################
42
43
# Configuration Pushbullet
44
PB_URL  = "https://api.pushbullet.com/v2/pushes"
45
titre   = "Pushbullet"
46
corps   = "Alerte verglas"
47
API_KEY = "MON_JETON_D_ACCES_A_COMPLETER"
48
49
data_sent = {"type": "note", "title": titre, "body": corps}
50
pb_headers = {
51
    'Authorization': 'Bearer ' + API_KEY,
52
    'Content-Type': 'application/json'
53
}
54
55
d = dht.DHT22(machine.Pin(14))  # Capteur sur D5
56
notified = False
57
58
while True:
59
    d.measure()
60
    temp = d.temperature()
61
    print(temp)
62
    if temp < 3 and not notified:
63
        print ("Alerte verglas")
64
        # Envoi de la notification
65
        r = urequests.post(PB_URL, data=json.dumps(data_sent), headers=pb_headers)
66
        if r.status_code==200:
67
            print("Envoi de la notification reussi")
68
            # Desarmement des notifications
69
            notified = True
70
        else:
71
            print("Echec de l'envoi")
72
            print(r.reason)
73
    if temp > 15 :
74
        # Rearmement des notifications
75
        notified = False
76
    time.sleep(10)

Complément

L'envoi de la notification se fait via la librairie urequest - intégrée en standard à Micropython - qui permet de faire une requête http. Il est intéressant d'exploiter la variable de retour r puisque

  • r.status donnera l'état de la requête (200 = succès)

  • r.reason donnera s'il y a lieu un message d'erreur

Et voilà, vous avez à présent un objet connecté doté d'un capteur, qui peut vous envoyer des alertes personnalisées sur votre smartphone... et le tout pour moins de 10€ !! Les champs d'application sont très vastes : détection d'ouverture de porte, détecteur de fumée intelligent, alarme, capteur d'arrosage de plantes, détection d’inondation etc... tout dépendra du capteur que vous connecterez à la carte. Le code pour la notification, lui, restera identique.