Etuve Box / tool pour les levées de pâtes

Suite à quelques aides sur le forum, je viens de finir mon projet et je poste ici ma création.

L'idée est de contrôler dans un espace fermé la température afin de mettre sous étuve des pâtes, que ça soit pâte à pain, pizza, cake, gaufres, brioches ! bref toute pâte qui a de la levure fraiche de boulanger (ou sèche).

Jusqu'à présent j'ai toujours fait ça à l'arrache en espérant qu'il fasse pas trop froid, mais j'ai passé le cap et direction arduino pour réaliser mon projet.

Le matos :
• 1 sonde robuste allant de 0° 1024°
• 1 arduino R3
• un écran LCD question d’afficher les résultats
• un encodeur pour pouvoir paramétrer les réglages
• un relais pour contrôler l’alimentation de la lampe en 220v de la lampe.

Les outils
• Arduino IDE
• 1 imprimante 3D
• 1 découpe laser
• Fusion 360 pour la modélisation

Ma box est utilisé avec deux modes différents.

mode 1 (le principal) Etuve BOX.
j'ai besoin de contrôler la température dans un espace fermé (four ou boite isotherme). pour cela j'ai une lampe à filament (elle joue un rôle de générateur de chaleur) qui est dans le four ainsi que ma sonde pour mesurer tout ça.
via l'encodeur, je peux définir un seuil en degré que je souhaite atteindre. en dessous de ce seuil la lampe s'allume et chauffe le four, une fois arrivé au seuil haut, la lampe s'éteint.

Pour que la lampe ne fasse pas stroboscope, j'ai un gap de 1° en dessous lequel la lampe se rallume. ça sera à affiner quand les températures seront plus fraîches mais pour l'instant ça fonctionne parfaitement.

via l'écran je check en temps réel tout ce qui se passe et je peux si je veux changer ma valeur de référence via l'encodeur.

mode 2 check température
J'ai deux fours à la maison dont un petit qui je pense n'est pas très précis alors ce mode permet juste de vérifier si le four est à bonne température et au besoin d'ajuster la température pour coller au mieux pendant une cuisson. Par exemple pour du pain c'est bien de pas être en dessus de 240° ou à l'inverse pour un flan au bain marie c'est mieux de pas dépasser 150° sinon y a des bulles d'air dans le flan. bref c'est un super vérificateur :slightly_smiling_face:

N'ayant pas trop l'habitude de présenter des projets, je poste quelques photos, je passe un lien de mon blog de cuisine où j'ai mis plus de photos et de détails, mais moins technique ^^ la technique c'est pour ici :slightly_smiling_face:

et voilà le final en utilisation !

voici le lien sur mon blog pour avoir plus de photos

En espérant que le projet vous plaise ! et merci encore à la communauté sans qui je serai encore en train de galérer à faire fonctionner mon encodeur :rofl:

bravo :slight_smile:
(encore mieux si le code était posté ici)

Salut !
Sympa ! bravo à toi, très belle réalisation (qui par ailleurs m'a donnée la motivation de finir les miennes :wink:) !
Comme le dit @J-M-L, peux tu poster ton code et, si c'est possible, le schéma (c'est dur à voir sur les photos) ?
(je trouve juste un truc à redire à ta superbe boite : l'utilisation pour un projet fini d'une carte Arduino UNO - j'aurai mis une NANO ou une pro mini... Mais bon, c'est juste mon point :slightly_smiling_face:)

Bonnes bidouilles
Amitiés
R-P7

voici le code. j'ai une animation perso que j'ai réduite dans cette version ^^


#include <Wire.h>
#include <hd44780.h>                        // main hd44780 header
#include <hd44780ioClass/hd44780_I2Cexp.h>  // i2c expander i/o class header
#include <Encoder.h>                        // https://www.pjrc.com/teensy/td_libs_Encoder.html
#include <Toggle.h>
#include "max6675.h"  // https://github.com/Dlloydev/Toggle
//création LCD
const uint8_t nbCols = 20;
const uint8_t nbRows = 4;
hd44780_I2Cexp lcd;
//config des pins
int relais = 2;
int thermoDO = 4;
int thermoCS = 5;
int thermoCLK = 6;
const byte encoderSWPin = 9;

