Système intelligent basé sur Raspberry Pi 4 • Surveillance en temps réel • Alertes automatiques • Paiement intégré
Travail de Fin d’Études – INRACI 2025
Gaspard Delcourt
Ce projet est né d’une expérience concrète dans un bar de club de football où la gestion manuelle générait des erreurs et des ruptures fréquentes.
L’objectif : créer une solution complète, simple et peu coûteuse qui automatise la surveillance des stocks, facilite le travail en caisse et garantit la cohérence des données grâce à un serveur dédié.
Ce TFE met en pratique toutes les compétences acquises durant les 3 années de bachelier en informatique à l’INRACI.
Ce projet est mon Travail de Fin d’Études à l’INRACI en 2025.
Le projet a été conçu pour un bar de football, afin de faciliter la gestion.
L’objectif principal : automatiser la caisse et le suivi des stocks.
Le système est piloté par un Raspberry Pi 4 avec 8 Go de RAM.
Un capteur de température permet de surveiller le refroidissement des frigos.
Ce projet met en pratique tous les cours étudiés pendant la formation.
Raspberry Pi 4 avec 8 Go de RAM.
Capteurs à ultrasons HC-SR04 (plusieurs).
Écran tactile 10 pouces pour la caisse.
Terminal de paiement pour les clients.
Vieux PC utilisé comme serveur Windows.
Surveillance en temps réel du niveau des bouteilles.
Alertes automatiques lorsque les stocks sont bas.
Les données sont sauvegardées automatiquement sur le serveur.
La caisse tactile est gérée avec Power Apps.
Le paiement par TPE est intégré directement.
Historique des ventes et des stocks disponible à tout moment.
Le serveur utilise Windows Server 2022.
Active Directory est configuré pour gérer les utilisateurs.
Les sauvegardes de la base de données sont automatiques.
Les données des capteurs sont sécurisées.
Le style de fonctionnement est simple, adapté à une buvette.
Le Raspberry Pi contrôle tous les capteurs.
Le capteur de température mesure en continu la température des frigos.
L’écran tactile et le TPE sont connectés au Pi.
Les données sont envoyées via le protocole MQTT.
Le Pi communique avec les capteurs et le serveur.
On peut accéder au système à distance avec VNC Viewer.
Le Raspberry Pi est le cerveau central du projet.
Le serveur assure la sauvegarde et la sécurité des données.
Power Apps sert d’interface utilisateur pour la caisse et l’administration.
Microsoft Power Apps pour la caisse et l’administration.
VNC Viewer pour contrôler le Raspberry Pi à distance.
Le système fonctionne de manière entièrement autonome.
Les ruptures de stock sont évitées.
Le temps de travail est considérablement réduit.
Tous les cours ont été appliqués dans ce projet.
Le coût total du matériel reste inférieur à 400 €.
Gaspard Delcourt
gaspard.delcourt@inraci.be
Travail de Fin d’Études – INRACI 2025
Soutenance prévue en juin 2025
Le projet a bien commencé et plusieurs étapes importantes ont déjà été réalisées. Tout d’abord, le matériel principal, un Raspberry Pi 4 avec 8 Go de RAM, a été reçu et configuré. L’OS Debian a été téléchargé depuis le site officiel et installé avec succès, ce qui constitue la base sur laquelle tout le système sera développé.
Ensuite, la structure de la base de données a été créée pour gérer les différents éléments du projet : les produits, les stocks, les ventes et les alertes. Chaque table a été définie pour assurer un suivi fiable et automatisé des informations nécessaires au fonctionnement du système.
Une API a été mise en place pour permettre à l’application Power Apps de communiquer avec la base de données du Raspberry Pi. Cette API sert d’intermédiaire entre l’application et la base de données, permettant d’envoyer et de recevoir des informations sur les ventes, les niveaux de stock et les alertes. Cela garantit une interaction sécurisée et automatisée entre le Raspberry Pi et l’interface utilisateur.
Les premières fonctionnalités ont été testées : l’enregistrement des ventes et la récupération de la liste des produits fonctionnent correctement. Cela signifie que l’application peut déjà interagir avec la base de données et que les informations sont bien centralisées sur le Raspberry Pi.
Les prochaines étapes incluent l’intégration du capteur de température pour surveiller le refroidissement des frigos, la connexion complète avec Power Apps pour finaliser la caisse automatisée, et le développement des alertes automatiques pour éviter les produits hors température ou les ruptures de stock.
Pour vous donner une idée concrète de ce qui a été développé jusqu’ici, voici les principaux codes du projet : SQL pour la base de données et Python pour l’API.
-- Activer les clés étrangères (optionnel mais recommandé)
PRAGMA foreign_keys = ON;
-- Table des produits
CREATE TABLE produits (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nom TEXT NOT NULL,
prix REAL NOT NULL,
seuil_alerte INTEGER DEFAULT 5
);
-- Table des stocks
CREATE TABLE stocks (
id_produit INTEGER PRIMARY KEY,
quantite INTEGER NOT NULL,
derniere_maj DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (id_produit) REFERENCES produits(id) ON DELETE CASCADE
);
-- Table des ventes
CREATE TABLE ventes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date_vente DATETIME DEFAULT CURRENT_TIMESTAMP,
total REAL NOT NULL
);
-- Table des lignes de vente
CREATE TABLE lignes_vente (
id_vente INTEGER NOT NULL,
id_produit INTEGER NOT NULL,
quantite INTEGER NOT NULL,
prix_au_moment REAL NOT NULL,
FOREIGN KEY (id_vente) REFERENCES ventes(id) ON DELETE CASCADE,
FOREIGN KEY (id_produit) REFERENCES produits(id) ON DELETE CASCADE
);
-- Table des alertes
CREATE TABLE alertes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
id_produit INTEGER NOT NULL,
message TEXT NOT NULL,
date_alerte DATETIME DEFAULT CURRENT_TIMESTAMP,
statut TEXT DEFAULT 'active',
FOREIGN KEY (id_produit) REFERENCES produits(id) ON DELETE CASCADE
);
from flask import Flask, request, jsonify
import sqlite3
from datetime import datetime
import os
app = Flask(__name__)
DB_PATH = "/home/pi/buvette/buvette.db"
if not os.path.exists(DB_PATH):
raise FileNotFoundError(f"Base de données introuvable : {DB_PATH}")
def get_db_connection():
conn = sqlite3.connect(DB_PATH)
conn.row_factory = sqlite3.Row
return conn
@app.route('/vente', methods=['POST'])
def enregistrer_vente():
data = request.get_json()
if not data or 'id_produit' not in data or 'quantite' not in data:
return jsonify({"erreur": "Champs manquants"}), 400
id_produit = int(data['id_produit'])
quantite = int(data['quantite'])
conn = get_db_connection()
cur = conn.cursor()
cur.execute("SELECT nom, prix FROM produits WHERE id = ?", (id_produit,))
produit = cur.fetchone()
if not produit:
conn.close()
return jsonify({"erreur": "Produit introuvable"}), 404
cur.execute("SELECT quantite FROM stocks WHERE id_produit = ?", (id_produit,))
stock_row = cur.fetchone()
if stock_row['quantite'] < quantite:
conn.close()
return jsonify({"erreur": "Stock insuffisant"}), 400
total = produit['prix'] * quantite
cur.execute("INSERT INTO ventes (total) VALUES (?)", (total,))
vente_id = cur.lastrowid
cur.execute("INSERT INTO lignes_vente (id_vente, id_produit, quantite, prix_au_moment) VALUES (?, ?, ?, ?)",
(vente_id, id_produit, quantite, produit['prix']))
cur.execute("UPDATE stocks SET quantite = ?, derniere_maj = ? WHERE id_produit = ?",
(stock_row['quantite'] - quantite, datetime.now(), id_produit))
conn.commit()
conn.close()
return jsonify({"message": "Vente enregistrée", "vente_id": vente_id}), 201
Le travail présenté ici est encore en cours. Certaines parties du projet, le code ou la base de données peuvent évoluer au fur et à mesure de l’avancement. Les informations affichées ne représentent pas encore la version finale du système.