ESP32-Introduction

L’ESP32 développé par la société Espressif , est une carte de développement à faible coût dédié à l’internet des objets (IoT) et les applications embarquées. C’est un (SoC) system on a chip doté de communications sans fil Wifi et Bluetooth.

 

Description :

Hardware et software

  • DOIT
  • – Concepteur de la carte microcontrôleur ESP32 Devkit.
  • Espressif
  • – Fabriquant du module de microcontrôleur ESP-WROOM-32.
  • Silicon Labs CP2102
  • – USB-to-UART bridge.
  • LuaNode software
  • – Interpréteur Lua qui est préinstallé sur la carte lors de l'achat.

Les pins de la carte ESP32

Pin ou GPIO(Les ports GPIO (anglais : General Purpose Input/Output, littéralement Entrée-sortie à usage général) sont des ports d'entrées-sorties très utilisés dans le monde des microcontrôleurs)

On peut assigner plusieurs fonctions au même pin, grâce au circuit de multiplexage de la carte ESP32
On peut choisir le rôle d'un pin (UART, I2C, SPI) par programmation
La carte ESP32 est composée de :

  • EN Enable : broche du régulateur 3.3 V
  • On peut utiliser cette broche connectée à un bouton poussoir et au GND pour redémarrer la carte ESP32.
  • 15 ADC (Analog-to-Digital Converter) convertisseur analogique-numérique )pour lire les entrées analogiques
  • 4 interfaces SPI: SPI0 et SPI1 (réservés) , HSPI et VSPI(peuvent être utilisés).
  • GPIO 34,35,36 et 39 à utiliser comme entrée seulement
  • capteurs tactiles capacitifs internes(TOUCH) (GPIO 2,4,15,12,13,14,27,32 et 33). Ceux-ci peuvent détecter des variations dans tout ce qui contient une charge électrique, comme la peau humaine. Ils peuvent ainsi détecter les variations induites lors du contact du GPIO avec le doigt. Ces broches peuvent remplacer les boutons mécaniques.

Programmation de la carte :

Pour programmer la carte on peut utiliser les environnements de développement suivants:

  • Arduino IDE
  • Thonny IDE
  • uPyCraft
  • Espressif IDF (IoT Development Framework)
  • Micropython
  • JavaScript
  • LUA
  • Zerynth studio

Dans les projets à réaliser on va utiliser essentiellement Thonny IDE et Arduino IDE pour programmer la carte ESP32.
Thonny IDE permet de programmer la carte ESP32 avec le Micro-python.

Annexe :

Il existe aussi la carte esp32 NodeMCU. NodeMCU est une plate-forme open source IoT, matérielle et logicielle, basée sur un SoC Wi-Fi ESP8266 ou ESP32 . Le terme « NodeMCU » se réfère par défaut au firmware plutôt qu'aux kits de développement.

Installation:

Installation pilotes (Driver) ESP32

Après branchement de la carte au port usb, Windows détecte " CP2102 USB To UART Bridge Controller".

Il faut télécharger le pilote au lien suivant: Lien
Liens direct drivers: windows 7 windows 10 & windows 11


Décompresser le fichier CP210x_Windows_Drivers.zip puis exécuter le fichier correspondant à votre architecture 32 bit ou 64 bit :CP210xVCPinstaller.exe

Suivre les étapes d'installation:

Terminer l'installation

Carte ESP32-Simulateur

Simulateur ESP32

On peut utiliser un simulateur en ligne pour la carte ESP32, sur le site :https://wokwi.com/
lien simulateur MicroPython on ESP32

Mini-projet 1: LED clignotante

wokwi esp32

lien Exemple de simulation MicroPython on ESP32 (LED BLINK)

Mini-Projet 2: Feu de circulation

On veut réaliser un feu de circulation en utilisant 3 diodes LED de couleurs (rouge, vert, orange) et 3 résistances de de 220 Ω commandées par la carte ESP32. La séquence est la suivante :
1. Le feu vert s’allume pendant 3 secondes, puis s’éteint, (pin 23)


2. Le feu orange s’allume pendant 1 seconde puis s’éteint, (pin 22)
3. Le feu rouge s’allume pendant 3 secondes, puis s’éteint, (pin 21)
et on recommence

 

alarme esp32

Utiliser le site wokwi.com pour faire le montage et écrire le script python:
https://tinyurl.com/projet2-feu-circulation lien

Mini-Projet 3: Alarme extérieure factice

On veut réaliser une Sirène d’alarme extérieure factice, pour cela on va utiliser 2 diodes leds et une carte ESP32.
Faire le montage puis le script micro-python permettant de :
1-Allumer led1 pendant 0.5 seconde puis l’éteindre
2-puis allumer led2 pendant 0.5 seconde puis l’éteindre
et on recommence

alarme esp32

Utiliser le site wokwi.com pour faire le montage et écrire le script python:
https://tinyurl.com/projet3-alarme lien

Carte ESP32-Composants électroniques

Composants électroniques avec ESP32

Plaque d'essai (Breadboard)

La plaque d'essai contient plusieurs trous, permettant de relier des composants facilement, pour tester un montage.

breadboard esp32

Les trous encerclés en vert sont liés.

breadboard esp32

 

  • Les trous de la section 2 et 3 sont connectés verticalement.
  • Les trous de la section 1 et 4 sont connectés horizontalement.
  • Les trous de la section 2 et 3 ne sont pas connectés.
  • Les trous de la section 1 et 4 ne sont pas connectés.

 

Le cas de la plaque à essai 840 points:

breadboard esp32

 

Diode LED

Une diode électroluminescente, ou LED pour "Light-Emitting Diode", est polarisée, elle ne s’allume que lorsque les pattes sont connectées dans un sens bien déterminé.

breadboard esp32

Remarque : Il faut utiliser une résistance (par exemple de 220 Ω), pour ne pas risquer de griller la LED.

Exemple de montage:

breadboard esp32

 

Exemple de montage utilisant une carte ESP32 NodeMCU, une diode LED et une résistance (220 Ω):

breadboard esp32

 

Code MicroPython :

from time import sleep
from machine import Pin

led=Pin(23,Pin.OUT)

while True:
    led.value(not led.value())
    sleep(1)

PWM:Pulse width modulation

On peut aussi utiliser PWM pour allumer une LED.
Pulse width modulation (PWM) est un moyen d’obtenir une sortie analogique artificielle sur une broche numérique.
Deux paramètres y sont associés : la fréquence du basculement et le rapport cyclique(duty cycle).



Rapport cyclique (duty): est le rapport entre la durée de l'état actif et la période (inverse de la fréquence).

 

duty esp32
  • Fréquence : comprise entre 0 et 78125.
  • Rapport cyclique (duty): entre 0 et 1023. Dans lequel 1023 correspond à 100% du rapport cyclique (luminosité maximale) et 0 correspond au rapport cyclique de 0% (LED non éclairée).
pwm duty cycle esp32

Exemple de code utilisant le PWM:

Code MicroPython :

from machine import Pin, PWM
from time import sleep

led = PWM(Pin(23), 5000) #fréquence =5000Hz

while True:
  for duty_cycle in range(0, 1024):#duty entre 0 et 1023
    led.duty(duty_cycle)
    sleep(0.005)

Bouton poussoir :

 

Pour un bouton poussoir, on appuie pour allumer ou éteindre et le bouton revient tout seul à sa position initiale. En effet, le poussoir ne sert qu’à envoyer une impulsion.
Exemple de bouton poussoir touche :

breadboard esp32

Exemple de montage utilisant un bouton poussoir, une carte ESP32 NodeMCU, une diode LED et une résistance (220 Ω):

breadboard esp32

 

Code MicroPython :

from machine import Pin

p=Pin(23,Pin.OUT)
p13=Pin(13,Pin.IN)
while True:
    if p13.value()==1:
        p.on()
    else :
        p.off()

Remarque: On peut aussi utiliser un module bouton poussoir:

breadboard esp32

Deux exemples d'utilisation de ce module:

breadboard esp32

Le circuit interne du module bouton poussoir pour les deux cas d'utilisation:

breadboard esp32

Buzzer :

Il y a deux types :
– Buzzer actif: Il peut générer du son quand il reçoit une tension continue.
– Buzzer passif: On doit utiliser le PWM de la carte esp32 pour générer un son.

breadboard esp32

Dans notre cas on va utiliser un buzzer actif.

