
La semaine dernière, nous avons vu comment utiliser le minitel pour piloter le Raspberry Pi. Je vais maintenant vous montrer comment fabriquer la cafetière contrôlée par minitel que j’ai présenté le mois dernier à la Maker Fight de Mulhouse.

Soyons clair, le but de ce tuto n’est certainement pas de fabriquer une solution domotique (vintage) optimisée. Mais plutôt de tester la communication entre tous ces appareils, avec une application pratique et amusante.
Parce que finalement, c’est beaucoup plus simple d’appuyer directement sur les boutons de la cafetière…
Vous avez donc besoin (en plus du minitel et du Raspberry Pi) d’une cafetière modifiée et d’un Arduino. Le principe est très « simple ». Le Minitel contrôle le Raspberry Pi, qui contrôle l’Arduino, qui contrôle le relais, qui contrôle la cafetière.

Alors, vous vous dites peut être que l’Arduino n’est pas indispensable puisse qu’on peut piloter le module relais directement avec les ports GPIO du Raspberry Pi. C’est vrai, mais le but de ce projet était présenter aux visiteurs de la Maker Fight, des exemples de réalisations amusantes autour d’un Arduino et de discuter de mon livre aux visiteurs (autour d’un café).
Configuration du Raspberry Pi
Pour que l’Arduino soit reconnu, vous devez installer pySerial. Pour cela, connectez vous au Raspberry Pi (depuis le minitel ou un ordinateur) et tapez :
sudo apt-get install python-pip
sudo -H pip install pyserial
Ensuite vous pouvez créer le fichier de contrôle de l’Arduino
sudo nano cafe.py
Je vous propose 2 versions du code. La version allégée (qui fonctionne parfaitement). Et une version enrichie. Elle est un peu plus lourde, mais avec des images ASCII qui évoquent l’affichage du Minitel.
Copiez donc l’un des 2 codes suivants (clic droit) :
Version allégée
# Arduiblog, cafetiere Minitel (code Raspberry Pi)
# Emission d'un message vers l'Arduino
import serial
import serial.tools.list_ports
import os
# Selection du port de l'Arduino
arduino_ports = [
p.device
for p in serial.tools.list_ports.comports()
for x in range (0, 10)
if 'ttyUSB%d' % x in p.name or "ttyACM%d" % x in p.name]
if not arduino_ports:
raise IOError("No Arduino found")
ser = serial.Serial(
# Selectionnez la prise USB
port=arduino_ports[1], # (ou 0)
baudrate = 9600
)
# Choix du cafe et envoi du message a l'Arduino
while True:
os.system("clear")
message = raw_input("Tapez 1 (Simple tasse) ou 2 (Double tasse) et validez : ")
ser.write(message)
Version enrichie
# Emission d'un message vers l'Arduino
import serial
import serial.tools.list_ports
import os
import time
import sys
# Selection du port de l'Arduino
arduino_ports = [
p.device
for p in serial.tools.list_ports.comports()
for x in range (0, 10)
if 'ttyUSB%d' % x in p.name or "ttyACM%d" % x in p.name]
if not arduino_ports:
raise IOError("No Arduino found")
ser = serial.Serial(
# Selectionnez la prise USB
port=arduino_ports[1], # (ou 0)
baudrate = 9600
)
# Choix du cafe et envoi du message a l'Arduino
while True:
os.system("clear")
print(" _ _ _ _ ")
print(" | | (_)| | | | ")
print(" __ _ _ __ __| | _ _ _ | |__ | | ___ __ _ ___ ___ _ __ ___ ")
print(" / _` || '__|/ _` || | | || || '_ \ | | / _ \ / _` | / __|/ _ \ | '_ ` _ \ ")
print(" | (_| || | | (_| || |_| || || |_) || || (_) || (_| | _| (__| (_) || | | | | |")
print(" \__,_||_| \__,_| \__,_||_||_.__/ |_| \___/ \__, |(_)\___|\___/ |_| |_| |_|")
print(" __/ | ")
print(" |___/ @/ ")
print(" ____ __ __ _____ #@@ ")
print(" |___ \ / / /_ || ____| #@@@% ")
print(" __) | / /_ | || |__ & *@@@( ")
print(" |__ < | '_ \ | ||___ \ ,@& &@% ")
print(" ___) || (_) | | | ___) | *@@ @@ ")
print(" |____/ \___/ |_||____/ ,@ /( ")
print(" % ")
print(" &@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@, ")
print(" _____ __ __ %@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ,@@* ")
print(" / ____| / _| /_/ .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@% .@@. ")
print(" | | __ _ | |_ ___ &@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@* ")
print(" | | / _` || _|/ _ \ #@@@@@@@@@@@@@@@@@@@@@@@@@@,%@@, ")
print(" | |____| (_| || | | __/ #@@@@@@@@@@@@@@@@@@@@@@@&. ")
print(" \_____|\__,_||_| \___| @@@@@@@@@@@@@@@@@@@@@/ ")
print(" *@@@@@@@@@@@@@@@@@& ")
message = raw_input("Tapez 1 (Simple tasse) ou 2 (Double tasse) et validez : ")
ser.write(message)
if message == '1':
nbboucles = 7
elif message == '2':
nbboucles = 10
else:
sys.exit()
for i in range(1, nbboucles+1):
print("")
print("")
print(" * . / ")
print(" & % & ")
print(" .@ &, *& ")
print(" *&( ,&% (&* ")
print(" .&& && @# ")
print(" .@% && @/ ")
print(" /&. ,@* ,& ")
print(" ,& .& .& ")
print(" *&&&&&&&&&&&&&&&&&@@&&&&@@&&&&@@&&&&&&@@@@% ")
print(" &@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&* ")
print(" &@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@&@@% ")
print(" @&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@#*,(&&@( ")
print(" ,@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&( &&@ ")
print(" .&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&% ,&&&& ")
print(" %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@&@&&&, ")
print(" &@&&&&&&&&&&&&&&&&&&&&&&&&&&&&, ")
print(" (&&&&&&&&&&&&&&&&&&&&&&@&. ")
print(" .%@@&&&&&&&&&&&&@&, ")
print(" &&&&&&&&&&&&&&&&@ ")
print(" _____ __ __ ")
print(" / ____| / _|/_/ ")
print(" | | __ _| |_ ___ ___ _ __ ___ ___ _ _ _ __ ___ ")
print(" | | / _` | _/ _ \ / _ \ '_ \ / __/ _ \| | | | '__/ __| ")
print(" | |___| (_| | || __/ | __/ | | | | (_| (_) | |_| | | \__ \ _ _ _ ")
print(" \_____\__,_|_| \___| \___|_| |_| \___\___/ \__,_|_| |___/ (_) (_) (_) ")
time.sleep(10)
Vous pouvez évidement fabriquer vos propres images ASCII, en utilisant ce type de générateurs de texte ou d’images.
print(" ____ __ __ _____ ")
print(" |___ \ / / /_ || ____| ")
print(" __) | / /_ | || |__ ")
print(" |__ < | '_ \ | ||___ \ ")
print(" ___) || (_) | | | ___) | ")
print(" |____/ \___/ |_||____/ ")
print("")
print(" _____ __ __ ")
print(" / ____| / _| /_/ ")
print(" | | __ _ | |_ ___ ")
print(" | | / _` || _|/ _ \ ")
print(" | |____| (_| || | | __/ ")
print(" \_____|\__,_||_| \___| ")
print("")
print(" * . / ")
print(" & % & ")
print(" .@ &, *& ")
print(" *&( ,&% (&* ")
print(" .&& && @# ")
print(" .@% && @/ ")
print(" /&. ,@* ,& ")
print(" ,& .& .& ")
print(" ")
print(" *&&&&&&&&&&&&&&&&&@@&&&&@@&&&&@@&&&&&&@@@@% ")
print(" &@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&* ")
print(" &@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@&@@% ")
print(" @&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@#*,(&&@( ")
print(" ,@&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&( &&@ ")
print(" .&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&% ,&&&& ")
print(" %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&@&@&&&, ")
print(" &@&&&&&&&&&&&&&&&&&&&&&&&&&&&&, ")
print(" (&&&&&&&&&&&&&&&&&&&&&&@&. ")
print(" .%@@&&&&&&&&&&&&@&, ")
print(" &&&&&&&&&&&&&&&&@ ")
Code de l’Arduino
Téléverser le code suivant dans l’Arduino
// Arduiblog, cafetiere Minitel (code Arduino)
const int ALIMENTATION = 2;
const int ONOFF = 3;
const int SIMPLE_TASSE = 4;
const int DOUBLE_TASSE = 5;
const int LED_TEMOIN = 13;
// Temps avant mise en veille de la cafetière (en minutes)
const int VEILLE = 5;
// Etat de la cafetière (0 éteinte, 1 allumée)
boolean allumageCafetiere = 0;
// Stockage du contenu du message
char message = 0;
// Moment de la derniere utilisation
unsigned long derniereUtilisation;
void setup() {
Serial.begin(9600);
// Initialisation des sorties
pinMode(ALIMENTATION, OUTPUT);
pinMode(ONOFF, OUTPUT);
pinMode(SIMPLE_TASSE, OUTPUT);
pinMode(DOUBLE_TASSE, OUTPUT);
pinMode(LED_TEMOIN, OUTPUT);
// Mise hors tension de la cafetière
digitalWrite(ALIMENTATION, HIGH);
// Les 3 boutons ne sont pas appuyés
digitalWrite(ONOFF, HIGH);
digitalWrite(SIMPLE_TASSE, HIGH);
digitalWrite(DOUBLE_TASSE, HIGH);
// La LED témoin est allumée
digitalWrite(LED_TEMOIN, HIGH);
}
void loop() {
// Réception du message
if (Serial.available()>0){
message = Serial.read();
switch (message) {
// Simple tasse
case '1':
appuyer(SIMPLE_TASSE);
break;
// Double tasse
case '2':
appuyer(DOUBLE_TASSE);
break;
}
message = 0;
}
// Si la cafetière est allumée et qu'elle n'a pas été utilisée depuis longtemps
if ((millis() - derniereUtilisation) >= (VEILLE*60000) && allumageCafetiere == 1){
// Mise hors tension de la cafetière
digitalWrite(ALIMENTATION, HIGH);
// Indique que la cafetière est éteinte
allumageCafetiere = 0;
}
}
void appuyer(int bouton){
digitalWrite(LED_TEMOIN, LOW);
// Si la cafetière est éteinte
if (allumageCafetiere == 0){
// Mise sous tension de la cafetière
digitalWrite(ALIMENTATION, LOW);
delay(1000);
// Appui sur le bouton ON/OFF pour allumer la cafetière
digitalWrite(ONOFF, LOW);
delay(500);
// Relachement du bouton ON/OFF
digitalWrite(ONOFF, HIGH);
// Chauffage de l'eau dans la cuve
// Ajustez ces valeurs en fonction de votre cafetière
pause(90); // 90 secondes (1 min 30 sec)
// Indique que la cafetière est allumée
allumageCafetiere = 1;
}
// Appui sur le bouton
digitalWrite(bouton, LOW);
delay(500);
// Relachement du bouton
digitalWrite(bouton, HIGH);
// Préparation du café et chauffage de l'eau
// Ajustez ces valeurs en fonction de votre cafetière
if (bouton == SIMPLE_TASSE){
pause(70); // 70 secondes (1 min 10 sec)
}
else {
pause(100); // 100 secondes (1 min 40 sec)
}
// Mise à jour du moment de la dernière utilisation
derniereUtilisation = millis();
digitalWrite(LED_TEMOIN, HIGH);
}
void pause(int secondes){
// Faire clignoter la LED témoin en attendant. le nb de secondes indiqué
for (int i=0; i < secondes; i++){
digitalWrite(LED_TEMOIN, HIGH);
delay(500);
digitalWrite(LED_TEMOIN, LOW);
delay(500);
}
}
Branchement
Le branchement entre l’Arduino et la cafetière ressemble beaucoup aux tutos : Contrôler sa cafetière avec un Arduino et Télécommander sa cafetière). Ensuite, il suffit de relier le minitel et l’Arduino aux prises USB du Raspberry.

Préparation du café
Branchez la cafetière, le Minitel et le Raspberry Pi. Il est possible d’alimenter l’Arduino en USB (depuis le Raspberry Pi). Mais cela peut causer des redémarrage intempestifs si l’alimentation du Raspberry Pi n’est pas assez puissante pour les 2 appareils. Pour résoudre le problème, ajoutez simplement une alimentation (de 7 à 12 V) sur la prise Jack de l’Arduino.
À cette étape, la cafetière est éteinte et c’est normal puisse que l’Arduino l’allumera seulement pour préparer le café.
Connectez-vous au Raspberry Pi et lancez le programme en tapant :
sudo python cafe.py
Sélectionnez votre café (simple ou double).

La cafetière s’allume, l’eau chauffe et enfin le café coule.

Si vous avez réalisé toutes les étapes de ce tuto, je crois que vous avez bien mérité une petite pause café…