🪴 LE GARDIEN ZEN & FUN – Meuble d'entrée connecté

Concept : Console d'entrée 100% récup' (palettes) intégrant :
✅ Recharge sans fil + ports USB cachés
✅ Tiroir motorisé à ouverture magique
✅ Mur végétal miniature + station météo intérieure
✅ LEDs d'ambiance pilotées par la météo
Budget : ~80-100€ (neuf) + récup' maximale

🎯 Objectifs du projet

📐 Stratégie de réalisation

graph TD A[Récupération palettes] --> B[Démontage & Ponçage] B --> C[Structure du meuble] C --> D[Intégration électronique] D --> E[Tiroir motorisé] D --> F[Recharge sans fil + USB] D --> G[Mur végétal + capteurs] E --> H[Finitions & Tests] F --> H G --> H H --> I[Placez votre meuble au bonne endroit!]
Phase Description Durée estimée Compétences
1 Préparation du bois (démontage, ponçage, coupes). Commencez par inspecter les palettes pour éviter les planches endommagées ou traitées chimiquement. Utilisez un pied-de-biche pour démonter délicatement, retirez tous les clous avec une pince pour éviter les accidents. Poncez en plusieurs passes : grain gros (80) pour enlever les grosses imperfections, puis moyen (120) pour lisser, et fin (220) pour un fini doux au toucher. Temps par palette : environ 1h. 4-6h Menuiserie basique
2 Assemblage de la structure (collage, vissage). Mesurez deux fois avant de couper. Utilisez une équerre pour vérifier les angles droits. Appliquez de la colle à bois sur les joints avant de visser pour une solidité accrue. Testez la stabilité en posant du poids sur le plateau assemblé. 3-4h Lecture de plan
3 Câblage électronique et tests. Utilisez un multimètre pour vérifier les connexions avant alimentation. Testez chaque composant isolément (ex: capteur IR seul, puis moteur). Isolez les fils avec du scotch électrique pour éviter les courts-circuits. 5-6h Bases en électricité
4 Programmation des microcontrôleurs. Installez l'IDE Arduino ou VS Code avec PlatformIO. Téléversez le code étape par étape, debuggez avec Serial Monitor. Adaptez les broches et seuils (ex: IR > 500) selon votre hardware exact. 4-5h Arduino / MicroPython
5 Finition (huile, décoration, plantations). Appliquez l'huile en couches fines avec un chiffon, laissez sécher 24h entre chaque. Pour les plantes, choisissez des succulentes résistantes, ajoutez du substrat drainant pour éviter la pourriture. 2-3h Patience et créativité

🔩 Matériel & fournitures

Bois & quincaillerie

ÉlémentRécup possible ?Budget neufNotes
4-5 palettes Europe✅ (gratuit)0€Éviter les traitées chimiquement. Cherchez sur sites de petites annonces ou près des entrepôts pour des palettes propres et solides.
Vis à bois (3x30, 4x40)⚠️ (si démontage)5€Prévoir des visseries diverses. Optez pour des vis inoxydables si le meuble est exposé à l'humidité.
Colle à bois❌5€Marque classique, type PVA résistante à l'eau pour une meilleure durabilité.
Huile de lin ou vernis❌10€Protection et aspect satiné. Appliquez en 2-3 couches pour une finition professionnelle.
Rails de tiroir (2x)✅ (vieux meuble)10€Longueur ~40cm. Vérifiez la fluidité avant montage ; graissez si nécessaire.

Électronique & high-tech

