{"id":4779,"date":"2026-06-15T12:08:18","date_gmt":"2026-06-15T10:08:18","guid":{"rendered":"https:\/\/miniprojets.net\/?p=4779"},"modified":"2026-06-15T12:11:28","modified_gmt":"2026-06-15T10:11:28","slug":"enregistreur-de-temperature-pour-four-a-pain-opensource-avec-esp-wroom-32-dht22-max6675-et-carte-sd","status":"publish","type":"post","link":"https:\/\/miniprojets.net\/index.php\/2026\/06\/15\/enregistreur-de-temperature-pour-four-a-pain-opensource-avec-esp-wroom-32-dht22-max6675-et-carte-sd\/","title":{"rendered":"OvenOpenMoniteur: Enregistreur de temp\u00e9rature pour four \u00e0 pain OpenSource avec ESP-WROOM-32, DHT22, MAX6675 et Carte SD"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Nous souhaitons cr\u00e9er ici un enregistreur de temp\u00e9ratures, avec quatre thermosondes de type K et un DHT22. Ce miniprojet s\u2019inscrit dans un travail de th\u00e8se sur la comparaison \u00e9nerg\u00e9tique des fours \u00e0 pain en boulangerie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nous souhaitons comparer le cycle entier de trois fours \u00e0 pain, de la chauffe et \u00e0 la d\u00e9chauffe. Il s\u2019agit de trois fours aux vecteurs \u00e9nerg\u00e9tiques diff\u00e9rents&nbsp;: \u00e9lectrique, bois-\u00e9nergie, et concentration solaire.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019objectif de cette installation est de comparer le temps de mont\u00e9e en temp\u00e9rature de chaque four, le temps de cuisson d\u2019un pain, le plateau de temp\u00e9rature (saturation), la descente de temp\u00e9rature pendant l\u2019enfournement, le temps de d\u00e9chauffe, etc. De m\u00eame, nous souhaitons corr\u00e9ler le cycle de temp\u00e9rature avec l\u2019activit\u00e9 des boulanger\u00b7\u00e8res.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019installation compos\u00e9e de 4 thermocouples et d\u2019un capteur mesurant la temp\u00e9rature et l\u2019humidit\u00e9 ambiante. Elle peut \u00eatre utilis\u00e9e pour un four, mais aussi pour prendre la mesure d\u2019autres \u00e9quipements (r\u00e9frig\u00e9rateur e.g.).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nous proposons ici de partager la construction de notre installation sous forme de tutoriel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le code source et le typon pour le mat\u00e9riel final seront disponibles \u00e0 la fin de cet article ainsi qu&#8217;\u00e0 ce lien.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/gricad-gitlab.univ-grenoble-alpes.fr\/ferrarijprojects\/ovenopenmonitor\">https:\/\/gricad-gitlab.univ-grenoble-alpes.fr\/ferrarijprojects\/ovenopenmonitor<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> Si vous faites un copier\/coller du code pr\u00e9sent dans cette page, les sources sont sous licence<strong>\u00a0CC-BY-NC-SA<\/strong>\u00a0<a href=\"https:\/\/creativecommons.org\/licenses\/by-nc-sa\/3.0\/fr\/\">https:\/\/creativecommons.org\/licenses\/by-nc-sa\/3.0\/fr\/<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"460\" height=\"161\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image.png\" alt=\"\" class=\"wp-image-4781\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image.png 460w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-300x105.png 300w\" sizes=\"auto, (max-width: 460px) 100vw, 460px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Partie 1&nbsp;: Cahier des charges&nbsp;<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Avoir 4 thermocouples pour la mesure de temp\u00e9rature, r\u00e9sistant \u00e0 plus de 300\u00b0C, mesurant au moins 2 m de long (2 sondes plac\u00e9es \u00e0 l\u2019avant et le fond du four&nbsp;; 2 sondes plac\u00e9es dans 2 pains diff\u00e9rents)<\/li>\n\n\n\n<li>Avoir 1 capteur DHT22 pour la prise de temp\u00e9rature et d\u2019humidit\u00e9 ambiante (connaissance de l\u2019environnement ext\u00e9rieur au four pour une meilleure comparaison)<\/li>\n\n\n\n<li>Pouvoir enregistrer automatiquement les donn\u00e9es sur une p\u00e9riode de 24h, \u00e0 des pas de temps de 30s \u00e0 1min -&gt; Horodatage des donn\u00e9es et sauvegarde de celles-ci sur une carte SD<\/li>\n\n\n\n<li>Avoir une installation qui prenne peu de place, et qui soit prot\u00e9g\u00e9e de la poussi\u00e8re<\/li>\n\n\n\n<li>Ne pas d\u00e9pendre du Wifi<\/li>\n\n\n\n<li>Etre OpenSource&nbsp;et anti-obsolescence programm\u00e9e (chaque module de la carte peut-\u00eatre remplac\u00e9 ou upgrad\u00e9 ind\u00e9pendamment tout en \u00e9tant r\u00e9trocompatible)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Partie 2&nbsp;: Mat\u00e9riel choisi<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019installation est compos\u00e9e du mat\u00e9riel suivant&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>4 thermocouples type K, allant de -50\u00b0C \u00e0 +600\u00b0C<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"518\" height=\"356\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-2.png\" alt=\"\" class=\"wp-image-4783\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-2.png 518w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-2-300x206.png 300w\" sizes=\"auto, (max-width: 518px) 100vw, 518px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>4 modules MAX6675<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"865\" height=\"354\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-1.png\" alt=\"\" class=\"wp-image-4782\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-1.png 865w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-1-300x123.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-1-768x314.png 768w\" sizes=\"auto, (max-width: 865px) 100vw, 865px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Un MAX6675 pour connecter chaque thermocouple de type K.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Les thermocouples sont constitu\u00e9s de \u00ab deux fils de mat\u00e9riaux diff\u00e9rents qui g\u00e9n\u00e8rent une force \u00e9lectromotrice (FEM) en fonction de la diff\u00e9rence de temp\u00e9rature entre les deux extr\u00e9mit\u00e9s. Le MAX6675 utilise une interface SPI pour communiquer avec le microcontr\u00f4leur et transf\u00e9rer les lectures de temp\u00e9rature en sortie.&nbsp;\u00bb (<a href=\"https:\/\/www.moussasoft.com\/max6675-module-thermocouple-avec-arduino\/#1-11-description-du-module-max6675\">https:\/\/www.moussasoft.com\/max6675-module-thermocouple-avec-arduino\/#1-11-description-du-module-max6675<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On pourra retrouver toute la documentation pour la r\u00e9alisation du c\u00e2blage ici&nbsp;: <a href=\"https:\/\/www.moussasoft.com\/max6675-module-thermocouple-avec-arduino\/#1-11-description-du-module-max6675\">https:\/\/www.moussasoft.com\/max6675-module-thermocouple-avec-arduino\/#1-11-description-du-module-max6675<\/a>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Wemos D1 Mini et un shield combinant une RTC (Real Time Clocl) et un lecteur de carte SD<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"441\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-3-1024x441.png\" alt=\"\" class=\"wp-image-4784\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-3-1024x441.png 1024w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-3-300x129.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-3-768x331.png 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-3.png 1051w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>DHT22&nbsp;: capteur de temp\u00e9rature et d\u2019humidit\u00e9 ambiantes<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"316\" height=\"429\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-4.png\" alt=\"\" class=\"wp-image-4785\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-4.png 316w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-4-221x300.png 221w\" sizes=\"auto, (max-width: 316px) 100vw, 316px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Carte ESP-WROOM-32<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"630\" height=\"476\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-5.png\" alt=\"\" class=\"wp-image-4786\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-5.png 630w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-5-300x227.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-5-160x120.png 160w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Carte de d\u00e9veloppement avec interfaces WiFi et Bluetooth<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Permet de connecter les capteurs de temp\u00e9rature, le DHT22 et la carte SD.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pile pour l\u2019horloge RTC<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Utile pour avoir la date (jour et heure) exacte.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pile bouton RS PRO, 3 V Lithium Mangan\u00e8se Dioxyde, 30 mm CR3032 500 mAh<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"352\" height=\"309\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-6.png\" alt=\"\" class=\"wp-image-4787\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-6.png 352w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-6-300x263.png 300w\" sizes=\"auto, (max-width: 352px) 100vw, 352px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Logiciel IDE Arduino<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"945\" height=\"362\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-7.png\" alt=\"\" class=\"wp-image-4788\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-7.png 945w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-7-300x115.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-7-768x294.png 768w\" sizes=\"auto, (max-width: 945px) 100vw, 945px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Partie 3&nbsp;: Enregistrer les donn\u00e9es avec une carte SD<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Sch\u00e9ma du c\u00e2blage<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">Code<\/h3>\n\n\n\n<h2 class=\"wp-block-heading\">Partie 4&nbsp;: Enregistrer les donn\u00e9es du DHT22 (temp\u00e9rature et humidit\u00e9 ambiantes)<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Partie 5&nbsp;: Int\u00e9grer les 4 thermocouples pour l\u2019enregistrement des 4 temp\u00e9ratures<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Partie 6&nbsp;: R\u00e9alisation finale<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">C\u00e2blage&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"945\" height=\"804\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-8.png\" alt=\"\" class=\"wp-image-4789\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-8.png 945w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-8-300x255.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-8-768x653.png 768w\" sizes=\"auto, (max-width: 945px) 100vw, 945px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Sch\u00e9ma du circuit imprim\u00e9&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"988\" height=\"503\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-9.png\" alt=\"\" class=\"wp-image-4790\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-9.png 988w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-9-300x153.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-9-768x391.png 768w\" sizes=\"auto, (max-width: 988px) 100vw, 988px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Circuit imprim\u00e9&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"945\" height=\"711\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-10.png\" alt=\"\" class=\"wp-image-4791\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-10.png 945w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-10-300x226.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-10-768x578.png 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-10-160x120.png 160w\" sizes=\"auto, (max-width: 945px) 100vw, 945px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Figure 7 : Installation du circuit imprim\u00e9 de l&#8217;enregistreur autonome final&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Code&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">\/\/Biblioth\u00e8ques n\u00e9cessaires pour le fonctionnement du programme\n#include \"FS.h\" \/\/File System : permet de g\u00e9rer des fichiers, utile pour la carte SD\n#include \"SD.h\"  \/\/Biblioth\u00e8que pour utiliser une carte SD : permet de lire les fichiers et \u00e9crire des donn\u00e9es dans la carte SD\n#include \"SPI.h\" \/\/Active la communication SPI (Serial Peripherical Interface). Protocole pour communiquer avec la carte SD et les capteurs \n#include \"max6675.h\" \/\/Biblioth\u00e8que pour le module MAX6675 et thermocouple K\n#include \"RTClib.h\" \/\/Biblioth\u00e8que pour les modules d\u2019horloge temps r\u00e9el (RTC) et permettre d\u2019obtenir la date et l\u2019heure en temps r\u00e9el\n#include \"DHT.h\" \/\/Biblioth\u00e8que pour le capteur DHT22 (temp\u00e9ratures et humidit\u00e9 ambiantes)\n\nRTC_DS1307 rtc;\n\nchar daysOfTheWeek[7][12] = { \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" };\n\nSPIClass spiSD(HSPI);\n#define SD_CS 5  \/\/ MAX6675 CS@27\n\n\/\/D\u00e9finition du c\u00e2blage pour relier les thermocouples au module ESP-WROOM-32\nint thermoDO = 19;\nint thermoCLK = 18;\nint thermoCS1 = 25;\nint thermoCS2 = 26;\nint thermoCS3 = 27;\nint thermoCS4 = 33;\n\n\/\/Connexion des thermocouples aux modules MAX6675\nMAX6675 thermocouple1(thermoCLK, thermoCS1, thermoDO);\nMAX6675 thermocouple2(thermoCLK, thermoCS2, thermoDO);\nMAX6675 thermocouple3(thermoCLK, thermoCS3, thermoDO);\nMAX6675 thermocouple4(thermoCLK, thermoCS4, thermoDO);\n\nFile myFile;\n#define DHTPIN 32\n#define DHTTYPE DHT22\n\nDHT dht(DHTPIN, DHTTYPE);\n\n\/*\nUncomment and set up if you want to use custom pins for the SPI communication\n#define REASSIGN_PINS\nint sck = -1;\nint miso = -1;\nint mosi = -1;\nint cs = -1;\n*\/\n\n\/\/D\u00e9finition d\u2019une s\u00e9rie de fonctions pour traiter les dossiers\/fichiers sur la carte SD, qu\u2019on appelera dans notre programme \n\nvoid listDir(fs::FS &amp;fs, const char *dirname, uint8_t levels) {\n  Serial.printf(\"Listing directory: %s\\n\", dirname);\n\n  File root = fs.open(dirname);\n  if (!root) {\n    Serial.println(\"Failed to open directory\");\n    return;\n  }\n  if (!root.isDirectory()) {\n    Serial.println(\"Not a directory\");\n    return;\n  }\n\/\/Permet d\u2019afficher le dossier demand\u00e9, de l\u2019ouvrir et de v\u00e9rifier s\u2019il existe\n\n  File file = root.openNextFile();\n  while (file) {\n    if (file.isDirectory()) {\n      Serial.print(\"  DIR : \");\n      Serial.println(file.name());\n      if (levels) {\n        listDir(fs, file.path(), levels - 1);\n      }\n    } else {\n      Serial.print(\"  FILE: \");\n      Serial.print(file.name());\n      Serial.print(\"  SIZE: \");\n      Serial.println(file.size());\n    }\n    file = root.openNextFile();\n  }\n}\n\/\/Permet d\u2019explorer le fichier : ouvrir les dossiers et sous-dossiers, parcourt le contenu, sa taille\n\nvoid createDir(fs::FS &amp;fs, const char *path) {\n  Serial.printf(\"Creating Dir: %s\\n\", path);\n  if (fs.mkdir(path)) {\n    Serial.println(\"Dir created\");\n  } else {\n    Serial.println(\"mkdir failed\");\n  }\n}\n\/\/Permet de cr\u00e9er un dossier sur la carte SD\n\nvoid removeDir(fs::FS &amp;fs, const char *path) {\n  Serial.printf(\"Removing Dir: %s\\n\", path);\n  if (fs.rmdir(path)) {\n    Serial.println(\"Dir removed\");\n  } else {\n    Serial.println(\"rmdir failed\");\n  }\n}\n\/\/Permet de supprimer un dossier sur la carte SD\n\n\nvoid readFile(fs::FS &amp;fs, const char *path) {\n  Serial.printf(\"Reading file: %s\\n\", path);\n\n  File file = fs.open(path);\n  if (!file) {\n    Serial.println(\"Failed to open file for reading\");\n    return;\n  }\n\n  Serial.print(\"Read from file: \");\n  while (file.available()) {\n    Serial.write(file.read());\n  }\n  file.close();\n}\n\/\/Ouvre un fichier, tente de le lire et v\u00e9rifie s\u2019il existe, lit son contenu, affiche le contenu dans le moniteur s\u00e9rie et le ferme\n\n\nvoid writeFile(fs::FS &amp;fs, const char *path, const char *message) {\n  Serial.printf(\"Writing file: %s\\n\", path);\n\n  File file = fs.open(path, FILE_WRITE);\n  if (!file) {\n    Serial.println(\"Failed to open file for writing\");\n    return;\n  }\n  if (file.print(message)) {\n    Serial.println(\"File written\");\n  } else {\n    Serial.println(\"Write failed\");\n  }\n  file.close();\n}\n\/\/Permet de cr\u00e9er un fichier, d\u2019\u00e9crire du texte \n\n\nvoid appendFile(fs::FS &amp;fs, const char *path, const char *message) {\n  Serial.printf(\"Appending to file: %s\\n\", path);\n\n  File file = fs.open(path, FILE_APPEND);\n  if (!file) {\n    Serial.println(\"Failed to open file for appending\");\n    return;\n  }\n  if (file.print(message)) {\n    Serial.println(\"Message appended\");\n  } else {\n    Serial.println(\"Append failed\");\n  }\n  file.close();\n}\n\/\/Permet d\u2019enregistrer des mesures et de garder un historique (ouverture fichier, ajout d\u2019un texte, fermeture du fichier)\n\nvoid renameFile(fs::FS &amp;fs, const char *path1, const char *path2) {\n  Serial.printf(\"Renaming file %s to %s\\n\", path1, path2);\n  if (fs.rename(path1, path2)) {\n    Serial.println(\"File renamed\");\n  } else {\n    Serial.println(\"Rename failed\");\n  }\n}\n\/\/Permet de renommer ou d\u00e9placer un fichier sur la carte SD\n\nvoid deleteFile(fs::FS &amp;fs, const char *path) {\n  Serial.printf(\"Deleting file: %s\\n\", path);\n  if (fs.remove(path)) {\n    Serial.println(\"File deleted\");\n  } else {\n    Serial.println(\"Delete failed\");\n  }\n}\n\/\/Permet de supprimer un fichier sur la carte SD\n\nvoid testFileIO(fs::FS &amp;fs, const char *path) {\n  File file = fs.open(path);\n  static uint8_t buf[512];\n  size_t len = 0;\n  uint32_t start = millis();\n  uint32_t end = start;\n  if (file) {\n    len = file.size();\n    size_t flen = len;\n    start = millis();\n    while (len) {\n      size_t toRead = len;\n      if (toRead &gt; 512) {\n        toRead = 512;\n      }\n      file.read(buf, toRead);\n      len -= toRead;\n    }\n    end = millis() - start;\n    Serial.printf(\"%u bytes read for %lu ms\\n\", flen, end);\n    file.close();\n  } else {\n    Serial.println(\"Failed to open file for reading\");\n  }\n\n  file = fs.open(path, FILE_WRITE);\n  if (!file) {\n    Serial.println(\"Failed to open file for writing\");\n    return;\n  }\n\n  size_t i;\n  start = millis();\n  for (i = 0; i &lt; 2048; i++) {\n    file.write(buf, 512);\n  }\n  end = millis() - start;\n  Serial.printf(\"%u bytes written for %lu ms\\n\", 2048 * 512, end);\n  file.close();\n}\n\/\/Permet de mesurer la vitesse de lecture\/\u00e9criture sur la carte SD\n\n\n\/\/Initialisation du programme \nvoid setup() {\n  Serial.begin(115200);\n  while (!Serial) { delay(10); }\n\/\/Initialisation du port s\u00e9rie \n\n#ifdef REASSIGN_PINS\n  SPI.begin(sck, miso, mosi, cs);\n#endif\n\/\/Configuration SPI\n\n  spiSD.begin(14, 12, 13, 5);  \/\/CLK=14,MISO=12,MOSI=13,CS=5\n\/\/Configuration carte SD\n\n  \/\/if(!SD.begin(cs)){ \/\/Change to this function to manually change CS pin\n  if (!SD.begin(5, spiSD)) {\n    Serial.println(\"Card Mount Failed\");\n    return;\n  }\n  uint8_t cardType = SD.cardType();\n\n  if (cardType == CARD_NONE) {\n    Serial.println(\"No SD card attached\");\n    return;\n  }\n\n  Serial.print(\"SD Card Type: \");\n  if (cardType == CARD_MMC) {\n    Serial.println(\"MMC\");\n  } else if (cardType == CARD_SD) {\n    Serial.println(\"SDSC\");\n  } else if (cardType == CARD_SDHC) {\n    Serial.println(\"SDHC\");\n  } else {\n    Serial.println(\"UNKNOWN\");\n  }\n\n  uint64_t cardSize = SD.cardSize() \/ (1024 * 1024);\n  Serial.printf(\"SD Card Size: %lluMB\\n\", cardSize);\n  \/*\n  listDir(SD, \"\/\", 0);\n  createDir(SD, \"\/mydir\");\n  listDir(SD, \"\/\", 0);\n  removeDir(SD, \"\/mydir\");\n  listDir(SD, \"\/\", 2);\n  writeFile(SD, \"\/hello.txt\", \"Hello \");\n  appendFile(SD, \"\/hello.txt\", \"World!\\n\");\n  readFile(SD, \"\/hello.txt\");\n  deleteFile(SD, \"\/foo.txt\");\n  renameFile(SD, \"\/hello.txt\", \"\/foo.txt\");\n  readFile(SD, \"\/foo.txt\");\n  testFileIO(SD, \"\/test.txt\");\n  Serial.printf(\"Total space: %lluMB\\n\", SD.totalBytes() \/ (1024 * 1024));\n  Serial.printf(\"Used space: %lluMB\\n\", SD.usedBytes() \/ (1024 * 1024));\n  *\/\n\n\/\/Initialisation RTC\n  if (!rtc.begin()) {\n    Serial.println(\"Couldn't find RTC\");\n    Serial.flush();\n    while (1) delay(10);\n  }\n\n\/\/v\u00e9rification fonctionnement de l\u2019horloge, r\u00e9glage de l\u2019heure et initialisation DHT22\n  if (!rtc.isrunning()) {\n    Serial.println(\"RTC is NOT running, let's set the time!\");\n    \/\/ When time needs to be set on a new device, or after a power loss, the\n    \/\/ following line sets the RTC to the date &amp; time this sketch was compiled\n    \/\/rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));\n    \/\/ This line sets the RTC with an explicit date &amp; time, for example to set\n    \/\/ January 21, 2014 at 3am you would call:\n    rtc.adjust(DateTime(2026, 5, 01, 6, 35, 00));\n  }\n\n  \/\/ When time needs to be re-set on a previously configured device, the\n  \/\/ following line sets the RTC to the date &amp; time this sketch was compiled\n  \/\/ rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));\n  \/\/ This line sets the RTC with an explicit date &amp; time, for example to set\n  \/\/ January 21, 2014 at 3am you would call:\n  \/\/ rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));\n\n  dht.begin();\n}\n\n\/\/Partie du programme qui tourne en boucle \nvoid loop() {\n  DateTime now = rtc.now();  \/\/R\u00e9cup\u00e9ration date et heure actuelle\n\n  Serial.print(now.year(), DEC);\n  Serial.print('\/');\n  Serial.print(now.month(), DEC);\n  Serial.print('\/');\n  Serial.print(now.day(), DEC);\n  Serial.print(\" (\");\n  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);\n  Serial.print(\") \");\n  Serial.print(now.hour(), DEC);\n  Serial.print(':');\n  Serial.print(now.minute(), DEC);\n  Serial.print(':');\n  Serial.print(now.second(), DEC);\n  Serial.println();\n\/\/Affichage date et heure \n\n  float h = dht.readHumidity();\n  \/\/ Read temperature as Celsius (the default)\n  float t = dht.readTemperature();\n  \/\/ Read temperature as Fahrenheit (isFahrenheit = true)\n  \/\/ float f = dht.readTemperature(true);\n  if (isnan(h) || isnan(t)) {\n    Serial.println(F(\"Failed to read from DHT sensor!\"));\n    return;\n  }\n  Serial.println(t);\n  Serial.println(h);\n\/\/Affichage humidit\u00e9 (%) et temp\u00e9rature (\u00b0C)\n\n  float t1 = thermocouple1.readCelsius();\n  float t2 = thermocouple2.readCelsius();\n  float t3 = thermocouple3.readCelsius();\n  float t4 = thermocouple4.readCelsius();\n  Serial.print(\"C1 = \");\n  Serial.println(t1);\n  Serial.print(\"C2 = \");\n  Serial.println(t2);\n  Serial.print(\"C3 = \");\n  Serial.println(t3);\n  Serial.print(\"C4 = \");\n  Serial.println(t4);\n  myFile = SD.open(\"\/records.txt\", FILE_APPEND);\n\/\/Ouverture du fichier \u00ab records \u00bb\n\n  if (myFile) {\n    Serial.print(\"Writing to records.txt...\");\n    myFile.println((String(now.year())+\"\/\"+String(now.month())+\"\/\"+String(now.day())+\" \"+String(now.hour())+\":\"+String(now.minute())+\":\"+String(now.second())+ \" \" +String(h) + \",\" +String(t) + \",\" +String(t1) + \",\" + String(t2) + \",\" + String(t3) + \",\" + String(t4)).c_str());\n\/\/Ecriture : date heure humidit\u00e9 h, temp\u00e9rature t, t1, t2, t3, t4\n\n    myFile.close();  \/\/ Sauvegarde les donn\u00e9es sur la carte SD\n    Serial.println(\"done.\");\n  } \n \/\/ Fermeture du fichier\nelse {\n    \/\/ if the file didn't open, print an error:\n    Serial.println(\"error opening hello.txt\");\n  }\n\n  \/\/ For the MAX6675 to update, you must delay AT LEAST 250ms between reads!\n  delay(30000);  \/\/ D\u00e9lai de 30 secondes entre les mesures\n}\n&nbsp; <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Partie&nbsp;: Essais<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Protocole&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Brancher l\u2019installation via un c\u00e2ble USB-B Micro<\/li>\n\n\n\n<li>V\u00e9rifier que le port USB soit bien connect\u00e9 \u00e0 l\u2019IDE Arduino<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"618\" height=\"282\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-11.png\" alt=\"\" class=\"wp-image-4792\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-11.png 618w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-11-300x137.png 300w\" sizes=\"auto, (max-width: 618px) 100vw, 618px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"638\" height=\"456\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-12.png\" alt=\"\" class=\"wp-image-4793\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-12.png 638w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-12-300x214.png 300w\" sizes=\"auto, (max-width: 638px) 100vw, 638px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>T\u00e9l\u00e9verser le code<\/li>\n\n\n\n<li>Ouvrir le Moniteur s\u00e9rie<\/li>\n\n\n\n<li>V\u00e9rifier que le nombre de baud soit bien le m\u00eame que celui du programme (ici&nbsp;: 115200)<\/li>\n\n\n\n<li>V\u00e9rifier que les mesures s\u2019affichent correctement et que les valeurs sont coh\u00e9rentes<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"945\" height=\"269\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-13.png\" alt=\"\" class=\"wp-image-4794\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-13.png 945w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-13-300x85.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-13-768x219.png 768w\" sizes=\"auto, (max-width: 945px) 100vw, 945px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Remarque&nbsp;: Pour le 1er essai, nous n\u2019avons pas mis la pile du RTC en place. Nous avons uniquement modifi\u00e9 la date et l\u2019heure dans le programme.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>V\u00e9rifier ensuite la cr\u00e9ation du fichier \u00ab&nbsp;records&nbsp;\u00bb et l\u2019enregistrement des donn\u00e9es<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"328\" height=\"379\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-14.png\" alt=\"\" class=\"wp-image-4795\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-14.png 328w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-14-260x300.png 260w\" sizes=\"auto, (max-width: 328px) 100vw, 328px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><u>Essai 1&nbsp;: Cuisson d\u2019un Banana Bread au four \u00e9lectrique particulier<\/u><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le 1er essai a \u00e9t\u00e9 fait avec la cuisson d\u2019un Banana Bread dans un four \u00e9lectrique particulier. Nous avons r\u00e9alis\u00e9 le graphique (figure).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour cela, nous avons dispos\u00e9 2 thermocouples de type K dans le four, un dans le fond (courbe grise) et un pr\u00e8s de la porte (courbe jaune).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Une fois le four chauff\u00e9, nous avons dispos\u00e9 une sonde dans le g\u00e2teau (courbe bleue claire) et l\u2019avons mis dans le four.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un dernier capteur est laiss\u00e9 sur le plan de travail, \u00e0 temp\u00e9rature ambiante de la cuisine (courbe bleue fonc\u00e9e).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Apr\u00e8s la cuisson faite, je r\u00e9cup\u00e8re la carte SD, je la mets dans l\u2019ordinateur et r\u00e9cup\u00e8re les donn\u00e9es dans le dossier \u00ab&nbsp;records&nbsp;\u00bb.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je copie-colle les donn\u00e9es sur Excel (format texte CSV) puis je construits les courbes.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"945\" height=\"375\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-15.png\" alt=\"\" class=\"wp-image-4796\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-15.png 945w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-15-300x119.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2026\/05\/image-15-768x305.png 768w\" sizes=\"auto, (max-width: 945px) 100vw, 945px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Figure 8 : Cycle de chauffe et de d\u00e9chauffe du four pour la cuisson d&#8217;un Banana Bread.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><u>Essai 2&nbsp;: Cuisson de pains au four \u00e9lectrique particulier<\/u><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le 2\u00e8me essai est celui de la cuisson de 2 pains dans un l\u00e8chefrite.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nous souhaitons cr\u00e9er ici un enregistreur de temp\u00e9ratures, avec quatre thermosondes de type K et un DHT22. Ce miniprojet s\u2019inscrit&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-4779","post","type-post","status-publish","format-standard","hentry","category-en-cours"],"_links":{"self":[{"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/posts\/4779","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/comments?post=4779"}],"version-history":[{"count":4,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/posts\/4779\/revisions"}],"predecessor-version":[{"id":5571,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/posts\/4779\/revisions\/5571"}],"wp:attachment":[{"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/media?parent=4779"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/categories?post=4779"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/tags?post=4779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}