projet crepp_git/crepp-projects/station-meteo/firmware/receiver/v1.0 · branche main
#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;
}