Test Types & Methods

Tests environnementaux avec TofuPilot

Découvrez comment enregistrer les résultats de cyclage thermique, humidité, HALT et filtrage environnemental dans TofuPilot pour le suivi de fiabilité.

JJulien Buteau
intermediate10 min de lecture13 mars 2026

Tests environnementaux avec TofuPilot

Les produits tombent en panne sur le terrain à cause de la température, de l'humidité, des vibrations et de l'altitude. Les tests environnementaux simulent ces conditions en laboratoire. TofuPilot enregistre chaque résultat de test environnemental pour que vous puissiez construire un portrait de fiabilité sur l'ensemble du cycle de vie de votre produit.

Types de tests environnementaux

TestCe qu'il simuleNormes
Cyclage thermiqueTempératures extrêmes pendant le transport et le fonctionnementIEC 60068-2-14, MIL-STD-810
Choc thermiqueTransitions rapides de températureIEC 60068-2-14
Test d'humiditéExposition à l'humidité, condensationIEC 60068-2-78
HALT (Highly Accelerated Life Test)Trouver les faiblesses de conception rapidementPas de norme formelle
HASS (Highly Accelerated Stress Screen)Filtrage en productionPas de norme formelle
VibrationStress mécanique pendant le transport et le fonctionnementIEC 60068-2-6, IEC 60068-2-64
AltitudeEnvironnements à basse pressionIEC 60068-2-13
Brouillard salinRésistance à la corrosionIEC 60068-2-11

Enregistrement des résultats de cyclage thermique

Un test de cyclage thermique fait passer un produit par des températures extrêmes pendant des centaines de cycles. Après chaque cycle (ou lot de cycles), effectuez une vérification fonctionnelle et enregistrez les résultats.

thermal_cycling_test.py
from tofupilot import TofuPilotClient

client = TofuPilotClient()

def log_thermal_cycle_check(serial, cycle_number, temp_profile, functional_results):
    """Enregistrer les résultats de la vérification fonctionnelle post-cycle."""
    measurements = [
        {"name": "cycle_number", "value": cycle_number, "unit": "cycles"},
        {"name": "temp_high_c", "value": temp_profile["high"], "unit": "°C"},
        {"name": "temp_low_c", "value": temp_profile["low"], "unit": "°C"},
        {"name": "dwell_time_min", "value": temp_profile["dwell"], "unit": "min"},
    ]

    # Ajouter les mesures fonctionnelles prises après l'exposition thermique
    for name, result in functional_results.items():
        measurements.append({
            "name": name,
            "value": result["value"],
            "unit": result["unit"],
            "limit_low": result.get("limit_low"),
            "limit_high": result.get("limit_high"),
        })

    all_pass = all(
        r.get("limit_low", float("-inf")) <= r["value"] <= r.get("limit_high", float("inf"))
        for r in functional_results.values()
    )

    client.create_run(
        procedure_id="THERMAL-CYCLING-500",
        unit_under_test={"serial_number": serial},
        run_passed=all_pass,
        steps=[{
            "name": f"Vérification fonctionnelle post-cycle {cycle_number}",
            "step_type": "measurement",
            "status": all_pass,
            "measurements": measurements,
        }],
    )

# Exemple : vérification toutes les 50 cycles
for cycle in range(50, 501, 50):
    functional = {
        "vcc_3v3": {"value": measure_voltage(), "unit": "V", "limit_low": 3.25, "limit_high": 3.35},
        "current_ma": {"value": measure_current() * 1000, "unit": "mA", "limit_low": 30, "limit_high": 60},
        "comm_check": {"value": 1 if uart_ok() else 0, "unit": "bool", "limit_low": 1},
    }
    log_thermal_cycle_check(
        serial="EVT-UNIT-003",
        cycle_number=cycle,
        temp_profile={"high": 85, "low": -40, "dwell": 15},
        functional_results=functional,
    )

Suivi de la dégradation au fil des cycles

La question clé des tests environnementaux : « À partir de quel moment le produit commence-t-il à se dégrader ? »

Le suivi de tendance des mesures de TofuPilot montre comment chaque paramètre évolue au fil des cycles thermiques :

  • Cycle 50 : vcc_3v3 = 3,31V (nominal)
  • Cycle 200 : vcc_3v3 = 3,30V (toujours nominal)
  • Cycle 350 : vcc_3v3 = 3,28V (dérive)
  • Cycle 450 : vcc_3v3 = 3,26V (approche de la limite)
  • Cycle 500 : vcc_3v3 = 3,24V (en dessous de la limite, ÉCHEC)

