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 :
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 :
Pour programmer la carte on peut utiliser les environnements de développement suivants:
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.
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:
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
On peut utiliser un simulateur en ligne pour la carte ESP32, sur le site :https://wokwi.com/
lien simulateur MicroPython on ESP32
lien Exemple de simulation MicroPython on ESP32 (LED BLINK)
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)
Utiliser le site wokwi.com pour faire le montage et écrire le script python:
https://tinyurl.com/projet2-feu-circulation lien
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
Utiliser le site wokwi.com pour faire le montage et écrire le script python:
https://tinyurl.com/projet3-alarme lien
La plaque d'essai contient plusieurs trous, permettant de relier des composants facilement, pour tester un montage.
Les trous encerclés en vert sont liés.
Le cas de la plaque à essai 840 points:
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é.
Remarque : Il faut utiliser une résistance (par exemple de 220 Ω), pour ne pas risquer de griller la LED.
Exemple de montage:
Exemple de montage utilisant une carte ESP32 NodeMCU, une diode LED et une résistance (220 Ω):
from time import sleep
from machine import Pin
led=Pin(23,Pin.OUT)
while True:
led.value(not led.value())
sleep(1)
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).
Exemple de code utilisant le PWM:
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)
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 :
Exemple de montage utilisant un bouton poussoir, une carte ESP32 NodeMCU, une diode LED et une résistance (220 Ω):
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:
Deux exemples d'utilisation de ce module:
Le circuit interne du module bouton poussoir pour les deux cas d'utilisation:
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.
Dans notre cas on va utiliser un buzzer actif.
Exemple de montage utilisant un bouton poussoir, une carte ESP32 NodeMCU et un buzzer:
On va reprendre le même code de bouton poussoir.
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 de température et d’humidité DHT11.Permettant de mesurer des températures entre 0° et 50°.
Exemple de montage utilisant une carte ESP32 NodeMCU, et un capteur DHT11:
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)
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.
Exemple de montage utilisant une carte ESP32 NodeMCU, et un servomoteur:
Le branchement de servomoteur:
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.
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, ...
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)
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".
Exemple de montage utilisant une carte ESP32 NodeMCU, et un capteur ultrason HC-SR04:
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.
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
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).
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)
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 ).
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.
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 :
Exemple de montage utilisant une carte ESP32 NodeMCU, et un module LDR:
On peut reprendre le même code que l'LDR:
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):
Exemple de montage utilisant une carte ESP32 NodeMCU, et un module LDR:
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
from machine import Pin
from time import sleep
p4=Pin(4,Pin.IN)
while True:
print(p4.value())
sleep(0.1)
Faire clignoter une LED (avec un intervalle de 1 seconde) branché sur la carte ESP32 sur le port 23.
Carte ESP32 , lampe LED, resistance de 220 Ω
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.
// 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
}
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()
Allumer une lampe LED par le toucher du pin GPIO4.
Carte ESP32 , lampe LED, resistance de 220 Ω
// 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);
}
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)
Carte ESP32 , lampe LED, resistance de 220 Ω
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.
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()
Commander une lampe par wifi (éteindre et allumer)
Carte ESP32 , lampe, relais 5V
Un relais est un commutateur automatique permettant de commander un circuit à courant fort avec un signal à courant faible.
Entrées:
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)
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()
Allumer une LED suivant le niveau de remplissage d'une poubelle (LED verte(espace vide >10cm)) (LED rouge(espace vide <=10cm) ).
Carte ESP32 , capteur ultrason HC-S004, 2 resistances 220 Ω, 2 LED rouge et vert
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)Broches de connexion (capteur ultrason)
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".
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
#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
On va ajouter les instructions permettant d'allumer la LED (Verte) si la distance est >10 et la LED (Rouge) dans le cas contraire.
#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)
}
}
Envoyer une notification Push sur son smartphone si l'espace vide dans une poubelle<=10cm
On va garder le même montage que le projet 5:
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.
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:
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.
Sur le PC :
Dans le menu Devices sur pc vous devez retrouver votre smartphone.
Ouvrir le menu settings puis cliquer sur Create access Token
Copier le Token généré dans un fichier texte pour une utilisation ultérieure.
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
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.
Ouvrir le menu My scenarios saisir le nom de votre scénario puis cliquer sur Add
Cliquer sur le bouton Add an action puis Add an action with this service
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.
Il ne reste que noter le Device ID puisqu'on va l'utiliser dans notre programme par la suite.
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.
#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) +
"¶m=" + 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!");
}
Commander une lampe LED par Internet via une application Android. (éteindre et allumer)
Carte ESP32 , lampe LED, resistance de 220 Ω
Commander une lampe LED par par Internet via une application Android.
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
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
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.
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 .
Une fois connecté, choisir le menu Projects puis Start new project
#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");
}
}
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
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
Allumer une lampe LED connectée au pin23 avec un bouton poussoir connecté au GPIO15.
Carte ESP32 , lampe LED, résistance de 220 Ω, bouton poussoir
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Ω).
Donc notre montage devient :
Remarque: si on veut l'utilisation inverse du bouton, on pourra utiliser une resistance en Pull-up:
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)
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,...
Commander une lampe LED en utilisant le protocole MQTT. (éteindre et allumer)
Carte ESP32 , lampe LED, resistance de 220 Ω
Commander une lampe LED par Internet en utilisant le protocole MQTT et une application android.
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"
Utiliser votre compte google existant ou créer un nouveau compte sur cloudmqtt.com lien .
Une fois connecté, choisir le nom de votre projet ici on a choisi "lampe":
dans l'étape Region choisir l'emplacement du serveur , vous pouvez laisser le choix par défaut:
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:
Une fois l'instance crée, cliquer sur le nom pour afficher les détails:
Les détails du l'instance s'affichent, Notez : Server , User, Password et Port , on va les utiliser dans notre programme par la suite.
Voir aussi l'onglet WEBSOCKET UI qu'on va utiliser pour envoyer un message ou pour afficher les messages réçus.
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.
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.
Après envoi:
La lampe LED s'allume.
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.
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:
Une fois la connexion créée, cliquer dessus pour s'abonner (Subscribe) à un topic pour voir les messages publiés.
Puis choisir l'onglet PUBLISH pour publier un message sur un Topic.
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:
NB:Pour se connecter/déconnecter , il suffit de cliquer sur l'icône
On peut aussi utiliser la carte ESP32 pour publier des messages sur un serveur MQTT en utilisant le programme suivant
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.
-On peut voir les messages reçus dans l'onglet WEBSOCKET UI du site www.cloudmqtt.com.
Communication entre 2 objets connectés en utilisant le protocole MQTT. (Allumer des LED et actionner un moteur suivant une température capturée)
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)
Carte ESP32 , lampe LED, resistance de 220 Ω
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"
Utiliser votre compte google existant ou créer un nouveau compte sur cloudmqtt.com lien .
Une fois connecté, choisir le nom de votre projet ici on a choisi "temperature":
dans l'étape Region choisir l'emplacement du serveur , vous pouvez laisser le choix par défaut:
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:
Une fois l'instance crée, cliquer sur le nom pour afficher les détails:
Les détails du l'instance s'affichent, Notez : Server , User, Password et Port , on va les utiliser dans notre programme par la suite.
Voir aussi l'onglet WEBSOCKET UI qu'on va utiliser pour afficher les messages réçus(température).
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.
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.
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.
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:
Une fois la connexion créée, cliquer dessus pour s'abonner (Subscribe) à un topic pour voir les messages publiés.
NB:Pour se connecter/déconnecter , il suffit de cliquer sur l'icône
Remarque:Il vaut mieux ne pas connecter le moteur directement sur la carte, il faut utiliser le montage suivant:
Commander une lampe LED par Bluetooth (éteindre et allumer)
Carte ESP32 , lampe LED, resistance de 220 Ω
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.
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")