ÉlémentRécup possible ?Budget neufLiens / Références
Module recharge sans fil Qi❌10-15€AliExpress / Amazon. Choisissez un modèle 5W-10W compatible avec la plupart des smartphones.
Ports USB femelles encastrables✅ (vieux chargeurs)5€2 ports. Assurez-vous d'avoir USB-A et USB-C pour polyvalence.
Powerbank usagée✅0€Fonctionnelle de préférence. Testez la capacité et les sorties avant intégration.
Ruban LED RGB (3-5m)✅ (vieilles guirlandes)10€12V ou 5V selon projet. Choisissez un modèle adressable pour des effets personnalisés.
Moteur DC avec réducteur (ou vérin)✅ (imprimante, jouet)10-15€Pour tiroir motorisé. Vérifiez le couple (torque) pour une ouverture fluide sans forcer.
Pont en H L298N❌5€Pour piloter le moteur. Supporte jusqu'à 2A, idéal pour petits moteurs.
Capteur infrarouge (ou ultrason HC-SR04)❌2€Détection de main. Ajustez la distance de détection (5-30cm) pour éviter les faux positifs.
Interrupteur magnétique (ILS)✅ (alarme porte)2€Détection fermeture tiroir. Placez l'aimant sur le tiroir et le capteur sur le cadre.
ESP8266 (Wemos D1 Mini)❌5€Pour WiFi et capteurs. Compact et low-power, parfait pour intégration.
Capteur DHT22 (temp/hum)❌5€Station météo. Précision ±0.5°C / ±2% RH ; calibrez si nécessaire.
Écran OLED 0.96" I2C❌8€Affichage des mesures. Résolution 128x64, basse conso pour autonomie.
Plantes grasses✅ (boutures)5-10€Succulentes, mini cactus. Choisissez des variétés tolérantes à la faible lumière.

Total estimé (neuf) : ~80-100€ (hors récup')

💻 Codes sources

⚙️ Ces codes sont fournis à titre éducatif. Adaptez les broches selon votre montage.

1. ESP8266 – Station météo + LEDs ambiance

// Station météo intérieure avec affichage OLED et LEDs pilotées par météo extérieure
// Ce code lit les données locales (DHT22), récupère la météo externe via API, affiche sur OLED, et ajuste les LEDs.
// Assurez-vous d'avoir les librairies installées : ESP8266WiFi, Wire, Adafruit_GFX, Adafruit_SSD1306, DHT, ArduinoJson.
// Testez sur breadboard avant intégration pour debugguer les connexions.
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include <ArduinoJson.h>
// WiFi
const char* ssid = "TON_SSID";
const char* password = "TON_MDP";
// API météo (OpenWeatherMap)
const char* host = "api.openweathermap.org";
const char* apiKey = "TA_CLE_API";
const char* city = "Paris"; // Ta ville
// Broches
#define DHTPIN D4
#define DHTTYPE DHT22
#define LED_PIN D2 // Ruban LED (via transistor ou mosfet)
DHT dht(DHTPIN, DHTTYPE);
// OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Variables météo extérieure
float extTemp = 0;
int extWeather = 0; // code météo
void setup() {
  Serial.begin(115200);
  dht.begin();
 
  // Initialisation OLED
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("OLED non trouvé");
  }
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
 
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
 
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connecté");
}
void loop() {
  // Lecture capteur intérieur
  float h = dht.readHumidity();
  float t = dht.readTemperature();
 
  if (isnan(h) || isnan(t)) {
    Serial.println("Erreur lecture DHT");
    return;
  }
 
  // Récupération météo extérieure
  getWeatherData();
 
  // Affichage sur OLED
  display.clearDisplay();
  display.setCursor(0,0);
  display.print("Interieur:");
  display.setCursor(0,10);
  display.print(t); display.print("C ");
  display.print(h); display.print("%");
  display.setCursor(0,25);
  display.print("Exterieur:");
  display.setCursor(0,35);
  display.print(extTemp); display.print("C ");
  display.print(weatherToChar(extWeather));
  display.display();
 
  // Contrôle LED selon météo
  setLedColor(extWeather);
 
  delay(60000); // Attente 1 minute
}
void getWeatherData() {
  WiFiClient client;
  if (!client.connect(host, 80)) {
    Serial.println("Connexion échouée");
    return;
  }
 
  String url = "/data/2.5/weather?q=" + String(city) + "&appid=" + String(apiKey) + "&units=metric";
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
 
  delay(500);
 
  String response;
  while(client.available()) {
    response = client.readStringUntil('\r');
  }
 
  // Parse JSON
  int jsonStart = response.indexOf('{');
  if (jsonStart > 0) {
    String json = response.substring(jsonStart);
    DynamicJsonDocument doc(1024);
    deserializeJson(doc, json);
    extTemp = doc["main"]["temp"];
    extWeather = doc["weather"][0]["id"];
  }
}
char weatherToChar(int code) {
  if (code >= 200 && code < 300) return '⛈️'; // Orage
  if (code >= 300 && code < 400) return '🌧️'; // Bruine
  if (code >= 500 && code < 600) return '☔'; // Pluie
  if (code >= 600 && code < 700) return '❄️'; // Neige
  if (code >= 700 && code < 800) return '🌫️'; // Brume
  if (code == 800) return '☀️'; // Clair
  if (code > 800) return '☁️'; // Nuageux
  return '?';
}
void setLedColor(int code) {
  // Exemple : bleu pour pluie, jaune pour soleil, blanc pour nuage
  // Note : Adaptez pour ruban RGB en utilisant des librairies comme FastLED si besoin de couleurs précises.
  if (code >= 500 && code < 600) { // Pluie -> bleu
    analogWrite(LED_PIN, 50); // Intensité faible (PWM si supporté)
  } else if (code == 800) { // Soleil -> jaune (oranger)
    analogWrite(LED_PIN, 200);
  } else { // Autre -> blanc (intensité moyenne)
    analogWrite(LED_PIN, 100);
  }
}