Cette courbe de dégradation vous indique que le produit survit à plus de 400 cycles avant que le rail 3,3V ne dérive hors spécification. Si votre spécification exige 500 cycles, un changement de conception est nécessaire.

Tests HALT

Le HALT trouve les faiblesses de conception en poussant les produits au-delà de leurs spécifications. Il n'y a pas de limites de réussite/échec. L'objectif est de trouver le point de rupture.

halt_test.py
# Résultats de stress par paliers HALT
halt_steps = [
    {"stress": "Cold Step", "temp_c": -40, "functional": True},
    {"stress": "Cold Step", "temp_c": -50, "functional": True},
    {"stress": "Cold Step", "temp_c": -60, "functional": False},  # Limite de fonctionnement basse trouvée
    {"stress": "Hot Step", "temp_c": 85, "functional": True},
    {"stress": "Hot Step", "temp_c": 95, "functional": True},
    {"stress": "Hot Step", "temp_c": 105, "functional": False},  # Limite de fonctionnement haute trouvée
    {"stress": "Vibration", "grms": 10, "functional": True},
    {"stress": "Vibration", "grms": 20, "functional": True},
    {"stress": "Vibration", "grms": 30, "functional": False},  # Limite de vibration trouvée
]

steps = []
for h in halt_steps:
    steps.append({
        "name": f"{h['stress']} - {'temp_c' in h and f\"{h['temp_c']}°C\" or f\"{h['grms']}Grms\"}",
        "step_type": "measurement",
        "status": h["functional"],
        "measurements": [{
            "name": "functional_after_stress",
            "value": 1 if h["functional"] else 0,
            "unit": "pass/fail",
        }],
    })

client.create_run(
    procedure_id="HALT-STEP-STRESS",
    unit_under_test={"serial_number": "EVT-UNIT-001"},
    run_passed=True,  # Le HALT « réussit » toujours — il s'agit de trouver les limites
    steps=steps,
)

Matrice de tests environnementaux

Suivez quels tests environnementaux ont été réalisés sur vos variantes produit.

Variante produitCyclage thermiqueHumiditéVibrationHALTESD
Rev A500 cycles ✓85/85 ✓10G ✓Fait ✓8kV ✓
Rev B250/500En attenteEn attenteFait ✓8kV ✓
Rev C (nouveau layout)Non commencéNon commencéNon commencéEn attenteNon commencé

TofuPilot suit l'avancement automatiquement. Si THERMAL-CYCLING-500 a un run réussi pour « Rev A », il s'affiche comme terminé. Pas besoin de maintenir un tableur.

Filtrage en production (HASS/ESS)

Le filtrage par stress environnemental en production détecte les défaillances de mortalité infantile. Faites passer chaque unité par un court cycle thermique et un profil de vibration, puis un test fonctionnel.

production_screen.py
# Filtrage rapide en production : 10 cycles thermiques + vibration
client.create_run(
    procedure_id="ESS-PRODUCTION-SCREEN",
    unit_under_test={"serial_number": "PROD-UNIT-4521"},
    run_passed=True,
    steps=[
        {
            "name": "Fonctionnel post-thermique",
            "step_type": "measurement",
            "status": True,
            "measurements": [
                {"name": "vcc_3v3", "value": 3.31, "unit": "V", "limit_low": 3.25, "limit_high": 3.35},
                {"name": "current_ma", "value": 44, "unit": "mA", "limit_low": 30, "limit_high": 60},
            ],
        },
        {
            "name": "Fonctionnel post-vibration",
            "step_type": "measurement",
            "status": True,
            "measurements": [
                {"name": "vcc_3v3", "value": 3.30, "unit": "V", "limit_low": 3.25, "limit_high": 3.35},
                {"name": "current_ma", "value": 45, "unit": "mA", "limit_low": 30, "limit_high": 60},
            ],
        },
    ],
)

Suivez le rendement ESS séparément du rendement du test fonctionnel. Si l'ESS détecte 0,5 % des unités ayant passé le test fonctionnel, il se rentabilise en évitant des défaillances terrain.

Plus de guides

Mettez ce guide en pratique