3615 Café, la cafetière Minitel

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-pipo 
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é…


Répondre

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l'aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s