From d6712d80d6447c27317f238b0838d783e02c6ead Mon Sep 17 00:00:00 2001 From: Alexis Fourmaux Date: Wed, 6 May 2026 20:30:08 +0200 Subject: [PATCH] feat: add display of counter value --- lib/GazDisplay/GazDisplay.cpp | 57 +++++++++++++++++++++++++++++++++++ lib/GazDisplay/GazDisplay.h | 21 +++++++++++++ platformio.ini | 3 ++ src/config.h | 3 +- src/main.cpp | 39 +++++++++++++++++++----- 5 files changed, 115 insertions(+), 8 deletions(-) create mode 100644 lib/GazDisplay/GazDisplay.cpp create mode 100644 lib/GazDisplay/GazDisplay.h diff --git a/lib/GazDisplay/GazDisplay.cpp b/lib/GazDisplay/GazDisplay.cpp new file mode 100644 index 0000000..0728d3e --- /dev/null +++ b/lib/GazDisplay/GazDisplay.cpp @@ -0,0 +1,57 @@ +#include "GazDisplay.h" + +Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST); + +DisplayError displayInit() +{ + if (OLED_RST >= 0) + { + pinMode(OLED_RST, OUTPUT); + digitalWrite(OLED_RST, LOW); + delay(20); + digitalWrite(OLED_RST, HIGH); + } + Wire.begin(OLED_SDA, OLED_SCL); + + if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) + { + Serial.println("[OLED] Ecran non détecté !"); + return DisplayError::INIT_FAILED; + } + display.clearDisplay(); + display.display(); + + return DisplayError::OK; +} + +void displayGasIndex(uint32_t pulses) +{ + float indexM3 = pulses * 0.010f; + + display.clearDisplay(); + + // Titre + display.setTextSize(1); + display.setTextColor(SSD1306_WHITE); + display.setCursor(0, 0); + display.println("Index gaz"); + + // Ligne + display.drawLine(0, 10, 128, 10, SSD1306_WHITE); + + // Valeur en grand + display.setTextSize(2); + display.setCursor(0, 18); + display.printf("%.3f", indexM3); + + // Unité + display.setTextSize(1); + display.setCursor(112, 25); + display.println("m3"); + + // Impulsions en petit + display.setCursor(0, 54); + display.printf("Impulsions : %lu", pulses); + + display.display(); +} \ No newline at end of file diff --git a/lib/GazDisplay/GazDisplay.h b/lib/GazDisplay/GazDisplay.h new file mode 100644 index 0000000..24ceadc --- /dev/null +++ b/lib/GazDisplay/GazDisplay.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include +#include + +#define OLED_SDA 21 +#define OLED_SCL 22 +#define OLED_RST -1 + +#define SCREEN_WIDTH 128 +#define SCREEN_HEIGHT 64 + +enum class DisplayError : int16_t { + OK = 0, + INIT_FAILED = -1 +}; + +void displayInit(); +void displayGasIndex(uint32_t pulses); + diff --git a/platformio.ini b/platformio.ini index 9eab106..6ddd65a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -19,4 +19,7 @@ build_flags = -DT3_V1_6_SX1276 lib_deps = + adafruit/Adafruit SSD1306 @ ^2.5.15 + adafruit/Adafruit GFX Library @ ^1.12.1 + adafruit/Adafruit BusIO @ ^1.16.3 jgromes/RadioLib@6.6.0 \ No newline at end of file diff --git a/src/config.h b/src/config.h index 79a3bc1..96927f5 100644 --- a/src/config.h +++ b/src/config.h @@ -1,6 +1,7 @@ #pragma once -#define MAX_RESTART 3 +#define MAX_RESTART 1 +#define MAX_FATAL_RESTART 3 uint64_t joinEUI = 0x35f48318e1324e2e; uint64_t devEUI = 0x0586fe41112d83d9; diff --git a/src/main.cpp b/src/main.cpp index f0b6c34..caf7619 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,8 +1,10 @@ #include #include #include +#include #include "config.h" +RTC_DATA_ATTR uint8_t fatalRestartCount = 0; RTC_DATA_ATTR uint8_t restartCount = 0; ITransmitter* transmitter = new LoRaTransmitter( @@ -17,21 +19,34 @@ void fatalError(const char* msg){ Serial.flush(); delay(100); - if (restartCount < MAX_RESTART) { - restartCount++; - Serial.printf("[FATAL] Redémarrage %d/3\n", restartCount); + if (fatalRestartCount < MAX_FATAL_RESTART) { + fatalRestartCount++; + Serial.printf("[FATAL] Redémarrage %d/3\n", fatalRestartCount); Serial.flush(); ESP.restart(); } - Serial.printf("[FATAL] %d redémarrages : l'appareil entre en sommeil profond permanent\n", MAX_RESTART); + Serial.printf("[FATAL] %d redémarrages : l'appareil entre en sommeil profond permanent\n", MAX_FATAL_RESTART); Serial.flush(); esp_deep_sleep_start(); } -void generateDailyGasPayload(uint8_t *payload){ - uint32_t pulses = simulateGasPulses(86400); +void nonCriticalError(const char* msg){ + Serial.printf("[Error] %s\n", msg); + Serial.flush(); + delay(100); + if (restartCount < MAX_RESTART) { + restartCount++; + Serial.printf("[Error] Tentative de redémarrage\n", restartCount); + Serial.flush(); + ESP.restart(); + } + + Serial.printf("[Error] %d redémarrage : l'appareil continue en mode dégradé\n", MAX_RESTART); +} + +void generateDailyGasPayload(uint32_t pulses, uint8_t *payload){ payload[0] = (pulses >> 24) & 0xFF; payload[1] = (pulses >> 16) & 0xFF; payload[2] = (pulses >> 8) & 0xFF; @@ -41,6 +56,10 @@ void generateDailyGasPayload(uint8_t *payload){ void setup() { Serial.begin(115200); delay(2000); + + if (displayInit() != DisplayError::OK){ + nonCriticalError("Initialisation du périphérique d'affichage échouée"); + } if (transmitter->init() != TransmitError::OK){ fatalError("Initialisation du périphérique radio échouée"); @@ -53,9 +72,15 @@ void setup() { void loop() { uint8_t payload[4]; - generateDailyGasPayload(payload); + uint32_t pulses = simulateGasPulses(86400); + + displayGasIndex(pulses); + + generateDailyGasPayload(pulses, payload); transmitter->send(payload, sizeof(payload)); Serial.flush(); + + delay(2000); esp_deep_sleep(60000000); } \ No newline at end of file