breadboard esp32

Exemple de montage utilisant un bouton poussoir, une carte ESP32 NodeMCU et un buzzer:

breadboard esp32

 

On va reprendre le même code de bouton poussoir.

Code MicroPython :

from machine import Pin

p=Pin(23,Pin.OUT)
p13=Pin(13,Pin.IN)
while True:
    if p13.value()==1:
        p.on()
    else :
        p.off()

Capteur DHT11:(température et humidité)

Capteur de température et d’humidité DHT11.Permettant de mesurer des températures entre 0° et 50°.

breadboard esp32

Exemple de montage utilisant une carte ESP32 NodeMCU, et un capteur DHT11:

breadboard esp32

 

Code MicroPython :

from machine import Pin
import time
import dht 

sensor = dht.DHT11(Pin(23)) 

while True:
    sensor.measure()
    t = sensor.temperature()
    h = sensor.humidity()
    print("Température=",t," °C")
    print("Humidité=",h," %")
    time.sleep(5)

Servomoteur:

Un servomoteur est un système motorisé capable d'atteindre des positions prédéterminées, puis de les maintenir. La position est définie avec une limite de débattement d’angle de 180 degrés, mais également disponible en rotation continue.

breadboard esp32

Exemple de montage utilisant une carte ESP32 NodeMCU, et un servomoteur:

breadboard esp32

 

Le branchement de servomoteur:

  • Marron -> GND
  • Rouge -> 5V
  • Orange-> pin(PWM)

 

Remarque :
Si l'alimentation de la carte ESP32 ne suffit pas pour faire fonctionner le servomoteur correctement, il faut ajouter une alimentation externe dédiée au servomoteur.breadboard esp32

 

Pour une frequence de 50Hz, et une largeur d'impulsion, comprise entre 1 et 2 millisecondes, la valeur de duty est théoriquement entre 50 et 100, mais pratiquement il faut tester le servo moteur pour deduire l'intervalle .On peut trouver par exemple entre 40 et 115, entre 25 et 125, ...breadboard esp32

 

Code MicroPython :

from machine import Pin,PWM 
from time import sleep
servo=PWM(Pin(23),freq=50)
while True:
    # duty entre 25 et 125(change suivant le servomoteur)
    x=int(input('donner une valeur(entre 25 et 125)='))
    servo.duty(x)
    sleep(1)

Capteur ultrason :HC-SR04

Le détecteur HC-SR04 utilise les ultrasons pour déterminer la distance à laquelle se trouve un objet. Son champ de vision est de 90° environ selon l'environnement.

breadboard esp32

Si une impulsion de plus de 10µS est détectée (sur l'entrée TRIGGER), alors le capteur envoie une série de 8 impulsions à ultrason de 40kHZ et attends le réfléchissement du signal. Lorsque celui-ci est détecté, une impulsion de durée proportionnelle à la distance mesurée (Plage de mesure : 2 cm à 400 cm) est envoyée sur la sortie "Echo".breadboard esp32

 

Exemple de montage utilisant une carte ESP32 NodeMCU, et un capteur ultrason HC-SR04:

breadboard esp32

 

Remarque: Si l'alimentation de la carte ESP32 ne suffit pas pour faire fonctionner le capteur ultrason HC-SR04 correctement, il faut ajouter une alimentation externe dédiée au capteur ultrason HC-SR04.

Code MicroPython :

main.py
from hcsr04 import HCSR04
from time import sleep

sensor = HCSR04(trigger_pin=5, echo_pin=4, echo_timeout_us=10000)

while True:
    distance = sensor.distance_cm()
    print('Distance=', distance, 'cm')
    sleep(2)

Remarque:On doit aussi téléverser la bibliothèque hcsr04.py téléchargée à partir de : https://github.com/rsc1975/micropython-hcsr04
Lien direct:hcsr04.py (clic droit sur le lien puis enregistrer le lien sous)
Dans le cas de Thonny:
Pour téléverser des fichiers sur la carte, il faut commencer par arrêter l'exécution du programme dans Thonny IDE.
Ouvrir le fichier téléchargé hcsr04.py dans Thonny puis Fichier > Enregistrer sous.. > appareil MicroPython

breadboard esp32

 

Capteur de lumière :LDR

Une cellule photoélectrique ou photorésistance ou LDR( lightdependent resistor) résistance variable avec la lumière. La résistance d’un LDR diminue avec l’augmentation de l’intensité lumineuse incidente, et augmente dans le cas contraire.

Dans l’obscurité, une photorésistance peut avoir une résistance aussi élevée que plusieurs mégohms (MΩ), tandis qu’à la lumière, une photorésistance peut avoir une résistance aussi faible que quelques centaines d’ohms.breadboard esp32

Exemple de montage utilisant une carte ESP32 NodeMCU, et une LDR:
Une photorésistance est connectée à la broche p34 avec une resistance pull-down (1kΩ) et à 3v3. Nous allons mesurer la tension sur le pin34 qui va changer lorsque l’intensité lumineuse change. Pour ce faire, la broche doit prendre en charge la lecture analogique. En d’autres termes, il doit s’agir d’une broche ADC (Analog to Digital Converter). Le pin34 est exactement ce genre de broche, selon les fiches techniques.(on peut utiliser les pins ADC1 32-39).

ldr esp32

 

Code MicroPython :

main.py
from machine import Pin, ADC
from time import sleep

p34 = ADC(Pin(34))  # initialiser ADC (analog to digital conversion)
p34.atten(ADC.ATTN_11DB)   #permet d'avoir des valeurs entre 0-4095 pour (0-3.3v)

while True:
  p34_value = p34.read()
  print(p34_value)
  sleep(0.1)

Module capteur de lumière :LDR

Le module possède une sortie numérique et une sortie analogique, par conséquent, se raccorde sur la carte ESP32 sur une entrée numérique ou sur une entrée permettant la lecture analogique ( avec (ADC)convertisseur analogique-numérique ).

breadboard esp32

Fonctionnement:
– Sortie numérique: la sortie passe à l’état bas (0) lorsque le module reçoit suffisamment de lumière (seuil réglable via le potentiomètre).
– Sortie analogique: la sortie est inversement proportionnelle à la quantité de lumière reçue.

breadboard esp32

Le comparateur LM393 permet de comparer la tension aux bornes de la LDR avec une tension de référence réglable.
Le potentiomètre permet d’ajuster le seuil de déclenchement en fonction du niveau de lumière:
-Tourné dans le sens horaire, il augmente la sensibilité.
-Tourné dans le sens anti-horaire la sensibilité diminue.
La LED PWR-LED, s’allume quand le module est alimenté. La LED D0-LED indique le niveau de sortie sur la broche D0. Elle s’allume quand l’intensité lumineuse dépasse le seuil fixé grâce au potentiomètre.
Les broches sont :

  • A0 La sortie analogique, reflet de l’intensité lumineuse reçue par la LDR
  • D0 Sortie numérique, passe à 1 (+3.3v ou +5v) lorsque l’intensité lumineuse dépasse le seuil
  • GND Masse
  • Vcc Alimentation +3.3v

 

Utilisation de la sortie analogique (A0) du module:

Exemple de montage utilisant une carte ESP32 NodeMCU, et un module LDR:

ldr esp32

 

On peut reprendre le même code que l'LDR:

Code MicroPython :

main.py
from machine import Pin, ADC
from time import sleep

p34 = ADC(Pin(34))  # initialiser ADC (analog to digital conversion)
p34.atten(ADC.ATTN_11DB)   #permet d'avoir des valeurs entre 0-4095 pour (0-3.3v)

while True:
  p34_value = p34.read()
  print(p34_value)
  sleep(0.1)

 

Remarque:
Les valeurs sur la sortie (entre 0 et 4095), selon l'intensité de la lumière.

Exemple d'exécution (Sortie analogique):

console a0 esp32

Utilisation de la sortie numérique (D0) du module:

Exemple de montage utilisant une carte ESP32 NodeMCU, et un module LDR:

ldr esp32

 

Remarque:
-Dans le cas de l'obscurité : D0-LED éteinte et D0 à 1
-Dans le cas où il y a de la lumière : D0-LED allumée et D0 à 0

Code MicroPython :

main.py
from machine import Pin
from time import sleep

p4=Pin(4,Pin.IN)

while True:
  print(p4.value())
  sleep(0.1)

Projets ESP32

Projet 1:

LedFaire clignoter une LED (avec un intervalle de 1 seconde) branché sur la carte ESP32 sur le port 23.

Montage:

Carte ESP32 , lampe LED, resistance de 220 Ω

led esp32

Une diode électroluminescente, ou LED pour "Light-Emitting Diode", est polarisée, elle ne s’allume que lorsque les pattes sont connectées dans un sens bien déterminé.
Resistance : ajouter une résistance en série avec la LED afin de limiter le courant qui va la parcourir
La carte Esp32 possède un microcontrôleur facilement programmable ainsi que de nombreuses entrées-sorties.

led esp32

Croquis Arduino IDE:


// ledPin est le pin GPIO 23 de la carte ESP32
const int ledPin = 23;

// la fonction setup s'exécute  lors d'un  reset ou de mise sous tension de la carte
void setup() {
  // initialiser le pin numérique ledPin comme pin de sortie.
  pinMode(ledPin, OUTPUT);
}

// la fonction loop est une boucle infinie
void loop() {
  digitalWrite(ledPin, HIGH);   // Allumer la LED (HIGH)
  delay(1000);                  // attendre 1 seconde
  digitalWrite(ledPin, LOW);    // Eteindre la LED (LOW)
  delay(1000);                  // attendre 1 seconde
}

Code MicroPython :

import time
from machine import Pin         # importer pin à partir du module machine

led=Pin(23, Pin.OUT) # Définir le  pin 23 comme output(sortie)

while True:      # boucle while , boucle infinie puisque condition toujours vrai ->True 
  led.value(1)      # Allumer la LED
  time.sleep(1)     # attendre 1 seconde
  led.value(0)      # Eteindre la LED
  time.sleep(1)     # attendre 1 seconde

Remarque: Pour allumer/éteindre la lampe LED, on peut aussi utiliser led.on() et led.off()

Projet 2:

LedAllumer une lampe LED par le toucher du pin GPIO4.

Montage:

Carte ESP32 , lampe LED, resistance de 220 Ω

led esp32

Croqui Arduino IDE:


// choisir les pins
const int touchPin = 4; 
const int ledPin = 23;

// Choisir le seuil
const int seuil = 20;
// variable pour stocker la valeur du capteur capacitif 
int touchValue;

void setup(){
  Serial.begin(115200);
  delay(1000); // pause d'une seconde
  // initialiser le pin(broche) LED comme sortie(output):
  pinMode (ledPin, OUTPUT);
}

void loop(){
  // lire la valeur sur le touchpin:
  touchValue = touchRead(touchPin);
  Serial.print(touchValue);
  // vérifier si touchvalue < seuil 
  //si oui mettre  ledPin à la valeur  HIGH
  if(touchValue < seuil){
    // Allumer la lampe LED
    digitalWrite(ledPin, HIGH);
    Serial.println(" - LED on");
  }
  else{
    // Eteindre la lampe LED
    digitalWrite(ledPin, LOW);
    Serial.println(" - LED off");
  }
  delay(500);
}

Code MicroPython :

from machine import Pin,TouchPad

led=Pin(23,Pin.OUT)
touch0=TouchPad(Pin(4))
seuil=100 #configurer le seuil pour lequel le pin est considéré comme touché

while True:
    touch0.config(seuil)
    print(touch0.read())    # lire puis afficher la valeur sur le touchpin
    if touch0.read()<100:     # vérifier si la valeur sur le touchpin < seuil
        led.on()      # Allumer la lampe LED
    else:
        led.off()    # Eteindre la lampe LED

 

Commander une lampe LED par wifi (éteindre et allumer)

Montage:

Carte ESP32 , lampe LED, resistance de 220 Ω

led esp32

Principe:

On va se connecter au réseau WiFi disponible puis créer un serveur web sur la cate ESP32 enfin accéder à la carte via son adresse IP pour commander le pin23 dans notre exemple.

led esp32

Croquis Arduino IDE:

 

Code MicroPython :


import usocket as socket
from machine import Pin
import network


ssid = 'NOM_RESEAU_WIFI'
password = 'MOT_DE_PASSE_WIFI'

station = network.WLAN(network.STA_IF)

station.active(True)
station.connect(ssid, password)

while station.isconnected() == False:
  pass

print('connexion établie')
print(station.ifconfig())

led = Pin(23, Pin.OUT)


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)

