#pragma once
#include <Arduino.h>
// ============================================================================
// PARAMÈTRES MATÉRIEL (HARDWARE)
// ============================================================================
// ─── Écran TFT ─────────────────────────────────────────────────────────────
#define TFT_BL 22 // Pin backlight
#define SCREEN_W 320 // Largeur écran (pixels)
#define SCREEN_H 240 // Hauteur écran (pixels)
#define TFT_ROTATION 1 // Rotation écran (0-3)
// ─── Carte SD (SPI0) ──────────────────────────────────────────────────────
#define SD_CS_PIN 20 // Chip Select
#define SD_MISO_PIN 16 // MISO (Master In Slave Out)
#define SD_MOSI_PIN 19 // MOSI (Master Out Slave In)
#define SD_SCK_PIN 18 // Clock
// ─── Audio I2S ────────────────────────────────────────────────────────────
#define AUDIO_DIN_PIN 26 // Data In (SD)
#define AUDIO_BCK_PIN 27 // Bit Clock (SCK)
#define AUDIO_LCK_PIN 28 // Left/Right Clock (WS)
#define AUDIO_AMPLIFIER_PIN 22 // Amplificateur enable (pin 22 déjà utilisé pour backlight, à adapter)
// ─── Boutons PCF8574 ──────────────────────────────────────────────────────
#define BUTTON_COUNT 5
#define INTERRUPT_BUTTON_PIN 21 // Pin interruption
#define BUTTON_DEBOUNCE_MS 200 // Anti-rebond (millisecondes)
// Mapping des boutons (selon votre câblage PCF8574)
#define BTN_LEFT 0
#define BTN_RIGHT 1
#define BTN_UP 2
#define BTN_DOWN 3
#define BTN_CENTER 4
// ─── Capteur BME280 ───────────────────────────────────────────────────────
#define BME280_I2C_ADDR 0x76 // Adresse I2C (0x76 ou 0x77)
// ============================================================================
// PARAMÈTRES LOGICIEL (SOFTWARE)
// ============================================================================
// ─── Mise à jour des données ──────────────────────────────────────────────
#define WEATHER_UPDATE_MS 10000 // Météo externe (10 secondes)
#define INDOOR_UPDATE_MS 3000 // Capteurs intérieurs (3 secondes)
#define EMAIL_CHECK_MS 30000 // Nouveaux emails (30 secondes)
#define DEBUG_LOG_MS 5000 // Logs debug (5 secondes)
// ─── Widgets - Fréquence de rafraîchissement ──────────────────────────────
#define WIDGET_TEMP_UPDATE_MS 10000 // Widget température (10 secondes)
#define WIDGET_FORECAST_UPDATE_MS 30000 // Widget prévisions (30 secondes)
#define WIDGET_CHART_UPDATE_MS 60000 // Widget graphique (60 secondes)
#define WIDGET_SUN_UPDATE_MS 60000 // Widget soleil (60 secondes)
#define WIDGET_AQI_UPDATE_MS 60000 // Widget AQI (60 secondes)
// ─── Gestionnaire de widgets ─────────────────────────────────────────────
#define WIDGET_MANAGER_UPDATE_MS 100 // Cycle de mise à jour des widgets (100ms)
#define MAX_WIDGETS 30 // Nombre maximum de widgets
// ─── Interface utilisateur ───────────────────────────────────────────────
#define TAB_BAR_HEIGHT 30 // Hauteur barre d'onglets (pixels)
#define CONTENT_START_Y 32 // Début du contenu (pixels)
#define TAB_COUNT 5 // Nombre d'onglets
// ─── Mise en page ────────────────────────────────────────────────────────
#define MARGIN 8 // Marge générale (pixels)
#define GAP 6 // Espacement entre éléments (pixels)
#define RADIUS 3 // Rayon coins arrondis (pixels)
#define LEFT_W 180 // Largeur colonne gauche
#define RIGHT_X LEFT_W // Position X colonne droite
#define RIGHT_W SCREEN_W - LEFT_W // Largeur colonne droite
// ============================================================================
// PARAMÈTRES MÉTÉO (WEATHER)
// ============================================================================
// ─── Seuils et alertes ───────────────────────────────────────────────────
#define TEMP_WARNING_HIGH 35.0f // Alerte température élevée (°C)
#define TEMP_WARNING_LOW 0.0f // Alerte température basse (°C)
#define HUMIDITY_WARNING_HIGH 80.0f // Alerte humidité élevée (%)
#define HUMIDITY_WARNING_LOW 20.0f // Alerte humidité basse (%)
#define UV_DANGER_THRESHOLD 8 // Seuil UV danger
#define AQI_POOR_THRESHOLD 100 // Seuil AQI médiocre
#define AQI_BAD_THRESHOLD 150 // Seuil AQI mauvais
// ─── Intervalles simulations (mode sans capteur) ──────────────────────────
#define SIM_TEMP_MIN 10 // Température minimale simulée (°C)
#define SIM_TEMP_MAX 30 // Température maximale simulée (°C)
#define SIM_HUMIDITY_MIN 30 // Humidité minimale simulée (%)
#define SIM_HUMIDITY_MAX 90 // Humidité maximale simulée (%)
#define SIM_PRESSURE_MIN 980 // Pression minimale simulée (hPa)
#define SIM_PRESSURE_MAX 1040 // Pression maximale simulée (hPa)
// ============================================================================
// PARAMÈTRES AUDIO
// ============================================================================
#define AUDIO_VOLUME_DEFAULT 0.03f // Volume par défaut (0.0 à 1.0)
#define AUDIO_BUFFER_SIZE 512 // Taille buffer audio
#define AUDIO_SAMPLE_RATE 44100 // Fréquence échantillonnage (Hz)
// Fichiers audio à rechercher sur la carte SD
const char* AUDIO_CANDIDATES[] = {
"/MUSIC.WAV", "/music.wav",
"/AUDIO.WAV", "/audio.wav",
"/MUSIC.MP3", "/music.mp3",
"/AUDIO.MP3", "/audio.mp3"
};
#define AUDIO_CANDIDATES_COUNT 8
// ============================================================================
// PARAMÈTRES ONGLETS (TABS)
// ============================================================================
// Noms des onglets (ordre d'affichage)
const char* TAB_NAMES[] = {
"Meteo",
"Courrier",
"Debug",
"Interieur",
"BME280"
};
// ============================================================================
// PARAMÈTRES COURRIER (EMAIL)
// ============================================================================
#define MAX_EMAILS 5 // Nombre maximum d'emails
#define EMAIL_SENDER_LEN 32 // Longueur champ expéditeur
#define EMAIL_SUBJECT_LEN 48 // Longueur champ sujet
#define NEW_EMAIL_PROBABILITY 20 // Probabilité nouvel email (%)
#define EMAIL_ITEM_HEIGHT 50 // Hauteur d'un email (pixels)
// ============================================================================
// PARAMÈTRES CAPTEURS INTÉRIEURS
// ============================================================================
#define MAX_SENSORS 4 // Nombre maximum de capteurs
#define SENSOR_NAME_LEN 20 // Longueur nom capteur
#define SENSOR_BATTERY_MAX 100 // Batterie max (%)
#define SENSOR_BATTERY_DRAIN 1 // Drain batterie par cycle
#define BATTERY_DRAIN_CHANCE 10 // Chance de drain batterie (%)
// ============================================================================
// PARAMÈTRES DEBUG
// ============================================================================
#define DEBUG_BUFFER_SIZE 2048 // Taille buffer logs
#define DEBUG_MAX_LINES 12 // Lignes affichées dans l'onglet Debug
#define DEBUG_LOG_LEVEL 1 // 0=Silencieux, 1=Normal, 2=Verbose
// ============================================================================
// PARAMÈTRES COMMUNICATION INTER-CŒURS
// ============================================================================
#define CORE_SYNC_TIMEOUT_MS 5000 // Timeout synchronisation entre cœurs
// ============================================================================
// PARAMÈTRES RÉSEAU (optionnel - pour futur)
// ============================================================================
// #define ENABLE_WIFI 1 // Activer WiFi
// #define ENABLE_NTP 1 // Activer NTP (heure automatique)
// #define NTP_SERVER "pool.ntp.org"
// #define TIMEZONE_OFFSET 3600 // Décalage horaire (secondes)
// ============================================================================
// MACROS UTILITAIRES
// ============================================================================
// Conversion degrés Celsius ↔ Fahrenheit
#define C_TO_F(c) (((c) * 9.0f / 5.0f) + 32.0f)
#define F_TO_C(f) (((f) - 32.0f) * 5.0f / 9.0f)
// Contrainte de valeur
#define CLAMP(value, min, max) ((value) < (min) ? (min) : ((value) > (max) ? (max) : (value)))
// Arrondi entier
#define ROUND(x) ((int)((x) + 0.5f))
// Conversion pourcentage
#define PERCENT(value, max) (((float)(value) / (float)(max)) * 100.0f)
// ============================================================================
// FONCTIONS INLINE UTILES
// ============================================================================
// Vérifier si une valeur est dans une plage
inline bool inRange(float value, float min, float max) {
return (value >= min && value <= max);
}
// Obtenir l'état d'une valeur (pour affichage conditionnel)
inline const char* getStatusLabel(float value, float goodMin, float goodMax) {
if (value < goodMin) return "BAS";
if (value > goodMax) return "HAUT";
return "OK";
}
// Obtenir la couleur selon une valeur
inline uint16_t getStatusColor(float value, float goodMin, float goodMax,
uint16_t colorLow, uint16_t colorGood, uint16_t colorHigh) {
if (value < goodMin) return colorLow;
if (value > goodMax) return colorHigh;
return colorGood;
}