2. Arduino Nano – Tiroir motorisé (version simple)

// Contrôle tiroir motorisé avec capteur IR et interrupteur magnétique
// Ce code gère l'ouverture/fermeture auto, avec détection de main et délai. Utilisez un pont en H pour inverser le sens du moteur.
// Testez la durée d'ouverture/fermeture (delay 2000) selon la longueur du tiroir et la vitesse du moteur.
#define MOTOR_IN1 9
#define MOTOR_IN2 10
#define ENABLE_PIN 11 // PWM pour vitesse (optionnel)
#define IR_SENSOR A0 // Capteur infrarouge (ou digital selon modèle)
#define MAGNET_SENSOR 2 // Interrupteur ILS (entrée pull-up)
#define LED_TIROIR 13
bool tiroirOuvert = false;
unsigned long ouvertureTime = 0;
const long dureeOuverture = 10000; // 10 secondes avant fermeture auto
void setup() {
  pinMode(MOTOR_IN1, OUTPUT);
  pinMode(MOTOR_IN2, OUTPUT);
  pinMode(ENABLE_PIN, OUTPUT);
  pinMode(IR_SENSOR, INPUT);
  pinMode(MAGNET_SENSOR, INPUT_PULLUP);
  pinMode(LED_TIROIR, OUTPUT);
 
  digitalWrite(ENABLE_PIN, HIGH); // Moteur actif
  stopMotor();
}
void loop() {
  // Détection main (IR)
  int irValue = analogRead(IR_SENSOR);
  if (irValue > 500 && !tiroirOuvert) { // Seuil à ajuster selon calibration (testez avec Serial.print)
    ouvrirTiroir();
  }
 
  // Détection fermeture via ILS
  if (digitalRead(MAGNET_SENSOR) == HIGH && tiroirOuvert) {
    // Tiroir fermé manuellement ? On arrête le moteur
    stopMotor();
    tiroirOuvert = false;
    digitalWrite(LED_TIROIR, LOW);
  }
 
  // Fermeture automatique après délai
  if (tiroirOuvert && (millis() - ouvertureTime > dureeOuverture)) {
    fermerTiroir();
  }
}
void ouvrirTiroir() {
  digitalWrite(MOTOR_IN1, HIGH);
  digitalWrite(MOTOR_IN2, LOW);
  delay(2000); // Durée d'ouverture (à ajuster selon course, mesurez avec un chronomètre)
  stopMotor();
  tiroirOuvert = true;
  ouvertureTime = millis();
  digitalWrite(LED_TIROIR, HIGH);
}
void fermerTiroir() {
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, HIGH);
  delay(2000);
  stopMotor();
  tiroirOuvert = false;
  digitalWrite(LED_TIROIR, LOW);
}
void stopMotor() {
  digitalWrite(MOTOR_IN1, LOW);
  digitalWrite(MOTOR_IN2, LOW);
}