while True:
  conn, addr = s.accept()
  print('Connexion de =  %s' % str(addr))
  request = conn.recv(1024)
  request = str(request)
  print('Contenu = %s' % request)
  led_on = request.find('/?led=on')
  led_off = request.find('/?led=off')
  if led_on == 6:
    print('LED ON')
    led.value(1)
  if led_off == 6:
    print('LED OFF')
    led.value(0)
 
  response ="""<h1> <a href="/?led=on"><button style="display: block; width: 100%;font-size: 100px;">ON</button></a></h1>
 <h1><a href="/?led=off"><button style="display: block;width: 100%;font-size: 100px;">OFF</button></a></h1>"""

  conn.send('HTTP/1.1 200 OK\n')
  conn.send('Content-Type: text/html\n')
  conn.send('Connection: close\n\n')
  conn.sendall(response)
  conn.close()

Projet 4:

LedCommander une lampe par wifi (éteindre et allumer)


lampe esp32

Montage:

Carte ESP32 , lampe, relais 5V

lampe esp32

Un relais est un commutateur automatique permettant de commander un circuit à courant fort avec un signal à courant faible.
Entrées:

  • GND:Conneté au GND (0 V)
  • VCC:Connecté au 5V
  • SIG: Permet de contrôler le relais (plus que 2.0 V permet de l'activer)
Sorties:
  • NO:Normally Open,est connecté au COM lorsque SIG est activé (High)
  • COM:Common pin
  • NC:Normally Closed, est connecté au COM lorsque SIG est désactivé (LOW)

 

Principe:

On va se connecter au réseau WiFi disponible puis créer un serveur web sur la cate ESP32 enfin accéder à la carte via son adresse IP pour commander le pin23 dans notre exemple. (le même principe que la commande d'une lampe LED et le même programme installé sur la carte)

led esp32

Croquis Arduino IDE:

 

Code MicroPython :


import usocket as socket
from machine import Pin
import network


ssid = 'NOM_RESEAU_WIFI'
password = 'MOT_DE_PASSE_WIFI'

station = network.WLAN(network.STA_IF)

station.active(True)
station.connect(ssid, password)

while station.isconnected() == False:
  pass

print('connexion établie')
print(station.ifconfig())

led = Pin(23, Pin.OUT)


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)

while True:
  conn, addr = s.accept()
  print('Connexion de =  %s' % str(addr))
  request = conn.recv(1024)
  request = str(request)
  print('Contenu = %s' % request)
  led_on = request.find('/?led=on')
  led_off = request.find('/?led=off')
  if led_on == 6:
    print('LED ON')
    led.value(1)
  if led_off == 6:
    print('LED OFF')
    led.value(0)
 
  response ="""<h1> <a href="/?led=on"><button style="display: block; width: 100%;font-size: 100px;">ON</button></a></h1>
 <h1><a href="/?led=off"><button style="display: block;width: 100%;font-size: 100px;">OFF</button></a></h1>"""

  conn.send('HTTP/1.1 200 OK\n')
  conn.send('Content-Type: text/html\n')
  conn.send('Connection: close\n\n')
  conn.sendall(response)
  conn.close()

Projet 5:

poubelleAllumer une LED suivant le niveau de remplissage d'une poubelle (LED verte(espace vide >10cm)) (LED rouge(espace vide <=10cm) ).


Montage:

Carte ESP32 , capteur ultrason HC-S004, 2 resistances 220 Ω, 2 LED rouge et vert

poubelle ultrason esp32

On peut ausi ajouter un pond diviseur de tension,formé de deux résistances( 1 resistance 2.2kΩ, 1 resistance 3.3kΩ). Le but du pont diviseur est de fournir une tension plus petite à partir d'une tension plus grande (tension de ECHO du capteur ultrason vers l'entréée GPIO4 de la carte ESP32)poubelle ultrason esp32Broches de connexion (capteur ultrason)

  • Vcc = Alimentation +5 V DC
  • Trig =Entrée de déclenchement de la mesure (Trigger input)
  • Echo =Sortie de mesure donnée en écho (Echo output)
  • GND = Masse de l'alimentation

 

Principe:

