import React, { useState, useEffect, useMemo } from 'react'; import { Zap, Droplet, Thermometer, FlaskConical, RefreshCw, Clock, Beaker, CheckCircle, X, Maximize2, Database, Aperture, Plus, Waves, Microscope, Server, Calculator, Video, Camera, Square, Circle, Signal, Wifi, ShieldCheck, Battery, Wind, Settings, Cpu, HardDrive, AlertOctagon, Fan, Power, Activity, ChevronRight, Scale, Box, ArrowDownCircle, Trash2, Save, History } from 'lucide-react'; const App = () => { const [selectedUnitId, setSelectedUnitId] = useState(1); const [activeTab, setActiveTab] = useState('process'); // 'process', 'esp-simulation', 'logs' // --- ÉTAT DU CYCLE (Simulation Automate) --- const [currentStep, setCurrentStep] = useState('INITIALISATION'); // Étapes : INITIALISATION -> CHAUFFE -> ACIDIFICATION -> CHARGEMENT -> LIXIVIATION -> REPOS -> TERMINE // --- DONNÉES CAPTEURS (Simulées par saisie ou ESP) --- const [sensors, setSensors] = useState({ ph: 7.0, temp: 22.4, rpm: 0, targetRpm: 550, weightAcid: 0.0, weightOre: 0, // En kg levelUltrasonic: 0, // En L distilledWater: 100, // % restant airPressure: 0 }); // --- MATRICE DES 16 RELAIS / ACTIONNEURS --- const [relays, setRelays] = useState([ { id: 1, name: "Agitateur (VFD)", active: false, pin: 13 }, { id: 2, name: "Pompe Acide", active: false, pin: 25 }, { id: 3, name: "Pompe Eau", active: false, pin: 26 }, { id: 4, name: "Pompe Liquide", active: false, pin: 33 }, { id: 5, name: "Vanne Sortie 1", active: false, pin: 27 }, { id: 6, name: "Vanne Sortie 2", active: false, pin: 14 }, { id: 7, name: "Vanne Sortie 3", active: false, pin: 12 }, { id: 8, name: "Vanne Air (Pneum)", active: false, pin: 4 }, { id: 9, name: "Moteur Pas à Pas (Minerai)", active: false, pin: "SPI" }, { id: 10, name: "Eau Distillée (Nettoyage)", active: false, pin: 5 }, { id: 11, name: "Couverture Chauffe", active: false, pin: 18 }, { id: 12, name: "Prélèvement Auto", active: false, pin: 19 }, { id: 13, name: "Lumière État (Verte)", active: false, pin: 21 }, { id: 14, name: "Lumière Alerte (Rouge)", active: false, pin: 22 }, { id: 15, name: "Auxiliaire 1", active: false, pin: 23 }, { id: 16, name: "Auxiliaire 2", active: false, pin: 15 }, ]); const [logMessages, setLogMessages] = useState([ { time: "18:30:00", msg: "uLixi6_uctrl connecté. En attente de l'ESP32 Cuve 1.", type: "system" } ]); const addLog = (msg, type = "info") => setLogMessages(prev => [{ time: new Date().toLocaleTimeString(), msg, type }, ...prev]); // --- LOGIQUE DE SIMULATION DU CYCLE --- const startCycle = () => { setCurrentStep('CHAUFFE'); setSensors({...sensors, levelUltrasonic: 750, ph: 7.0}); const newRelays = [...relays]; newRelays[10].active = true; // Activer chauffe setRelays(newRelays); addLog("Démarrage Cycle : Remplissage 750L effectué. Mise en chauffe..."); }; const injectAcid = () => { setCurrentStep('ACIDIFICATION'); addLog("Acidification en cours... Cible pH 0.5 - 1.0"); }; const loadOre = () => { setCurrentStep('CHARGEMENT'); addLog("Démarrage chargement minerai : Cible 300kg."); }; // --- RENDU UI --- const Sidebar = () => ( ); return (
Station #001 Baobab Alpha