Système de contrôle d'accès intelligent avec déverrouillage par reconnaissance faciale
Composants et fournitures
| Composant | Quantité |
|---|---|
| Module WiFi Bolt IoT | 1 |
| Arduino UNO | 1 |
| Buzzer | 1 |
| Plaque d'essai grande taille | 1 |
| Boutons poussoirs 12 mm | 2 |
| LED rouge 5 mm | 1 |
| LED verte 5 mm | 1 |
| Résistance 10 kΩ | 2 |
| Résistance 330 Ω | 2 |
| Fils de liaison | 1 jeu |
Outils
- Pistolet à colle chaude
Applications et services
- Bolt IoT Cloud
- Windows 10
- Microsoft Visual Studio (C#)
- Arduino IDE
- Face++ (API reconnaissance faciale)
À propos du projet
Projet réalisé dans le cadre du défi Innovate et de la formation IoT d'Internshala. Objectif : ajouter une sécurité biométrique à une porte/placard en utilisant Arduino, Bolt IoT et la reconnaissance faciale via Face++.
Une application Windows Forms (C#) gère :
- L'inscription/suppression de visages autorisés (stockage local Base64)
- La vérification faciale (API Face++ Compare, seuil 80 % confiance)
- La communication avec le module Bolt (API Bolt Cloud) pour commander l'Arduino
- Un thread d'écoute du bouton « sonnette » (broche D4 du Bolt)
Architecture
- Application PC (C#) : webcam → détection visage (AForge.NET) → comparaison Face++ → commande Bolt Cloud.
- Bolt WiFi Module : interface sans fil vers Arduino (DigitalMultiWrite sur D0/D3, lecture D4).
- Arduino UNO : pilote servomoteur (verrou), LEDs d'état, buzzer, boutons physiques (sonnette + verrouillage manuel).
Flux des événements
1. Appui sur la sonnette (bouton physique)
Bouton → D4 Bolt HIGH → Thread C# détecte → Capture webcam → Vérification Face++ → Si confiance > 80 % : Bolt D3 HIGH → Arduino déverrouille (servo 0°, LED verte, bip). Sinon : rien (porte reste verrouillée).
2. Verrouillage manuel (bouton physique ou appli)
Bolt D0 HIGH → Arduino verrouille (servo 120°, LED rouge, bip long).
Application Windows Forms (C#)
Bibliothèques : AForge.NET (webcam), Bolt IoT API .NET (client non officiel), Newtonsoft JSON.
Configuration API
private readonly string BOLT_DEVICE_ID = "BOLTXXXXXX";
private readonly string BOLT_API_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
private readonly string FPP_API_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
private readonly string FPP_API_SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
Bolt myBolt = new Bolt(BOLT_API_KEY, BOLT_DEVICE_ID);
Verrouillage / Déverrouillage via Bolt
private async Task LockDoor() {
var cfg = new MultiPinConfig();
cfg.AddPinState(DigitalPins.D0, DigitalStates.High); // Lock
cfg.AddPinState(DigitalPins.D3, DigitalStates.Low); // Unlock
await myBolt.DigitalMultiWrite(cfg);
cfg = new MultiPinConfig();
cfg.AddPinState(DigitalPins.D0, DigitalStates.Low);
cfg.AddPinState(DigitalPins.D3, DigitalStates.Low);
await myBolt.DigitalMultiWrite(cfg);
}
private async Task UnlockDoor() {
var cfg = new MultiPinConfig();
cfg.AddPinState(DigitalPins.D0, DigitalStates.Low);
cfg.AddPinState(DigitalPins.D3, DigitalStates.High);
await myBolt.DigitalMultiWrite(cfg);
cfg = new MultiPinConfig();
cfg.AddPinState(DigitalPins.D0, DigitalStates.Low);
cfg.AddPinState(DigitalPins.D3, DigitalStates.Low);
await myBolt.DigitalMultiWrite(cfg);
}
Ajout / suppression visages de confiance
// Ajout (après détection visage via Face++ Detect)
ImageDataList.Add(ImageToBase64((Image)PreviewBox.Image.Clone()));
NameList.Add(FaceNameTextBox.Text.Trim());
Properties.Settings.Default.Base64ImageData = ImageDataList;
Properties.Settings.Default.FaceNames = NameList;
Properties.Settings.Default.Save();
// Suppression
NameList.RemoveAt(index); ImageDataList.RemoveAt(index);
Properties.Settings.Default.FaceNames = NameList;
Properties.Settings.Default.Base64ImageData = ImageDataList;
Properties.Settings.Default.Save();
Vérification faciale (Face++ Compare)
WebClient client = new WebClient();
byte[] response = client.UploadValues("https://api-us.faceplusplus.com/facepp/v3/compare",
new NameValueCollection() {
{ "api_key", FPP_API_KEY }, { "api_secret", FPP_API_SECRET },
{ "image_base64_1", face1Base64 }, { "image_base64_2", face2Base64 }
});
string confidence = JObject.Parse(Encoding.UTF8.GetString(response))["confidence"].ToString();
// Si confidence > 80 → UnlockDoor()
Thread écoute sonnette
while (ListenForBell) {
Response r = await myBolt.DigitalRead(DigitalPins.D4);
if (r.Value == "1") { RingBell_Click(null, null); Thread.Sleep(2000); }
Thread.Sleep(2000); // Éviter quota API
}
Code Arduino (BoltDoorLock.ino)
#include <Servo.h>
#define ServoPin 4
#define LockSignalPin 2 // D0 Bolt → verrouiller
#define UnLockSignalPin 3 // D3 Bolt → déverrouiller
#define BellButtonPin 5 // Bouton sonnette physique
#define LockButtonPin 8 // Bouton verrouillage manuel
#define RingBellSignalPin 6 // D4 Bolt ← signal sonnette
#define BuzzerPin 7
#define GreenLedPin 9
#define RedLedPin 10
Servo myServo;
void setup() {
pinMode(LockSignalPin, INPUT);
pinMode(UnLockSignalPin, INPUT);
pinMode(BellButtonPin, INPUT);
pinMode(LockButtonPin, INPUT);
pinMode(BuzzerPin, OUTPUT);
pinMode(RedLedPin, OUTPUT);
pinMode(GreenLedPin, OUTPUT);
pinMode(RingBellSignalPin, OUTPUT);
digitalWrite(RedLedPin, LOW);
digitalWrite(GreenLedPin, LOW);
digitalWrite(RingBellSignalPin, LOW);
myServo.attach(ServoPin);
Serial.begin(9600);
}
void loop() {
int lock = digitalRead(LockSignalPin);
int unlock = digitalRead(UnLockSignalPin);
if (lock == HIGH) { // Verrouillage commande Bolt
myServo.write(120);
digitalWrite(GreenLedPin, LOW); digitalWrite(RedLedPin, HIGH);
digitalWrite(BuzzerPin, HIGH); delay(1000); digitalWrite(BuzzerPin, LOW); delay(1000);
}
else if (unlock == HIGH) { // Déverrouillage commande Bolt
myServo.write(0);
digitalWrite(GreenLedPin, HIGH); digitalWrite(RedLedPin, LOW);
delay(2000);
}
// Sonnette physique
if (digitalRead(BellButtonPin) == HIGH) {
digitalWrite(RingBellSignalPin, HIGH); // Signale au Bolt
// Bip sonnette
digitalWrite(BuzzerPin, HIGH); delay(100); digitalWrite(BuzzerPin, LOW); delay(20);
digitalWrite(BuzzerPin, HIGH); delay(200); digitalWrite(BuzzerPin, LOW); delay(100);
digitalWrite(BuzzerPin, HIGH); delay(200); digitalWrite(BuzzerPin, LOW); delay(1500);
digitalWrite(RingBellSignalPin, LOW);
}
// Verrouillage manuel local
if (digitalRead(LockButtonPin) == HIGH) {
myServo.write(120);
digitalWrite(GreenLedPin, LOW); digitalWrite(RedLedPin, HIGH);
digitalWrite(BuzzerPin, HIGH); delay(1000); digitalWrite(BuzzerPin, LOW);
}
}
Mécanisme de verrouillage (bricolage)
Utilisation d'un goulot de bouteille (fixé sur l'axe du servo) + bouchon (fixé sur la gâche de la porte) reliés par un fil nylon. Rotation du servo → traction/relâchement du fil → verrouillage/déverrouillage. Adaptable à toute gâche.

Schéma Fritzing

Ressources
- Projet Visual Studio complet :
Facebolt Doorlock.zip(à extraire, mettre vos clés API, compiler, lancer) - Bibliothèque cliente Bolt IoT .NET : GitHub
- Démonstration vidéo : voir lien original
Processus de fabrication
- Construire un contrôleur domotique 433 MHz avec Sensorflare et Raspberry Pi
- Construire une porte à verrouillage automatique intelligente via la proximité Bluetooth de votre smartphone
- Suivi de visage Pan/Tilt temps réel sur Raspberry Pi – Guide pratique
- Barman intelligent : Construisez votre propre station de cocktails alimentée par Raspberry Pi
- Optimiser le serrage des boulons avec les outils de couple – stratégies éprouvées pour un préchargement fiable
- Maximiser le ROI de vos investissements IoT : guide pratique
- Sécurisez vos appareils intelligents : meilleures pratiques pour la sécurité IoT
- Achats intelligents : fusionner l'IA et l'expertise humaine
- Serrure connectée WiFi avec Arduino et ESP8266 – Déverrouillage par smartphone