Le détecteur HC-SR04 utilise les ultrasons pour déterminer la distance à laquelle se trouve un objet. Son champ de vision est de 90° environ selon l'environnement. Si une impulsion de plus de 10µS est détectée (sur l'entrée TRIGGER), alors le capteur envoie une série de 8 impulsions à ultrason de 40kHZ et attends le réfléchissement du signal. Lorsque celui-ci est détecté, une impulsion de durée proportionnelle à la distance mesurée (Plage de mesure : 2 cm à 400 cm) est envoyée sur la sortie "Echo".

ultrason poubelle

Calcul
Distance parcourue par le son : vitesse du son (340 m/s) * temps aller retour du son /2
Distance = 340m/s * t en sec / 2 = 34000 cm /1000000µs * t en µs /2 = 17 /1000 * t
T = Distance * 1000 /17 = D * 58,82 en µs
Distance en cm = temps propagation en µs / 58

Croquis Arduino IDE:(mesure de distance)


#define TRIG 5 //pin 5 carte UNO pour envoyer pulse de 10µs
#define ECHO 4 // pin 4 carte UNO pour recevoir pulse Echo
const long TIMEOUT = 30000UL; // 30ms soit mesure à moins de 6m25
unsigned long distance; //
void setup() {
 pinMode(TRIG,OUTPUT); // configuration pin TRIG en sortie, elle sera raccordée à l'entrée Trig du capteur HC-SR04
 pinMode(ECHO,INPUT); // configuration pin ECHO en entrée, elle sera raccordée à la sortie Echo du capteur HCSR04
 digitalWrite(TRIG, LOW); //Elle doit être à 0 au démarrage
 Serial.begin(115200);
}
void loop() {
 //création impulsion trigger de 10µs
 digitalWrite(TRIG,HIGH);
 delayMicroseconds(10);
 digitalWrite(TRIG, LOW);
 //mesure de la distance en cm capteur / cible
 distance = pulseIn(ECHO, HIGH, TIMEOUT)/58;
 //Affichage mesure toutes les 0.5 seconde
 Serial.print("Distance = ");
 Serial.print(distance);
 Serial.println(" cm");
 delay(500);
}