Toggle encoderSwitch;
const byte encoderCLKPin = 10;
const byte encoderDTPin = 11;
//////
Encoder encoder(encoderDTPin, encoderCLKPin);
MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

//config des variable
int tempRef;
int page = 1;
unsigned long previousMillis = 0;    // Variable pour stocker le temps précédent
const unsigned long interval = 500;  // pour pallier le delay qui fait planter l'encoder


bool encoderChanged() {
  long newPosition = encoder.read() >> 2;
  if (newPosition != tempRef) {
    tempRef = newPosition;
    return true;
  }
  return false;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
  encoderSwitch.begin(encoderSWPin);
  //Serial.begin(9600);


  pinMode(relais, OUTPUT);
  int result = lcd.begin(nbCols, nbRows);
  encoder.write(28 << 2);
  intro();
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
void intro() {
  lcd.backlight();
  lcd.clear();
  delay(100);
  lcd.setCursor(0, 0);
  lcd.print(" / / Etuve  Box / / ");
  lcd.setCursor(4, 2);
  lcd.print("V1 23/09/203 ");
    lcd.setCursor(0, 1);
   lcd.print("   by Yvan Bonnin   ");
  delay(100);

  lcd.backlight();
  lcd.clear();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void mySwitch() {
  encoderSwitch.poll();
  if (encoderSwitch.onPress()) {
    page++;
    if (page == 3) { page = 1; }
  }
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void myEncoder() {

  if (encoderChanged()) {
    lcd.setCursor(13, 1);
    lcd.print(F("  "));  // on efface l'ancienne valeur
  }
  if (page == 1) {
    lcd.setCursor(13, 1);
    lcd.print(tempRef);  // on met la nouvelle valeur
  }
  if (tempRef <= 9) {  // symbole °
    lcd.setCursor(14, 1);
    lcd.print((char)223);
    lcd.setCursor(15, 1);
    lcd.print(" ");
  } else {  // symbole ° décalé de 1 en dessous de 10
    lcd.setCursor(15, 1);
    lcd.print((char)223);
  }
  if (tempRef <= 0 || tempRef >= 95) {  // limite des températures acceptées
    encoder.write(29 << 2);
  }
  lcd.setCursor(16, 1);
  lcd.print("/ /");
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {

  mySwitch();


  //Serial.println(tempRef);
  if (page == 1) {
    myEncoder();
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval) {
      // Lire la température en Celsius depuis le capteur MAX6675
      double temperature = thermocouple.readCelsius();
      // Formater la température avec une décimale
      String formattedTemperature = String(temperature, 1);

      lcd.setCursor(0, 0);
      lcd.print(" / / Mode  Etuve / / ");
      lcd.setCursor(0, 1);
      lcd.print("/ / Objectif ");
      lcd.setCursor(0, 2);
      lcd.print(" Temp Four : ");
      lcd.print(formattedTemperature);  // Afficher la température avec une décimale
      lcd.write((char)223);
      // Allumer ou éteindre la Lampe en fonction de la température
      if (temperature <= tempRef - 1) {
        digitalWrite(relais, LOW);  // Allumer la Lampe
        lcd.setCursor(0, 3);
        lcd.print("  Lampe en chauffe ");
      }
      if (temperature >= tempRef) {
        digitalWrite(relais, HIGH);  // Éteindre la Lampe
        lcd.setCursor(0, 3);
        lcd.print("                    ");
      }
      previousMillis = currentMillis;
    }
  } else {

    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval) {
      // Lire la température en Celsius depuis le capteur MAX6675
      double temperature = thermocouple.readCelsius();
      // Formater la température avec une décimale
      String formattedTemperature = String(temperature, 1);

      lcd.setCursor(0, 0);
      lcd.print(" Temperature check  ");
      lcd.setCursor(0, 1);
      lcd.print("/ / / / / / / / / / ");
      lcd.setCursor(0, 2);
      lcd.print(" Temp Four : ");
      lcd.print(formattedTemperature);  // Afficher la température avec une décimale
      lcd.write((char)223);
      lcd.setCursor(0, 3);
      lcd.print("/ / / / / / / / / / ");
      digitalWrite(relais, HIGH);  // Éteindre la Lampe
      previousMillis = currentMillis;
    }
  }
}

et voilà un schéma rapidement fait avec le brochage

en espérant que ça aide :slightly_smiling_face:

Cool :slight_smile: merci

Merci, j'ai fait ça en mode rapidos mais tou c'est bien goupillé au final !

j'en avais pas sous la main ! mais je pense faire un update et ajouter un piezzo pour informer s y a une surchauffe pendant l'étuve, comme c'est déjà serré j'en profiterai pour basculer sur un nano :slight_smile:

Oui, c'est une bonne idée !
Bonne bidouille ! :grin:

Amitiés
R-P7

Très belle réalisation et fort utile à qui était un jour confronté à une levé mal maitrisé :slight_smile:

Pourquoi, quelle apport trouve tu, avec une Nano dans ce cas précis ?

Grave ! j'ai déjà eu des mauvaises surprises avec le beurre qui commence à suer de la pâte pendant une levée de brioche, du coup t'as loupé et tu peux tout refaire !

J'ai déjà fait une levée trop forte en température et mon pain brioché avait une odeur d'acétone du à une température trop élevée qui développe des bactéries "sauvages" présentes dans le levain mais non actives (de ce que j'ai compris à l'époque de mes recherches).

je pense que c'est parce que mon projet est petit et ne demande pas trop de ressource, du coup un nano aurait pu faire l'affaire. ça reste ce que j'en ai déduit :smile:

Je ne crois pas, d'un point de vue capacité de calcul et nombre de broche, elles sont identiques.
Si je ne me trompe pas.

Le prix et l’encombrement sont moindres et c’est plus simple pour souder

Bonjour @J-M-L

Oui, c'est à ça que je pensais.

Bonjour @terwal
Elles sont basées sur le même micro-contrôleur (ATmega328). Elles ont exactement la même puissance de calcul et la même quantité de mémoire (UNO ==> 2KB SRAM, 32KB FLASH, 1KB EEPROM, et NANO ==> 2KB SRAM, 32KB FLASH, 1KB EEPROM). Leurs différences sont principalement :

  • le prix (24€ pour une UNO - voir Store Arduino officielle - et 21,60€ pour une NANO - voir Store Arduino officielle), même si ils ne sont pas notablement différents l'un de l'autre.

  • la taille (UNO : 74 x 53 x 15 mm, et NANO : 45 x 18 mm) - c'est surtout sur ce critère que je me basai ma critique

  • et enfin le nombre de pins analogiques (ou plutôt PWM pour être précis :wink:, leurs rôle principal étant d'être des pins digitales, elles ne passent en mode "analogique" qu'avec l'appel de la fonction analogRead() ou analogWrite(). Mais je m'égare...). La UNO ne possède que 6 entrées analogiques 10 bits, alors que alors que la NANO en possède 8.

Pour moi, la NANO est plus adaptée pour des projets finis. Mais je ne pense pas qu'il soit nécessaire de poursuivre ça ici (un topic à déjà été créer pour ça : Nano, Uno, ou Mega?)

Bonne journée

Amitiés
R-P7

Je parle bien pour ce projet, pas en général.
Le prix, j'ai quand même l'impression que c'est sensiblement le même ordre de prix en officiel ou en clone.
L'encombrement ne me semble rien apporter de plus.
la difficulté de souder, sur la carte choisi, ne me parais pas non plus si significatif.

c'est ce que j'ai constaté aussi

Oui, c'est ce que j'ai présumé, mais cela est-il vraiment pertinent dans son cas ?

Je pensais plus a un argument de cette ordre, mais encore une fois, cela est-il pertinent dans ce cas?

Encore une fois, ma remarque ne portait sur une généralité, mais sur un cas pratique.

Comme je ne connais pas en détaille la différence entre les différentes cartes Arduino(essentiellement car j'aurais plutôt tendance à prendre un ESP32 :slight_smile: ), je me demandais si ta critique était fondé sur un détail que je ne connais pas.

Quitte à choisir, la PRO MINI est pour moi un bon choix pour l'intégration sur un projet. pas de fioritures et possibilité de basse consommation et on les trouve par lot de 10 à moins de 3€ pièce (et ça a augmenté)

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.