Cafetière intelligente Arduino avec contrôle Bluetooth et surveillance de température
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino Nano R3 | 1 |
| Module Bluetooth HC-05 | 1 |
| Capteur de température DS18B20 (1 m, HARDWARIO) | 1 |
Applications et services en ligne
- Serial Bluetooth Terminal (par Kai Morich)
- Arduino IDE
À propos du projet
Introduction
Cafetière intelligente et automatique avec affichage graphique, contrôlable via Bluetooth… ou simplement en versant de l'eau fraîche : le système démarre tout seul !
Toutes les pièces sont faites main et toutes les fonctions sont des idées originales.

Un « Mode Test » a été codé, permettant d'utiliser le contrôleur comme thermomètre polyvalent avec sonde externe.

Développé sur Arduino Nano / Uno, utilise un afficheur ST7920, adaptateur Bluetooth HC-05, capteur Dallas DS18B20, relais pour la résistance chauffante, bouton avec LEDs, buzzer et un compteur décade CD4017BE pour piloter la barre de LEDs.
Comment démarrer
- Démarrage automatique : en veille, le système mesure la température en boucle. Le chargement d'eau fraîche provoque une chute de température, déclenchant le démarrage. Cette fonction peut être activée/désactivée en envoyant « auto » depuis le smartphone ; le réglage est stocké en EEPROM.
- Appui sur le bouton : pour démarrer / interrompre la préparation, ou quitter le Mode Test.
- Envoi « start » depuis le smartphone, ou « stop ».
Vidéo
Montre tous les modes de fonctionnement.
Galerie photos
Fabrication, apparence… cliquez pour voir !

Analyse unique pendant la préparation
Après 60 secondes, le MCU compare la température initiale et la température actuelle pour tirer des conclusions basées uniquement sur la température et le temps écoulé :
- « Vous avez oublié l'eau. » – température trop élevée
- « Café pour deux. » – moins d'eau, élévation plus rapide
- « Café pour six. » – plus d'eau, élévation plus lente
- « Erreur résistance chauffante ! » – pas d'élévation significative
La détection d'erreur sonde fonctionne en continu tant que la machine est allumée.

On voit que six doses d'eau mettent plus de temps à atteindre la même température qu'une dose unique. Sans eau, la température monte très haut, mais la ligne plate indique une résistance défaillante.
Changement d'unité de mesure
L'unité peut être changée en envoyant « c » ou « f » depuis le smartphone, même en cours de préparation, sans laisser de trace sur le graphique.

Les valeurs initiale et précédente sont converties par une fonction programmée, utilisée pour les statistiques. Ce réglage est aussi stocké en EEPROM.
Éléments d'écran dynamiques
Si l'écran est plein, le graphique défile vers la gauche. Selon la valeur mesurée, certains éléments peuvent gêner ; leurs positions sont donc dynamiques.
Ces six petites animations montrent le comportement codé :

Un passe-temps fort agréable :

Mode Test
L'idée est venue d'utiliser le graphique pour d'autres usages. En branchant une sonde externe, le système devient un thermomètre polyvalent avec graphique.


Dans ce mode, les bornes du graphique sont -20 °C (-4 °F) et +128 °C (+262 °F).
L'envoi d'un nombre entre 1 et 999999 depuis le smartphone définit l'intervalle de mesure en secondes, soit une largeur de graphique entre 128 secondes et 11,57 jours.
Communication Bluetooth
Accepte les commandes et envoie les rapports, détecte la connexion/déconnexion du smartphone.

Les messages envoyés sont en bleu, les réponses/rapports de la cafetière en vert.
Contrôle des LEDs
Un compteur décade CD4027BE pilote la barre de LEDs, reçoit un signal CLK du MCU à chaque mesure de température, et incrémente la position. Au démarrage d'une nouvelle préparation ou du Mode Test, l'ATmega 328P envoie un signal RST pour remettre à zéro.