Pour voir les distances en cm, on peut voir le moniteur série (Outils--> Moniteur série(Ctr+Maj+M) ou cliquer sur l'icône moniteur série

 

moniteur série
moniteur série

Allumage d'une LED suivant une condition:

On va ajouter les instructions permettant d'allumer la LED (Verte) si la distance est >10 et la LED (Rouge) dans le cas contraire.

Croquis Arduino IDE :(allumage des LED suivant une condition)

#define TRIG 5 //pin 5 carte UNO pour envoyer pulse de 10µs
#define ECHO 4 // pin 4 carte UNO pour recevoir pulse Echo
const long TIMEOUT = 30000UL; // 30ms soit mesure à moins de 6m25
unsigned long distance; //
const int ledPinVert = 22;
const int ledPinRouge = 23;
const int seuil=10;
void setup() {
 pinMode(ledPinVert, OUTPUT);
 pinMode(ledPinRouge, OUTPUT);
 pinMode(TRIG,OUTPUT); // configuration pin TRIG en sortie, elle sera raccordée à l'entrée Trig du capteur HC-SR04
 pinMode(ECHO,INPUT); // configuration pin ECHO en entrée, elle sera raccordée à la sortie Echo du capteur HCSR04
 digitalWrite(TRIG, LOW); //Elle doit être à 0 au démarrage
 Serial.begin(115200);
}
void loop() {
 //création impulsion trigger de 10µs
 digitalWrite(TRIG,HIGH);
 delayMicroseconds(10);
 digitalWrite(TRIG, LOW);
 //mesure de la distance en cm capteur / cible
 distance = pulseIn(ECHO, HIGH, TIMEOUT)/58;
 //Affichage mesure toutes les 0.5 seconde
 Serial.print("Distance = ");
 Serial.print(distance);
 Serial.println(" cm");
 delay(500);
 if (distance>seuil) {
  digitalWrite(ledPinRouge, LOW);   // Eteindre le LED Rouge(LOW)
digitalWrite(ledPinVert, HIGH);   // Allumer le LED Vert (HIGH)
 }
 else
 {
  digitalWrite(ledPinVert, LOW);   // Eteindre le LED Vert(LOW)
digitalWrite(ledPinRouge, HIGH);   // Allumer le LED Rouge (HIGH)  
  }
 }

Projet 6:

poubelleEnvoyer une notification Push sur son smartphone si l'espace vide dans une poubelle<=10cm


Montage:

On va garder le même montage que le projet 5:poubelle ultrason esp32

Principe:

Le détecteur HC-SR04 utilise les ultrasons pour déterminer la distance à laquelle se trouve un objet. Lorsque la distance >10 une lampe LED verte s'allume, mais si la distance <=10 une lampe LED Rouge est allumée et une notification est envoyée au smartphone indiquant que la poubelle est pleine et la distance vide qui reste.

pushbullet + pushingbox

Création de notification :

Sur un mobile, une notification push est un message d’alerte reçu via une application que l’on peut ouvrir, supprimer, autoriser ou bloquer. Pour créer une notification on va suivre les étapes suivantes:

Etape1: Configuration du service PushBullet

Pushbullet est un service Internet permettant d'envoyer des SMS, de gérer des notifications et d'envoyer des fichiers entre vos appareils mobiles et votre ordinateur.
Sur le PC : On va commencer par créer un compte gratuit en utilisant un compte existant google ou facbook (sign up with google ou facebook).
https://www.pushbullet.com/ Lien
Sur le smartphone :
Dans google Play chercher PushBullet puis l'installer puis choisir le même compte utilisé sur le PC.
pushbullet install
Sur le PC :
Dans le menu Devices sur pc vous devez retrouver votre smartphone.pushbullet mobile
Ouvrir le menu settings puis cliquer sur Create access Token
pushbullet token
Copier le Token généré dans un fichier texte pour une utilisation ultérieure.
pushbullet token number

Etape2: Configuration de Pushingbox :

PushingBox est un service de notification dans le cloud.
On va créer un compte gratuit en utilisant un compte existant google (login with google).
https://www.pushingbox.com/ Lien
Aller à My services en suite Add a service sélectionner à partir de la liste Pushbullet puis Select this service
pushbullet token number
dans la fenêtre suivante spécifier un nom puis coller pushbullet Token (précédemment enregistré dans un fichier texte) dans Access Token puis valider.pushbullet token number
Ouvrir le menu My scenarios saisir le nom de votre scénario puis cliquer sur Add
pushbullet token number
Cliquer sur le bouton Add an action puis Add an action with this service
pushbullet token number
Dans la fenêtre suivante saisir le titre et le contenu du message de notification, notez l'utilisation de $parma$ qui est une variable qui va contenir la mesure capturée.pushbullet token number
Il ne reste que noter le Device ID puisqu'on va l'utiliser dans notre programme par la suite.pushbullet token number
Le code suivant permet de se connecter au WiFi spécifié puis si la distance mesurée est <=10 alors envoi une requette HTTP à l'API pushingbox relatif au Device ID ce qui va permettre d'envoyer une notification à votre smartphone.

 

Croquis Arduino IDE:


#include <WiFi.h>
#include <WiFiMulti.h>

WiFiMulti WiFiMulti;
WiFiClient client;
// Pushingbox API
char *api_server = "api.pushingbox.com";
char *deviceId = "v5FE1TE24CA4C6FB32";

#define TRIG 5 //pin 5 carte UNO pour envoyer pulse de 10µs
#define ECHO 4 // pin 4 carte UNO pour recevoir pulse Echo
const long TIMEOUT = 30000UL; // 30ms soit mesure à moins de 6m25
unsigned long distance; //
const int ledPinVert = 22;
const int ledPinRouge = 23;
const int seuil=10;

void setup()
{
 pinMode(ledPinVert, OUTPUT);
 pinMode(ledPinRouge, OUTPUT);
 pinMode(TRIG,OUTPUT); // configuration pin TRIG en sortie, elle sera raccordée à l'entrée Trig du capteur HC-SR04
 pinMode(ECHO,INPUT); // configuration pin ECHO en entrée, elle sera raccordée à la sortie Echo du capteur HCSR04
 digitalWrite(TRIG, LOW); //Elle doit être à 0 au démarrage
 Serial.begin(115200);
    delay(10);

    // We start by connecting to a WiFi network
    WiFiMulti.addAP("SSID_WIFI", "PASSWORD_WIFI");

    Serial.println();
    Serial.println();
    Serial.print("En attente du  WiFi... ");

    while(WiFiMulti.run() != WL_CONNECTED) {
        Serial.print(".");
        delay(500);    
    }

    Serial.println("");
    Serial.println("WiFi connecté");
    Serial.println("addresse IP: ");
    Serial.println(WiFi.localIP());

    delay(500);
}

void loop()
{
   //création impulsion trigger de 10µs
 digitalWrite(TRIG,HIGH);
 delayMicroseconds(10);
 digitalWrite(TRIG, LOW);
 //mesure de la distance en cm capteur / cible
 distance = pulseIn(ECHO, HIGH, TIMEOUT)/58;
 //Affichage mesure toutes les 0.5 seconde
 Serial.print("Distance = ");
 Serial.print(distance);
 Serial.println(" cm");
 delay(500);
 
 if (distance>seuil) {
  digitalWrite(ledPinRouge, LOW);   // Eteindre le LED Rouge(LOW)
  digitalWrite(ledPinVert, HIGH);   // Allumer le LED Vert (HIGH)

 }
 else
 {
  digitalWrite(ledPinVert, LOW);   // Eteindre le LED Vert(LOW)
  digitalWrite(ledPinRouge, HIGH);   // Allumer le LED Rouge (HIGH)  
  sendNotification(distance);
  
  }
 }
 
void sendNotification(int param) {
    Serial.println("Sending notification to " + String(api_server));
    if (client.connect(api_server, 80)) {
        Serial.println("Connecté au serveur");
        String message = "devid=" + String(deviceId) +
            "&param=" + String(param) +
            "";
        client.print("POST /pushingbox HTTP/1.1\n");
        client.print("Host: api.pushingbox.com\n");
        client.print("Connection: close\n");
        client.print("Content-Type: application/x-www-form-urlencoded\n");
        client.print("Content-Length: ");
        client.print(message.length());
        client.print("\n\n");
        client.print(message);
    }
    client.stop();
    Serial.println("Notification envoyée!");
}

Projet 7:

Led firebaseCommander une lampe LED par Internet via une application Android. (éteindre et allumer)

Montage:

Carte ESP32 , lampe LED, resistance de 220 Ω

led esp32

Principe:

Commander une lampe LED par par Internet via une application Android.

  • On va utiliser le service Firebase.google.com pour stocker l'état de la lampe LED (allumé "1" , éteinte "0") ,
  • La carte ESP32 se connecte à firebase et suivant l'état trouvé dans la base, la LED s'éteint ou s'allume,
  • Une application android permet de changer l'état de la lampe LED dans Firebase par conséquent allumer et éteindre la LED.

 

led esp32

Etape 1: Création de la base de données :

On va utiliser la base de données Firebase.
Firebase est un ensemble de services d'hébergement pour n'importe quel type d'application (Android, iOS, Javascript, Node.js, Java, Unity, PHP, C++ ...). Il propose d'héberger en NoSQL et en temps réel des bases de données, du contenu, de l'authentification sociale (Google, Facebook, Twitter et Github), et des notifications, ou encore des services, tel que par exemple un serveur de communication temps réel

led esp32

sources: https://fr.wikipedia.org/wiki/Firebase

Accéder au site firebase.google.com , puis cliquer sur Accéder à la console en utilisant un compte google lien .

Une fois connecté, choisir Créer un projet
Créer projet firebase


Commencer par donner un nom à votre projet, puis suivre les étapes pour cliquer finalement sur Créer un projet:
Créer projet firebase
Une fois le projet créé cliquer sur Continuer
Créer projet firebase
Une fois la page de votre projet est affichée, cliquer sur l'icône en forme de roue dentée pour accéder au Paramètres du projet
Créer projet firebase
Dans la page des paramètres cliquer sur l'onglet Comptes de service puis dans le menu à gauche sur Codes secrets de la base de données , maintenant copier le code secret de la base puisqu'on va l'utiliser par la suite dans le programme.
Créer projet firebase
Pour créer la base de données : Revenir au menu Développer puis cliquer sur Database et enfin sur Créer une base de données:
Créer projet firebase
Puis choisir Commencer en mode test:
Créer base firebase
Ensuite choisir l'emplacement de la base de données:
Créer base firebase
Ensuite choisir Realtime Database:
Créer base firebase
enfin copier l'adresse de la base de données (sans https:// et sans le slash à la fin) puisqu'on va l'utiliser par la suite dans le programme:
Créer base firebase

 

Etape 2: Création de l'application mobile :

On va utiliser App inventor.
App Inventor pour Android est une application développée par Google. Elle est actuellement entretenue par le Massachusetts Institute of Technology (MIT). Elle simplifie le développement des applications sous Android et le rend accessible même pour les novices et ceux qui ne sont pas familiers avec les langages de programmation. Elle est basée sur une interface graphique similaire à Scratch et à celle de StarLogo TNG . Grâce à son interface entièrement graphique et à l'absence totale de ligne de code, elle est particulièrement adaptée à l'initiation des enfants à la programmation, et ce dès l'école primaire.

App inventor

source: https://fr.wikipedia.org/wiki/App_Inventor

Accéder au site appinventor.mit.edu , puis cliquer sur Create Apps! en utilisant un compte google lien .

App inventor
Une fois connecté, choisir le menu Projects puis Start new project
Créer projet firebase


Commencer par donner un nom à votre projet, :
App inventor
Ajouter un bouton à l'application (en glissant-déposant sur l'interface ) puis modifier le texte du bouton à ON
Créer projet app inventor
Refaire la même étape pour créer un autre bouton OFF, puis saisir le code secret de la base (firebase token)et le lien à la base(FirebaseURL) déja copiés lors de la création de la base de données dans Firebase, laisser ProjectBucket vide pour notre cas.
Créer projet app inventor
Changer le mode (en haut et à droite de la page) de Designer à Blocs puis ajouter les blocs suivants:
Créer projet app inventor
Ouvrir le menu Construire pour générer le fichier apk correspondant à notre application android :App inventor apk
Remarque : pour tester l'application au cours de développement choisir une option du menu Construire, par exemple Compagnon AI.
App inventor Compagnon
Pour utiliser le mode Compagnon AI il faut télécharger MIT AI2 Companion sur votre smartphone.
App inventor Compagnon
Remarque: On peut voir le changement de la variable LED_STATUS dans la base de données Firebase, à chaque clic sur le bouton ON ou OFF.
firebase led status

 

Etape 3: programmation de la carte ESP32 :

Croquis Arduino IDE:

#include <WiFi.h>                   // Bibliothèque wifi pour esp32
#include <IOXhop_FirebaseESP32.h>               // Bibliothèque firebase
#define FIREBASE_HOST "esp32led-63c2f.firebaseio.com"        // adresse de la base de données dans Firebase
#define FIREBASE_AUTH "0kuMtrFgfF85Q2JuF19xozuFK65Yo7rsxxxxxxxx"               // Code secret de la base de données
#define WIFI_SSID "NOM_RESEAU_WIFI"                     
#define WIFI_PASSWORD "MOT_DE_PASSE_WIFI"                                    
String fireStatus = "0";                                   // Etat de la LED reçu de firebase
int led = 23;                                                               

void setup() {
  Serial.begin(9600);
  delay(1000);
  pinMode(led, OUTPUT);                
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);                  //essai de connexion wifi
  Serial.print("Connecting to ");
  Serial.print(WIFI_SSID);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();
  Serial.print("Connected to ");
  Serial.println(WIFI_SSID);
  Serial.print("IP Address is : ");
  Serial.println(WiFi.localIP());                          //Afficher l'adresse IP locale

  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);                     // se connecter à firebase
   Firebase.setString("LED_STATUS", "0");                      //Envoyer la valeur initiale de LED_STATUS 
}

void loop() {
  fireStatus = Firebase.getString("LED_STATUS");    // obtenir l'état de la LED (LED_STATUS) à partir de firebase
Serial.println(fireStatus);
  if (fireStatus == "1") {                         // vérifier l'état de la LED reçu de firebase
    Serial.println("Led allumée");                 
    digitalWrite(led, HIGH);                      // Allumer la LED (HIGH)
  }
  else if (fireStatus == "0") {             // vérifier l'état de la LED reçu de firebase
    Serial.println("Led eteinte");
    digitalWrite(led, LOW);                     // Eteindre la LED (LOW)
  }
  else {
    Serial.println("Erreur ! il faut envoyer ON/OFF");
  }
}

