Genera un CSV con la temperatura `T` di un sensore IR e la differenza `ΔT = T − T_amb`, con rumore, quantizzazione e jitter dei tempi simili a un sensore reale. `T` parte dalla temperatura ambiente, sale con i gradini di riscaldamento e ridiscende fino a `T_amb`.
Python ≥ 3.11 con `numpy` e `matplotlib` (quest'ultimo solo per il grafico), in un ambiente virtuale `.venv` nella cartella del progetto. Lo si crea con [uv](https://docs.astral.sh/uv/), più veloce di `venv` + `pip`:
```bash
uv venv .venv
uv pip install numpy matplotlib
source .venv/bin/activate # poi si usa `python ...`; senza attivare: `.venv/bin/python ...`
```
`.venv/` è ignorato da git. Con `venv` classico: `python -m venv .venv && .venv/bin/pip install numpy matplotlib`.
curl -LsSf https://astral.sh/uv/install.sh | sh # Linux e macOS
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"# Windows
pip install uv # alternativa, se hai già Python
```
Apri un nuovo terminale e verifica con `uv --version`. Altre opzioni (Homebrew, WinGet, ecc.) sono nella [guida ufficiale](https://docs.astral.sh/uv/getting-started/installation/).
Tutti i valori numerici sono in [config.toml](config.toml) (nessuno è scritto nello script). Le unità sono nei suffissi delle chiavi: `_s` secondi, `_ms` millisecondi, `_c` gradi C, `_hz` 1/s. Una chiave mancante è un errore (exit 1, messaggio in italiano), così come un intervallo `[min, max]` non valido (non una coppia di numeri, o min > max).
Le chiavi scritte come intervallo `[min, max]` vengono sorteggiate a ogni corsa (`[x, x]` = valore fisso). Per cambiare il profilo di riscaldamento si modificano `n_gradini`, `t_primo_gradino_s`, `distanza_gradini_s`, `dT_gradino_c` e `k_raffreddamento_hz`. `durata_s` deve essere abbastanza lunga perché `T` torni a `T_amb`.
Elenco completo delle funzionalità in [docs/FUNZIONALITA.md](docs/FUNZIONALITA.md). Modello, passi di calcolo, controlli di accettazione e limiti sono in [docs/SPEC.md](docs/SPEC.md).