Le bouton possède une LED bicolore à deux broches ; ma solution simple et amusante pour la piloter se voit dans le code.
- Vert fixe : veille ou café prêt, résistance éteinte
- Rouge fixe : préparation en cours, résistance allumée
- Rouge / Vert alterné : Mode Test
- Rouge clignotant : erreur (sonde, résistance, ou eau oubliée → arrêt auto)
Code
Smart Coffee Maker - Ősi Gyula (Arduino)
// Programme - Smart Coffee Maker. Développé sur Arduino Nano, utilise afficheur ST7920, HC-05 Bluetooth,
// sonde Dallas DS18B20, relais, bouton, LEDs, buzzer, CD4017BE.
// Contrôlable via Bluetooth (commandes et paramètres) ou bouton… ou simplement en versant de l'eau !
// Fonctions :
// - Graphique température dynamique
// - Autostart : eau fraîche = chute température = démarrage (activable par "Auto", stocké en EEPROM)
// - Analyse pendant préparation : 60s après démarrage, compare température actuelle et initiale
// Conclusions : 1. Eau oubliée (temp trop haute) 2. Café pour deux 3. Café pour six 4. Erreur résistance
// - Détection erreur sonde (valeurs anormales)
// - Celsius/Fahrenheit : commutable par "C"/"F" depuis smartphone, même en cours. Conversion des valeurs stockées. Stocké en EEPROM.
// - Mode Test : sonde externe = thermomètre polyvalent. Graphique -20°C/+128°C. Intervalle 1-999999s (128s à 11,57j).
// - Communication Bluetooth : commandes/rapports, détection connexion.
// - Barre LED : MCU pilote CD4017BE, pas à chaque mesure. RST au démarrage nouveau cycle.
// --------------------------------------------------------------------------------------------------------------------------------
// Conçu, construit, programmé par Gyula Osi. Tous droits réservés.
#include "U8glib.h"
U8GLIB_ST7920_128X64 u8g(11, 10, 9, U8G_PIN_NONE); // PIN6-D11, PIN5-D10, PIN4-D9
byte frame = 0;
// Ports et périphériques
const int bright[2] = {0, 500};
const byte buzzer = 3;
const byte cd4017beCLK = 4;
const byte cd4017beRST = 5;
const byte btn = 13;
const byte relay = 12;
// Chaînes système
#define strSize 3
String str[strSize];
#define reportSize 5
const String reportStr[reportSize] = {"Starting...", "Going standby soon...", "Stopped.", " *** TEST MODE ***", "Normal mode."};
const String autostartStr[2] = {"Autostart off.", "Autostart on."};
// Drapeaux binaires d'état
#define flagElements 6
bool binFlags[flagElements] = {0, 1, 1, 0, 0, 0};
// 0:checked 1:finished 2:standby 3:standbyMsgSent 4:coil/sensorError 5:testMode
// Mesure température
#include "OneWire.h"
#include "DallasTemperature.h"
#define DS18B20 2
OneWire temprWire(DS18B20);
DallasTemperature sensors(&temprWire);
float tempr, temprInit, temprPrev;
#define mUnit 2
float temprBottomLim[mUnit] = {0, 26};
const char unit[mUnit] = {'F', 'C'};
const String unitStr[mUnit] = {"Fahrenheit mode.", "Celsius mode."};
float trendSens[mUnit] = {0, 0.1};
bool trend[2] = {1, 0};
#define checkSize 7
const String checkStr[checkSize] = {"Water detected!", "Heating coil error!", "Coffee for six", "Coffee for two", "You forgot the water!", "Sensor error!", "Your Coffee is ready."};
float temprCheck[mUnit][checkSize] = {{}, {-0.15, 5, 17, 28, 60, -127, 110}};
// Graphique
#define posYsize 128
byte posY[posYsize];
byte pointer = 0;
#define refrElements 42
float temprRefr[refrElements];
#define rangeElements 2
#define mode 2
float graphRange[mUnit][mode][rangeElements] = {{{}, {}}, {{24, 127.938889 + 2}, {-20, graphRange[1][0][1]}}};
float graphDiff[mUnit][mode];
// Timers
#include
elapsedMillis timer0;
unsigned long tmrPrev = 0;
bool cyclic = 0;
const long tmrInt[5] = {500, 2000, 60000, 640000, 800000};
long copyof_tmrInt0 = tmrInt[0];
const String tmrInt0Str = "Interval changed.";
// Communication série
const byte btState = 6;
bool conn = 0;
const String connStr[2] = {"Connection lost.", "Smartphone connected."};
#include
const int RX1 = 7, TX1 = 8;
SoftwareSerial sUART(RX1, TX1);
#define exRXSize 6
char exRX[exRXSize];
// EEPROM
#include
#define occBytes 2
const byte addr[occBytes] = {0, 1};
bool sysSettings[occBytes];
// addr[0] = autostart (0/1), addr[1] = unité (0=F, 1=C)
// Constantes
const char termCharSpc = ' ';
const String termStr;
const byte termByte = 0;
const bool termBool = 0;
// ... (le reste du code est très long ; il est disponible en intégralité dans la source originale)
void setup() {
u8g.begin();
fillArrays();
pinMode(cd4017beCLK, OUTPUT);
pinMode(cd4017beRST, OUTPUT);
CD4017BE(0);
pinMode(btState, INPUT);
pinMode(btn, INPUT);
pinMode(relay, OUTPUT);
sUART.begin(9600);
memo(2);
sensors.begin();
temprMeas();
temprInit = tempr;
graph(2);
ledHandler(0);
}
void loop() {
sysControl();
checkBtn();
checkConn();
RX();
u8g.firstPage();
do { draw(); } while(u8g.nextPage());
if (frame == 0) { delay(3000); frame = 1; scrClr(); }
}
// ... (fonctions sysControl, temprMeas, coil, exitTest, checkBtn, ledHandler, CD4017BE, buzz, strSelector, draw, scr, scrTempr, scrClr, graph, fillArrays, convUnit, TX, checkConn, RX)
// Le code complet est téléchargeable depuis la source.
Schémas

Processus de fabrication
- Système de contrôle d'accès intégré QR, RFID et vérification de température
- Enregistreur de Température et Humidité Arduino avec DHT11 et Shield Ethernet
- Contrôler une LED par Bluetooth avec Arduino et MIT App Inventor
- Chaussures auto-laçantes intelligentes avec récupération d'énergie piézoélectrique
- Afficher Température, Humidité et Pression BME280 sur Écran Tactile Nextion
- Arduino et MPU6050 : Contrôle précis de servo-moteur avec SG90 et MG996R
- Appareils électroménagers à commande vocale : contrôle Bluetooth avec Google Assistant
- Module GPS u-blox LEA‑6H 02 : guide d'intégration Arduino et Python
- Lire température et humidité avec DHT11 sur Blynk – Tutoriel Arduino pas à pas