Remarque : Pour utliser les bibliothèques de firebase dans arduino IDE, il faut commencer par télécharger:
  • IOXhop_FirebaseESP32 à https://github.com/ioxhop/IOXhop_FirebaseESP32 lien direct
  • aussi ArduinoJson V5.13.3 à https://github.com/bblanchon/ArduinoJson/tree/v5.13.3 lien direct
Pour les installer, ouvrir le menu "Croquis" puis Inclure une bibliothèque puis Ajouter la bibliothèque .ZIP
firebase led status
Ensuite ouvrir le menu "Croquis" => "Inclure une bibliothèque" ==> "Gérer les bibliothèques"
firebase led status
Enfin chercher le nom de la bibliothèque dans la liste et l'installer:
firebase led status

Code MicroPython :

En utilisant Thonny IDE:

import ufirebase as firebase
import network
from machine import Pin
import gc
gc.collect()
ssid = 'NOM_WIFI'
password = 'MOT_DE_PASSE_WIFI'
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
while station.isconnected() == False:
  pass
print('connexion établie')
print(station.ifconfig())
led = Pin(22, Pin.OUT)
while True:
    led_status=firebase.get('https://esp32led-63c2f.firebaseio.com'+'/LED_STATUS')
    print (led_status)    
    if led_status == '1':
        print('LED ON')
        led.value(1)
    if led_status == '0':
        print('LED OFF')
        led.value(0) 

Remarque:On doit aussi téléverser la bibliothèque ufirebase.py et sa dépendence usseclient.py téléchargés à partir de : https://github.com/vishal-android-freak/firebase-micropython-esp32
Lien direct: master.zip

  • Brancher la carte à l'ordinateur puis démarrer le gestionnaire de périphériques pour voir sur quel port COM est connectée la carte ESP32
firmware micropython esp32
  • Dans Thonny IDE ouvrir le menu "Outils" puis "Options" enfin choisir l'onglet "Interpréteur"
    choisir l'interpréteur : Micropython (ESP32) et le port : Silicon Labs CP210x USB to UART Bridge (ici COM4)
firebase led status
  • Ouvrir les fichiers à envoyer à la carte ESP32 un à un dans Thonny IDE
  • Ouvrir le menu "Fichier" puis "Enregister sous" et choisir l'emplacement :
save thonny esp32
  • Taper le nom.py puis cliquer sur Ok:
firebase led statusRemarque : Pour téléverser des fichiers sur la carte, il faut commencer par arrêter l'exécution du programme dans Thonny IDE.

Code Python

Si vous voulez écrire un programme Python pour seulement consulter et modifier la base de données firebase sans utiliser la carte ESP32

Il faut changer le mode pour fichier Python puis installer les bibliothèques suivantes:
firebase , python_jwt , gcloud, sseclient, Crypto, pycryptodome, requests_toolbelt

  • avec commande dos on peut utliser : pip install firebase python_jwt gcloud sseclient Crypto pycryptodome requests_toolbelt
  • avec mu editor : cliquer sur la roue dentée (Administration de mu) puis choisir l'onglet Third Party Packages, suisir les bibliothèques à ajouter enfin cliquer sur OK
firebase led status
  • avec Thonny:ouvrir le menu "Outils" puis "Gérer les paquets"

Projet 8:

Led boutonAllumer une lampe LED connectée au pin23 avec un bouton poussoir connecté au GPIO15.

Montage(1):

Carte ESP32 , lampe LED, résistance de 220 Ω, bouton poussoir

bouton led esp32

Code MicroPython (1):

from time import sleep
from machine import Pin

p=Pin(23,Pin.OUT)
p15=Pin(15,Pin.IN)
while True:
    print(p15.value())
    if p15.value()==1:
        p.on()
    else :
        p.off()

NB: Après exécution du programme (1), on remarque un comportement imprévisible du port 15, dans le cas où le bouton poussoir est pressé le pin15 va recevoir 3.3v donc il est à (1) mais dans le cas ou le bouton n'est pas pressé le pin15 n'est relié à rien donc son état est non défini.

Pour corriger ce problème on peut utiliser une résistance Pull-down:

L'électricité va toujours choisir le chemin qui lui résiste le moins. Mais si elle n'a pas le choix, elle passe tout de même là où ça résiste. Nous allons donc ajouter une résistance à notre circuit. Une assez forte pour que le courant ne passe que s'il y est obligé (souvent de l'ordre de 10kΩ).

bouton led esp32

Montage(2):

Donc notre montage devient :

bouton led esp32

Remarque: si on veut l'utilisation inverse du bouton, on pourra utiliser une resistance en Pull-up:

bouton led esp32

Utilisation de la résistance pull-down interne de la carte ESP32:

On peut utiliser le montage(1) sans utiliser une resistance supplementaire, en activant la Résistance pull-down du port15 de la carte ESP32, en utilisant la commande Pin(15,Pin.IN,Pin.PULL_DOWN)

 

Croqui Arduino IDE:

 

Code MicroPython :

from time import sleep
from machine import Pin

p=Pin(23,Pin.OUT)
p15=Pin(15,Pin.IN,Pin.PULL_DOWN)
while True:
    print(p15.value())
    if p15.value()==1:
        p.on()
    else :
        p.off()

 

Rmarque: Pour éviter d'utiliser la notion de Pull-up et Pull-down, on pourra commencer par utiliser le programme(1) avec un pin qui est par défaut en pull-down par exemple GPIO12, GEPIO13, GPIO18,...

Projet 9:

Led MQTTCommander une lampe LED en utilisant le protocole MQTT. (éteindre et allumer)

Montage:

Carte ESP32 , lampe LED, resistance de 220 Ω

led esp32

Avant de commencer:

Le protocole MQTT

Lire plus...

Principe:

Commander une lampe LED par Internet en utilisant le protocole MQTT et une application android.

  1. Créer un compte sur cloudmqtt.com pour avoir un MQTT Broker sur le cloud
  2. Programmer la carte esp32 pour se connecter au MQTT broker puis s'abonner Subscribe au topic maison/bureau/lampe pour recevoir les messages de ce dernier.
    • Si message = ON alors allumer la LED sur le pin 23
    • Si message = OFF alors éteindre la LED sur le pin 23
  3. Utiliser l'application Android IoT MQTT Dashboard pour publier (Publish) sur le topic maison/bureau/lampe le message ON/OFF par conséquent allumer ou éteindre la lampe LED.
led esp32

Etape 1: Serveur MQTT :

On va utiliser un serveur MQTT sur le cloud www.cloudmqtt.com lien, pour cela on va commencer par créer un compte gratuit: Menu "Pricing" puis dans "Cute Cat FREE" cliquer sur "Get Now"

bouton led esp32

Utiliser votre compte google existant ou créer un nouveau compte sur cloudmqtt.com lien .

bouton led esp32

Une fois connecté, choisir le nom de votre projet ici on a choisi "lampe":

bouton led esp32

dans l'étape Region choisir l'emplacement du serveur , vous pouvez laisser le choix par défaut:

bouton led esp32

Un résumé contenant le plan choisi, le nom du projet et l'emplacement du serveur s'affiche, il suffit de cliquer sur Create instance pour confirmer votre choix:

bouton led esp32

Une fois l'instance crée, cliquer sur le nom pour afficher les détails:

bouton led esp32

Les détails du l'instance s'affichent, Notez : Server , UserPassword et Port , on va les utiliser dans notre programme par la suite.

bouton led esp32

Voir aussi l'onglet WEBSOCKET UI qu'on va utiliser pour envoyer un message ou pour afficher les messages réçus.

bouton led esp32

Etape 2: Programmation de la carte ESP32 (Réception des messages) :

Allumer la LED branché sur le GPIO23 si message envoyé sur le broker est égale ON et l'éteindre dans le cas si le message envoyé est OFF.

Code MicroPython :

En utilisant Thonny IDE:

main.py

import network
from mqtt import MQTTClient
import machine
import time
from machine import Pin
import gc
gc.collect()

ssid = 'NOM_WIFI'
password = 'MOT_DE_PASSE_WIFI'

def settimeout(duration): 
    pass