3. Script Python (optionnel) pour exfiltration météo vers PC

#!/usr/bin/env python3
# Récupère les données du capteur via série et les envoie vers un serveur MQTT (optionnel)
# Installez paho-mqtt via pip. Exécutez sur un PC connecté à l'ESP via USB. Adaptez le port série (/dev/ttyUSB0 pour Linux, COMX pour Windows).
# Pour MQTT, configurez un broker local comme Mosquitto.
import serial
import paho.mqtt.client as mqtt
import time
ser = serial.Serial('/dev/ttyUSB0', 115200) # Adapte le port
client = mqtt.Client()
client.connect("localhost", 1883, 60)
while True:
    line = ser.readline().decode().strip()
    if line.startswith("Temp:"):
        # Exemple de parsing
        temp = line.split()[1]
        client.publish("maison/entree/temperature", temp)
    time.sleep(1)

📏 Plans de coupe (palettes)

Vue d'ensemble – dimensions

Détail des pièces

PièceQuantitéDimensions (L x l x ép)Provenance
Plateau1100 x 35 x 2.5 cm4-5 planches assemblées. Alignez-les parfaitement pour éviter les écarts ; poncez les joints.
Pieds490 x 7 x 7 cmPlanches épaisses de palette. Renforcez avec des chevilles si les palettes sont fines.
Dosseret2100 x 30 x 2 cmPlanches larges. Superposez pour rigidité ; fixez avec vis espacées de 20cm.
Traverses430 x 5 x 2 cmChutes. Placez-les aux coins pour stabilité anti-basculement.
Façade tiroir180 x 25 x 2 cmBelle planche. Poncez extra pour un aspect premium ; intégrez le capteur IR discrètement.
Côtés tiroir270 x 25 x 1.5 cmPlanches fines. Vérifiez l'équerrage avec une équerre lors de l'assemblage.
Fond tiroir170 x 25 x 1 cmContreplaqué ou palette fine. Collez et vissez pour éviter les flexions sous poids.

Remarque : Adaptez les dimensions en fonction des planches récupérées. Le principe est de garder des proportions harmonieuses. Utilisez un logiciel gratuit comme SketchUp pour visualiser avant coupe si besoin.

🔨 Étapes de réalisation détaillées

⚠️ SÉCURITÉ AVANT TOUT

Portez des gants, des lunettes de protection et un masque anti-poussière lors du ponçage. Travaillez dans un espace aéré. Débranchez tous outils électriques quand non utilisés. Vérifiez les câbles pour éviter les risques d'incendie.

Étape 1 : Préparation des palettes

Étape 2 : Assemblage de la structure

Étape 3 : Intégration des composants électroniques

Étape 4 : Programmation

Étape 5 : Finitions et plantations

🏆 CHALLENGE COMMUNAUTAIRE

Objectifs :

  1. ✅ Réalisez votre propre Gardien Zen & Fun
  2. ✅ Postez une photo sur les réseaux avec #GardienZenFun #PCTAMALOU
  3. ✅ Partagez vos améliorations (nouvelle fonction, design différent)

🎓 Conclusion & perspectives

Ce projet allie créativité, récupération et technologie pour un résultat unique. Il peut être adapté à l'infini :

"Le vrai luxe, c'est de fabriquer soi-même des objets qui ont une âme."