station = network.WLAN(network.STA_IF)

station.active(True)
station.connect(ssid, password)

while station.isconnected() == False:
  pass

print('Connection successful')
print(station.ifconfig())

print("Connected to Wifi\n")

topic_sub = b'maison/bureau/lampe'
mserver='farmer.cloudmqtt.com'

p=Pin(23,Pin.OUT)
def sub_cb(topic, msg):
  print((topic, msg))
  print(msg.decode())
  if msg.decode()=='ON':
        p.on()
  if msg.decode()=='OFF':
        p.off()



client = MQTTClient("demo", server="farmer.cloudmqtt.com", user="fizwwsid", password="RpBWoH3wZFy2", port=10193)

client.set_callback(sub_cb)
client.connect()
client.subscribe(topic_sub)
print('Connected to %s MQTT broker, subscribed to %s topic' % (mserver, topic_sub))
  
while True:
     new_message = client.check_msg()

Remarque:On doit aussi téléverser boot.py et la bibliothèque mqtt.py téléchargés à partir de : https://github.com/pycom/pycom-libraries/tree/master/examples/mqtt
Lien direct: boot.py et mqtt.py (clic droit sur le lien puis enregistrer le lien sous)

NB:Si l'erreur "IndexError: list index out of rang" s'affiche, alors au lieu d'exécuter à partir de Thonny après téléversement des fichiers, appuyer simplement sur le bouton EN(Enable) de la carte ESP32 pour la redémarrer.

Pour tester le programme, aller dans l'onglet WEBSOCKET UI du site www.cloudmqtt.com, puis envoyer un message pour allumer la lampe.

bouton led esp32

Après envoi:

bouton led esp32

La lampe LED s'allume.

Etape 3: Utilisation d'une application mobile pour contrôler la LED:

Pour contrôler la LED à travers le MQTT Broker, on va utiliser l'application android IoT MQTT Dashboard :

Commencer par télécharger IoT MQTT Dashboard puis l'installer sur votre smartphone.

IoT MQTT Dashboard

Une fois installée, ouvrir l'application, puis cliquer sur le + en bas à droite de l'écran pour créer une nouvelle connexion à un MQTT Broker:

bouton led esp32

Une fois la connexion créée, cliquer dessus pour s'abonner (Subscribe) à un topic pour voir les messages publiés.

bouton led esp32

Puis choisir l'onglet PUBLISH pour publier un message sur un Topic.

bouton led esp32

Pour allumer la lampe LED , il faut écrire ON puis cliquer sur le bouton PUBLISH, pour éteindre la lampe LED , il faut écrire OFF puis cliquer sur le bouton PUBLISH, et pour voir les messages publiés il suffit de réouvrir l'onglet SUBSCRIBE

Remarque: Pour faciliter le contrôle de la lampe, on pourra utiliser à la place du type texte, le type switch:

bouton led esp32

NB:Pour se connecter/déconnecter , il suffit de cliquer sur l'icône connect

Annexe:Utilisation de la carte ESP32 pour publier des messages :

On peut aussi utiliser la carte ESP32 pour publier des messages sur un serveur MQTT en utilisant le programme suivant

Programmation de la carte ESP32 (envoi) :

Code MicroPython :

En utilisant Thonny IDE:

main.py

import network
from mqtt import MQTTClient
import machine
import time

ssid = 'NOM_WIFI'
password = 'MOT_DE_PASSE_WIFI'

def settimeout(duration): 
    pass


station = network.WLAN(network.STA_IF)

station.active(True)
station.connect(ssid, password)

while station.isconnected() == False:
  pass

print('Connection successful')
print(station.ifconfig())


print("Connected to Wifi\n")
client = MQTTClient("demo", server="farmer.cloudmqtt.com", user="fizwwsid", password="RpBWoH3wZFy2", port=10193)
client.settimeout = settimeout
client.connect()

while True:
     print("Envoyer ON")
     client.publish("maison/bureau/lampe", "ON")
     time.sleep(2)
     print("Envoyer OFF")
     client.publish("maison/bureau/lampe", "OFF")
     time.sleep(2)

Remarque:On doit aussi téléverser boot.py et la bibliothèque mqtt.py téléchargés à partir de : https://github.com/pycom/pycom-libraries/tree/master/examples/mqtt
Lien direct: boot.py et mqtt.py (clic droit sur le lien puis enregistrer le lien sous)

NB:Si l'erreur "IndexError: list index out of rang" s'affiche, alors au lieu d'exécuter à partir de Thonny après téléversement des fichiers, appuyer simplement sur le bouton EN(Enable) de la carte ESP32 pour la redémarrer.

  • Brancher la carte à l'ordinateur puis démarrer le gestionnaire de périphériques pour voir sur quel port COM est connectée la carte ESP32
firmware micropython esp32
  • Dans Thonny IDE ouvrir le menu "Outils" puis "Options" enfin choisir l'onglet "Interpréteur"
    choisir l'interpréteur : Micropython (ESP32) et le port : Silicon Labs CP210x USB to UART Bridge (ici COM4)
firebase led status
  • Ouvrir les fichiers à envoyer à la carte ESP32 un à un dans Thonny IDE
  • Ouvrir le menu "Fichier" puis "Enregistrer sous" et choisir l'emplacement :
save thonny esp32
  • Taper le nom.py puis cliquer sur Ok:
firebase led statusRemarque : Pour téléverser des fichiers sur la carte, il faut commencer par arrêter l'exécution du programme dans Thonny IDE.

-On peut voir les messages reçus dans l'onglet WEBSOCKET UI du site www.cloudmqtt.com.

 

Projet 10:

température MQTTCommunication entre 2 objets connectés en utilisant le protocole MQTT. (Allumer des LED et actionner un moteur suivant une température capturée)

Principe:

Communication entre 2 objets connectés en utilisant le protocole MQTT. (Allumer des LED et actionner un moteur suivant une température capturée par un détecteur de température DHT11)

Principe 2 clients mqtt

Etapes:

  1. Créer un compte sur cloudmqtt.com pour avoir un MQTT Broker sur le cloud
  2. Programmer la carte esp32 (Client1 MQTT) pour se connecter au MQTT broker puis publier publish dans le topic maison/temperature un messages contenant la température capturée par le DHT11(capteur de température et d'humidité).
  3. Programmer la carte esp32 (Client2 MQTT) pour se connecter au MQTT broker puis s'abonner Subscribe au topic maison/température pour recevoir les messages (contenant la température capturée).
    • Si température < 14 alors allumer la LED Bleu sur le pin 5
    • Si température >= 14 et <26 alors allumer la LED verte sur le pin 18
    • Si température >26 alors allumer la LED rouge sur le pin 19 et actionner le moteur sur le pin15
  4. Utiliser l'application Android IoT MQTT Dashboard pour consulter la température sur le topic maison/temperature .

Montage:

mqtt montage

Carte ESP32 , lampe LED, resistance de 220 Ω

mqtt montage

Etape 1: Serveur MQTT :

On va utiliser un serveur MQTT sur le cloud www.cloudmqtt.com lien, pour cela on va commencer par créer un compte gratuit: Menu "Pricing" puis dans "Cute Cat FREE" cliquer sur "Get Now"

bouton led esp32

Utiliser votre compte google existant ou créer un nouveau compte sur cloudmqtt.com lien .

bouton led esp32

Une fois connecté, choisir le nom de votre projet ici on a choisi "temperature":

bouton led esp32

dans l'étape Region choisir l'emplacement du serveur , vous pouvez laisser le choix par défaut:

bouton led esp32

Un résumé contenant le plan choisi, le nom du projet et l'emplacement du serveur s'affiche, il suffit de cliquer sur Create instance pour confirmer votre choix:

bouton led esp32

Une fois l'instance crée, cliquer sur le nom pour afficher les détails:

bouton led esp32

Les détails du l'instance s'affichent, Notez : Server , UserPassword et Port , on va les utiliser dans notre programme par la suite.

bouton led esp32

Voir aussi l'onglet WEBSOCKET UI qu'on va utiliser pour afficher les messages réçus(température).

bouton led esp32

Etape 2: Programmation de la carte ESP32 (Client 1 MQTT) :

Code MicroPython :

En utilisant Thonny IDE:

main.py

from machine import Pin
import network
from mqtt import MQTTClient
import time
import dht 
import gc
gc.collect()
ssid = 'NOM_WIFI'
password = 'MOT_DE_PASSE_WIFI'
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
while station.isconnected() == False:
  pass
print('connexion établie')
print(station.ifconfig())

def settimeout(duration): 
    pass
client = MQTTClient("demo", server="farmer.cloudmqtt.com",
                    user="fizwwsid", password="RpBWoH3wZFy2", port=10193)
client.settimeout = settimeout
client.connect()

sensor = dht.DHT11(Pin(4))

while True:
    sensor.measure()
    temp = sensor.temperature()
    print("Envoyer la température=",temp)
    client.publish("maison/temperature", str(temp))
    time.sleep(5)
     

Remarque:On doit aussi téléverser boot.py et la bibliothèque mqtt.py téléchargés à partir de : https://github.com/pycom/pycom-libraries/tree/master/examples/mqtt
Lien direct: boot.py et mqtt.py (clic droit sur le lien puis enregistrer le lien sous)

NB:Si l'erreur "IndexError: list index out of rang" s'affiche, alors au lieu d'exécuter à partir de Thonny après téléversement des fichiers, appuyer simplement sur le bouton EN(Enable) de la carte ESP32 pour la redémarrer.

Pour tester le programme, aller dans l'onglet WEBSOCKET UI du site www.cloudmqtt.com, pour voir les messages envoyés par la carte ESP32.

cloudmqtt temperature esp32

Etape 3: Programmation de la carte ESP32 (Client 2 MQTT) :

Code MicroPython :

En utilisant Thonny IDE:

main.py

import network
from mqtt import MQTTClient
import machine
import time
from machine import Pin
import gc
gc.collect()

ssid = 'NOM_WIFI'
password = 'MOT_DE_PASSE_WIFI'
def settimeout(duration): 
    pass
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
while station.isconnected() == False:
    pass
print('Connection successful')
print(station.ifconfig())
print("Connecté au Wifi\n")
topic_sub = b'maison/temperature'
mserver='farmer.cloudmqtt.com'

rouge=Pin(19,Pin.OUT)
vert=Pin(18,Pin.OUT)
bleu=Pin(5,Pin.OUT)
moteur=Pin(15,Pin.OUT)
def sub_cb(topic, msg):
    print((topic, msg))
    temp=int(msg.decode())
    if temp<14:
        bleu.value(1)
        rouge.value(0)
        vert.value(0)
        moteur.value(0)
    elif temp<26:
        bleu.value(0)
        rouge.value(0)
        vert.value(1)
        moteur.value(0)
    else:
        bleu.value(0)
        rouge.value(1)
        vert.value(0)
        moteur.value(1)
        
client = MQTTClient("demo", server="farmer.cloudmqtt.com",
                    user="fizwwsid", password="RpBWoH3wZFy2", port=10193)

client.set_callback(sub_cb)
client.connect()
client.subscribe(topic_sub)
print('Connected to %s MQTT broker, subscribed to %s topic' % (mserver, topic_sub))
  
while True:
     new_message = client.check_msg()

Remarque:On doit aussi téléverser boot.py et la bibliothèque mqtt.py téléchargés à partir de : https://github.com/pycom/pycom-libraries/tree/master/examples/mqtt
Lien direct: boot.py et mqtt.py (clic droit sur le lien puis enregistrer le lien sous)

NB:Si l'erreur "IndexError: list index out of rang" s'affiche, alors au lieu d'exécuter à partir de Thonny après téléversement des fichiers, appuyer simplement sur le bouton EN(Enable) de la carte ESP32 pour la redémarrer.

  • Brancher la carte à l'ordinateur puis démarrer le gestionnaire de périphériques pour voir sur quel port COM est connectée la carte ESP32
firmware micropython esp32
  • Dans Thonny IDE ouvrir le menu "Outils" puis "Options" enfin choisir l'onglet "Interpréteur"
    choisir l'interpréteur : Micropython (ESP32) et le port : Silicon Labs CP210x USB to UART Bridge (ici COM4)
firebase led status
  • Ouvrir les fichiers à envoyer à la carte ESP32 un à un dans Thonny IDE
  • Ouvrir le menu "Fichier" puis "Enregistrer sous" et choisir l'emplacement :
save thonny esp32
  • Taper le nom.py puis cliquer sur Ok:
firebase led statusRemarque : Pour téléverser des fichiers sur la carte, il faut commencer par arrêter l'exécution du programme dans Thonny IDE.

Etape 4: Utilisation d'une application mobile pour afficher la température:

Pour afficher ka température capturée et envoyée vers le MQTT Broker, on va utiliser l'application android IoT MQTT Dashboard :

Commencer par télécharger IoT MQTT Dashboard puis l'installer sur votre smartphone.

IoT MQTT Dashboard

Une fois installée, ouvrir l'application, puis cliquer sur le + en bas à droite de l'écran pour créer une nouvelle connexion à un MQTT Broker:

bouton led esp32

Une fois la connexion créée, cliquer dessus pour s'abonner (Subscribe) à un topic pour voir les messages publiés.

bouton led esp32

NB:Pour se connecter/déconnecter , il suffit de cliquer sur l'icône connect

Remarque:Il vaut mieux ne pas connecter le moteur directement sur la carte, il faut utiliser le montage suivant:

bouton led esp32

 

Projet 11:

LedCommander une lampe LED par Bluetooth (éteindre et allumer)

Montage:

Carte ESP32 , lampe LED, resistance de 220 Ω

led esp32

Principe:

On va utiliser l'application Android Serial Bluetooth Terminal pour envoyer via le Bluetooth le texte "on" ou "off" à une carte ESP32 pour allumer/éteindre une diode led connectée sur le pin23 dans notre exemple.

led esp32

Croquis Arduino IDE:

 

Code MicroPython :


from machine import Pin, Timer
from time import sleep_ms
import ubluetooth
import gc
gc.collect()


class BLE():
    def __init__(self, name):   
        self.name = name
        self.ble = ubluetooth.BLE()
        self.ble.active(True)

        self.led = Pin(2, Pin.OUT)
        self.timer1 = Timer(0)
        self.timer2 = Timer(1)
        
        self.disconnected()
        self.ble.irq(self.ble_irq)
        self.register()
        self.advertiser()

    def connected(self):        
        self.timer1.deinit()
        self.timer2.deinit()

    def disconnected(self):        
        self.timer1.init(period=1000, mode=Timer.PERIODIC, callback=lambda t: self.led(1))
        sleep_ms(200)
        self.timer2.init(period=1000, mode=Timer.PERIODIC, callback=lambda t: self.led(0))   

    def ble_irq(self, event, data):
        if event == 1:
            '''Central disconnected'''
            self.connected()
            self.led(1)
        
        elif event == 2:
            '''Central disconnected'''
            self.advertiser()
            self.disconnected()
        
        elif event == 3:
            '''New message received'''            
            buffer = self.ble.gatts_read(self.rx)
            message = buffer.decode('UTF-8').strip()
            print(message)            
            if message == 'on':
                led.value(1)
                print('led', led.value())
                ble.send('led ON')
            if message == 'off':
                led.value(0)
                print('led OFF')
                ble.send('led OFF')            
           
    def register(self):        
        # Nordic UART Service (NUS)
        NUS_UUID = '6E400001-B5A3-F393-E0A9-E50E24DCCA9E'
        RX_UUID = '6E400002-B5A3-F393-E0A9-E50E24DCCA9E'
        TX_UUID = '6E400003-B5A3-F393-E0A9-E50E24DCCA9E'
            
        BLE_NUS = ubluetooth.UUID(NUS_UUID)
        BLE_RX = (ubluetooth.UUID(RX_UUID), ubluetooth.FLAG_WRITE)
        BLE_TX = (ubluetooth.UUID(TX_UUID), ubluetooth.FLAG_NOTIFY)
            
        BLE_UART = (BLE_NUS, (BLE_TX, BLE_RX,))
        SERVICES = (BLE_UART, )
        ((self.tx, self.rx,), ) = self.ble.gatts_register_services(SERVICES)

    def send(self, data):
        self.ble.gatts_notify(0, self.tx, data + '\n')

    def advertiser(self):
        name = bytes(self.name, 'UTF-8')
        self.ble.gap_advertise(100, bytearray('\x02\x01\x02') + bytearray((len(name) + 1, 0x09)) + name)
        
# test
led = Pin(23, Pin.OUT)
ble = BLE("ESP32")