Skip to content
Table of contents

ESP32-7SEG: An embedded clock with network setup

ESP32-7SEG connects an ESP32 clock display to network configuration and an HTTP interface. The firmware startup decides whether saved Wi-Fi settings can be reused or whether the device needs its setup path.

Hardware and graphics
  • Updated
  • 1
  • Kotlin · 58.26%
  • MIT
Documented components
2Explore modules
Source documents
2Read the instructions
Repository languagesKotlin 58.26%3

Shares calculated from GitHub Linguist bytes.

Kotlin58.26%
58.26%62,877 bytes
C++39.56%
39.56%42,693 bytes
C2.18%
2.18%2,350 bytes
Language%Bytes
Kotlin58.26%62,877
C++39.56%42,693
C2.18%2,350

1. Overview

1.1. Why it exists

Embedded microcontroller firmware and mobile controller for driving multi-digit 7-segment displays.

1.2. Best fit

Physical computing status dashboards and hardware displays.

2. Use cases

ESP32 firmware and an Android app that drive an I2C 7-segment display as a countdown or stopwatch over Wi-Fi.

Use-case diagram for ESP32-7SEG: Join the board to Wi-Fi; Start a countdown or stopwatch; Set the digits directly; Follow updates live; Control it from AndroidESP32-7SEGJoin the board to Wi-FiStart a countdown or stopwatchSet the digits directlyFollow updates liveControl it from AndroidTimer operator«system»ESP32 + 7-seg display«system»Android app
People on the left, external systems on the right; each oval is a use case backed by the files cited below.
Join the board to Wi-Fi
Timer operatorESP32 + 7-seg display

Without saved credentials, wifi.cpp starts an access point named ESPTimer; the / page then serves the setup form, and POST /connect stores the SSID and password in NVS.

Start a countdown or stopwatch
Timer operatorESP32 + 7-seg display

POST /timer-action with action, mode, minutes and seconds starts, pauses or stops a FreeRTOS task (COUNTDOWN or STOPWATCH) in display.cpp.

Set the digits directly
Timer operatorESP32 + 7-seg display

POST /update-display with minutes and seconds calls updateDisplay() and pushes a displayUpdated message.

Follow updates live
Android appESP32 + 7-seg display

The /ws WebSocket broadcasts timerStarted, timerStopped and displayUpdated JSON; the Android WebSocketClient listens to it.

Control it from Android
Timer operatorAndroid app

TimerApiService.kt maps the same endpoints with Retrofit (/timer-action, /connect, /scan, /update-display, /device-info) behind the TimerControl and WiFiConnect fragments.

2.1. Scenario: Setting up a 5-minute countdown on a fresh board

  1. Wire the Adafruit I2C backpack to SDA, SCL, VCC and GND, then flash the firmware with pio run -t upload (env firebeetle).
  2. On first boot no credentials are in NVS, so join the ESPTimer access point and open the board's page.
  3. Pick a network from /scan and submit it to /connect; the board saves it and joins the LAN.
  4. Read the new IP in the serial monitor at 115200 baud and open it in a browser or the Android app.
  5. Send action=start, mode=countdown, minutes=5, seconds=0 to /timer-action; the display counts down and /ws reports each update.

Files readREADME.mdplatformio.inisrc/main.cppsrc/wifi.cppsrc/web_server.cppsrc/display.cppinclude/display.handroid/app/src/main/java/com/esptimer/api/TimerApiService.kt.github/workflows/firmware.yml

3. Getting started

These commands come from the repository documentation. They were not run during this review.

4. Repository references

Excerpts from the repository’s guides, in their original language. Links open the inspected source revision.

Prerequisites and first run

4.1. Prerequisites

README.md

  • Hardware: ESP32 FireBeetle board (v1.0), Adafruit 7-segment display (I2C backpack), breadboard, and jumper wires.
  • Software: Git, PlatformIO or Arduino IDE, and necessary ESP32 libraries.
Read the full instructions ↗

4.2. Software Installation

README.md

  1. Clone the Repository:
  2. Open and Configure the Project: Load the project into PlatformIO or the Arduino IDE. Install any required libraries as specified in platformio.ini or the project documentation.
  3. Upload to the ESP32: Compile and upload the code to your ESP32 board to start the project.
Read the full instructions ↗

4.3. Software Installation (readme.md)

readme.md

  1. Clone the repository to your local machine.
  2. Open the project with your preferred IDE or editor that supports PlatformIO or the Arduino IDE.
  3. Install the necessary libraries mentioned in the platformio.ini file or the Arduino project.
  4. Upload the code to your ESP32 FireBeetle board.
Read the full instructions ↗
Configuration and usage

4.4. Hardware Setup

README.md

  1. Display Connections: Connect the Adafruit 7-segment display to the ESP32 using the I2C interface. Make sure to connect the SCL and SDA pins correctly, along with VCC and GND for power.
  2. Power Supply: Power the ESP32 board through USB or an external power supply to ensure stable operation.
Read the full instructions ↗

4.5. Usage

README.md

  • Access the Web Server: After booting, the ESP32 launches a web server. Find its IP address in the serial monitor and navigate to it using a web browser.
  • Update Display via Web Interface: Use the web interface to input and submit the content you want to be displayed. The ESP32 will update the 7-segment display in real-time.
Read the full instructions ↗

4.6. Hardware Setup (readme.md)

readme.md

  1. Connect the 7-segment display to the ESP32 according to the provided wiring diagram.
  2. Ensure a stable power supply for the ESP32 board.
Read the full instructions ↗

4.7. Usage (readme.md)

readme.md

After uploading the code to your ESP32 board:

  1. Connect the ESP32 to a power source.
  2. The ESP32 starts a web server accessible within your local network.
  3. Find the ESP32’s IP address from your serial monitor and visit the provided IP using a web browser.
  4. Use the web interface to update the 7-segment display’s content.
Read the full instructions ↗
Development and contributions

4.8. Contributing

README.md

We welcome contributions! If you have suggestions for improvements or find a bug, please feel free to fork the repository, make your changes, and submit a pull request.
Read the full instructions ↗

4.9. Contributing (readme.md)

readme.md

Contributions to improve the project are welcome. Please feel free to fork the repository and submit pull requests.
Read the full instructions ↗
Source documentation

2 documents read from 2 candidates.

5. Features and components 2

Boot and connectivity
setup initializes NVS and checks its result. It loads saved credentials, attempts a connection and falls back to setupWiFi if needed. The same fallback runs when no saved credentials exist.
Display and web modules
After connectivity setup, main.cpp calls startClockDisplay and setupWebServer. display.cpp, wifi.cpp and web_server.cpp keep hardware display, connection management and HTTP handling in separate modules.

6. Architecture

Expand a component to follow its connections, or explore the full diagram.

System components Context
Mermaid Interactive diagram

System overview of the components and connections verified in the repository.

Static architecture view for ESP32-7SEG
Static preview. The interactive diagram replaces it after Mermaid loads.
flowchart LR
node_operator(("User"))
node_browser(("Browser"))
node_display_hw{{"7-segment display"}}

subgraph group_firmware["ESP32 firmware"]
  node_boot["Firmware startup<br/>[main.cpp]"]
  node_wifi["Wi-Fi setup<br/>[wifi.cpp]"]
  node_credentials[("Wi-Fi credentials<br/>[wifi.cpp]")]
  node_timer_display["Timer display<br/>[display.cpp]"]
end

subgraph group_web["Web control"]
  node_http_server["HTTP and WebSocket server<br/>[web_server.cpp]"]
  node_web_pages["Browser interface<br/>[web_page.h]"]
end

subgraph group_android["Android app"]
  node_android_entry["Android navigation<br/>[MainActivity.kt]"]
  node_timer_ui["Timer controls"]
  node_wifi_ui["Wi-Fi onboarding"]
  node_settings_ui["Settings"]
  node_browser_ui["Embedded browser view"]
  node_stop_receiver["Timer stop receiver"]
  node_settings_adapter["Settings list adapter<br/>[SettingsAdapter.kt]"]
end

subgraph group_android_net["Android networking"]
  node_timer_api["Timer API contract<br/>[TimerApiService.kt]"]
  node_retrofit["HTTP client setup"]
  node_ws_client["WebSocket client<br/>[WebSocketClient.kt]"]
  node_preferences[("App preferences")]
end

node_operator -->|"controls"| node_browser
node_browser -->|"submits controls"| node_http_server
node_boot -->|"loads or configures"| node_wifi
node_boot -->|"starts display"| node_timer_display
node_boot -->|"starts server"| node_http_server
node_wifi -->|"reads and writes"| node_credentials
node_http_server -->|"handles Wi-Fi routes"| node_wifi
node_http_server -->|"dispatches timer updates"| node_timer_display
node_http_server -->|"serves pages"| node_web_pages
node_timer_display -->|"drives display"| node_display_hw
node_operator -.->|"uses app"| node_android_entry
node_settings_ui -->|"uses adapter"| node_settings_adapter
node_retrofit -->|"creates service"| node_timer_api
node_retrofit -->|"initializes preferences"| node_preferences
node_timer_ui -->|"registers timer events"| node_stop_receiver
node_timer_api -.->|"calls matching routes"| node_http_server
node_ws_client -.->|"connects to socket"| node_http_server
group_android --> group_android_net
class node_boot,node_wifi,node_credentials,node_timer_display,node_operator,node_browser toneBlue
class node_http_server,node_web_pages toneAmber
class node_android_entry,node_timer_ui,node_wifi_ui,node_settings_ui,node_browser_ui,node_stop_receiver,node_settings_adapter toneMint
class node_timer_api,node_retrofit,node_ws_client,node_preferences toneRose
class node_display_hw toneIndigo

ESP32 firmware for a network-controlled seven-segment timer with an Android companion app. Firmware startup loads Wi-Fi, starts the display and web server, while browser and Android controls send timer and onboarding requests.

Components
20
Connections
21
Evidence-backed links
18/21
Text version of the diagram

The diagram merges parallel links between groups, so it shows 18 of 21. Full list:

  • User → Browser (controls)
  • Browser → HTTP and WebSocket server (submits controls)
  • Firmware startup → Wi-Fi setup (loads or configures)
  • Firmware startup → Timer display (starts display)
  • Firmware startup → HTTP and WebSocket server (starts server)
  • Wi-Fi setup → Wi-Fi credentials (reads and writes)
  • HTTP and WebSocket server → Wi-Fi setup (handles Wi-Fi routes)
  • HTTP and WebSocket server → Timer display (dispatches timer updates)
  • HTTP and WebSocket server → Browser interface (serves pages)
  • Timer display → 7-segment display (drives display)
  • User → Android navigation (uses app)
  • Timer controls → HTTP client setup (requests timer actions)
  • Timer controls → WebSocket client (opens timer socket)
  • Wi-Fi onboarding → HTTP client setup (sends credentials)
  • Settings → Settings list adapter (uses adapter)
  • Settings → HTTP client setup (loads device data)
  • HTTP client setup → Timer API contract (creates service)
  • HTTP client setup → App preferences (initializes preferences)
  • Timer controls → Timer stop receiver (registers timer events)
  • Timer API contract → HTTP and WebSocket server (calls matching routes)
  • WebSocket client → HTTP and WebSocket server (connects to socket)
Follow one path through the code

Follow the saved-credentials branch in setup. A stored network is attempted first, but failure still reaches setupWiFi. Only after that branch does the code start the display and web server.

7. Technical dossier

Built from the source at commit 6cac20e (39 files). Each item comes from a pattern match in the code, so open the linked file before relying on it.

7.1. Layers and modules

Folders are sorted into layers by name, from the user interface down to data access. Because the sorting uses names only, the diagram says nothing about calls between layers.

Mermaid Layered view
flowchart TB
  subgraph L_presentation["Presentation"]
    direction TB
    presentation_0["android/res<br/>39 files"]
  end
  subgraph L_interface["Entry points and API"]
    direction TB
    interface_0["android/esptimer<br/>3 files"]
    interface_1["src<br/>2 files"]
    interface_2["include<br/>1 file"]
  end
  subgraph L_application["Application services"]
    direction TB
    application_0["android/esptimer<br/>8 files"]
    application_1["android/example<br/>2 files"]
    application_2["android/main<br/>1 file"]
  end
  subgraph L_core["Core source"]
    direction TB
    core_0["include<br/>5 files"]
    core_1["src<br/>3 files"]
  end
  subgraph L_tests["Tests"]
    direction TB
    tests_0["android<br/>4 files"]
  end
  subgraph L_hosting["Build, CI and hosting"]
    direction TB
    hosting_0["(root)<br/>1 file"]
    hosting_1[".github<br/>1 file"]
  end
  L_presentation ~~~ L_interface
  L_interface ~~~ L_application
  L_application ~~~ L_core
  L_core ~~~ L_tests
  L_core ~~~ L_hosting
Modules and their main layer
ModuleLayerFilesTypesExtensions
android/resPresentation390.xml
android/esptimerApplication services1114.kt
includeCore source60.h
srcCore source51.cpp
android/exampleApplication services22.kt
android/mainApplication services10.xml

7.2. C4 model

From system context to code declarations. Each level reflects the available source evidence.

UML 1 · System context
1 · System context

The widest C4 view: who uses the project and which outside systems and data stores it relies on. Rendered with uml-mcp.

PlantUML source
@startuml
!include <C4/C4_Context>
LAYOUT_LEFT_RIGHT()
System(SYS, "ESP32-7SEG", "ESP32-7SEG connects an ESP32 clock display to network configuration a…")
@enduml
UML 2 · Containers
2 · Containers

One level closer: the parts that run separately inside the project, their main language and how calls flow between them. Rendered with uml-mcp.

PlantUML source
@startuml
!include <C4/C4_Container>
LAYOUT_LEFT_RIGHT()
System_Boundary(SYS, "ESP32-7SEG") {
  Container(APP, "ESP32-7SEG", "Kotlin")
}
@enduml
UML 3 · Components and layers
3 · Components and layers

Modules grouped by source-layer classification. Boundaries show organization, not runtime isolation or call relationships. Rendered with uml-mcp.

PlantUML source
@startuml
!include <C4/C4_Component>
LAYOUT_TOP_DOWN()
System_Boundary(SYS, "ESP32-7SEG") {
Boundary(L0, "Presentation", "layer") {
Component(M0_0, "android/res", ".xml", "39 files")
}
Boundary(L1, "Entry points and API", "layer") {
Component(M1_0, "android/esptimer", "Kotlin", "3 files")
Component(M1_1, "src", "C++", "2 files")
Component(M1_2, "include", "C/C++", "1 files")
}
Boundary(L2, "Application services", "layer") {
Component(M2_0, "android/esptimer", "Kotlin", "8 files")
Component(M2_1, "android/example", "Kotlin", "2 files")
Component(M2_2, "android/main", ".xml", "1 files")
}
Boundary(L3, "Core source", "layer") {
Component(M3_0, "include", "C/C++", "5 files")
Component(M3_1, "src", "C++", "3 files")
}
Boundary(L4, "Tests", "layer") {
Component(M4_0, "android", "Kotlin", "4 files")
}
Boundary(L5, "Build, CI and hosting", "layer") {
Component(M5_0, "(root)", ".ini", "1 files")
Component(M5_1, ".github", ".yml", "1 files")
}
}
@enduml
UML 4 · Code
4 · Code

Selected declarations, fields and methods grouped by source file. No inheritance or call edges are inferred. Rendered with uml-mcp.

PlantUML source
@startuml
skinparam backgroundColor transparent
skinparam shadowing false
skinparam roundCorner 10
skinparam defaultFontName Arial
skinparam defaultFontSize 13
skinparam ArrowColor #4e6070
skinparam ArrowFontColor #3d4f5f
skinparam titleFontSize 14
skinparam actorBorderColor #006a62
skinparam actorBackgroundColor #e9f3f4
skinparam usecaseBorderColor #006a62
skinparam usecaseBackgroundColor #e9f3f4
skinparam componentBorderColor #006a62
skinparam componentBackgroundColor #e9f3f4
skinparam interfaceBorderColor #006a62
skinparam interfaceBackgroundColor #ffffff
skinparam nodeBorderColor #4e6070
skinparam nodeBackgroundColor #f4f8fb
skinparam databaseBorderColor #006a62
skinparam databaseBackgroundColor #ffffff
skinparam cloudBorderColor #4e6070
skinparam cloudBackgroundColor #f0f5fa
skinparam artifactBorderColor #006a62
skinparam artifactBackgroundColor #ffffff
skinparam rectangleBorderColor #b0c2d3
skinparam activityBorderColor #006a62
skinparam activityBackgroundColor #e9f3f4
skinparam partitionBorderColor #b0c2d3
skinparam stereotypeCBackgroundColor #ffffff
top to bottom direction
hide empty members
package "ESP32-7SEG" {
package "android/app/src/main/java/com/esptimer/fragment/TimerControlFragment.kt" as F0 {
class "TimerControlFragment" as T0_0 {
  onCreateView()
  onViewCreated()
  onStart()
  onStop()
  setupUI()
  showPopupMenu()
}
}
package "android/app/src/main/java/com/esptimer/fragment/WiFiConnectFragment.kt" as F1 {
class "WiFiConnectFragment" as T1_0 {
  onCreateView()
  onViewCreated()
  requestLocationPermission()
  checkLocationServiceAndInitiateWifiScan()
  isLocationEnabled()
  askToEnableLocation()
}
}
package "android/app/src/main/java/com/esptimer/fragment/SettingsFragment.kt" as F2 {
class "SettingsFragment" as T2_0 {
  onCreateView()
  onViewCreated()
  fetchDeviceInfo()
  checkWifiPermissionAndFetchSSID()
  onRequestPermissionsResult()
  fetchWifiSSID()
}
}
package "android/app/src/main/java/com/example/esptimer/MainActivity.kt" as F3 {
class "MainActivity" as T3_0 {
  onCreate()
  onRequestPermissionsResult()
  loadWifiNetworks()
  connectToWifi()
  onDestroy()
}
}
package "android/app/src/main/java/com/esptimer/fragment/WebBrowserFragment.kt" as F4 {
class "WebBrowserFragment" as T4_0 {
  onCreate()
  onCreateView()
  onDestroyView()
}
}
package "android/app/src/main/java/com/example/esptimer/TimerControl.kt" as F5 {
class "TimerControl" as T5_0 {
  onCreate()
  callApi()
}
}
package "android/app/src/main/java/com/esptimer/api/WebSocketClient.kt" as F6 {
class "WebSocketEventListener" as T6_0 {
  onOpen()
  onMessage()
  onClosing()
  onFailure()
}
}
package "android/app/src/main/java/com/esptimer/adapter/SettingsAdapter.kt" as F7 {
class "SettingItem" as T7_0 {
}
}
package "src/display.cpp" as F8 {
class "Callbacks" as T8_0 {
  timerCallback
  displayCallback
  callbacks
}
}
}
@enduml

7.3. Data flow

The calls from the GitDiagram graph, in the order you meet them from the entry points. GitDiagram generates the graph with AI; the file paths it cites were checked against the repository tree.

Mermaid Sequence diagram
sequenceDiagram
  autonumber
  participant P0 as Firmware startup
  participant P1 as Wi-Fi setup
  participant P2 as Timer display
  participant P3 as HTTP and WebSocket server
  participant P4 as Timer controls
  participant P5 as HTTP client setup
  participant P6 as WebSocket client
  participant P7 as Timer stop receiver
  participant P8 as Wi-Fi onboarding
  participant P9 as Settings
  participant P10 as Settings list adapter
  participant P11 as User
  participant P12 as Browser
  participant P13 as Android navigation
  participant P14 as Wi-Fi credentials
  participant P15 as 7-segment display
  participant P16 as Browser interface
  P0->>P1: loads or configures
  P0->>P2: starts display
  P0->>P3: starts server
  P4->>P5: requests timer actions
  P4->>P6: opens timer socket
  P4->>P7: registers timer events
  P8->>P5: sends credentials
  P9->>P10: uses adapter
  P9->>P5: loads device data
  P11->>P12: controls
  P11--)P13: uses app
  P1->>P14: reads and writes
  P2->>P15: drives display
  P3->>P1: handles Wi-Fi routes
  P3->>P2: dispatches timer updates
  P3->>P16: serves pages
Steps as text
  1. Firmware startup to Wi-Fi setup loads or configures
  2. Firmware startup to Timer display starts display
  3. Firmware startup to HTTP and WebSocket server starts server
  4. Timer controls to HTTP client setup requests timer actions
  5. Timer controls to WebSocket client opens timer socket
  6. Timer controls to Timer stop receiver registers timer events
  7. Wi-Fi onboarding to HTTP client setup sends credentials
  8. Settings to Settings list adapter uses adapter
  9. Settings to HTTP client setup loads device data
  10. User to Browser controls
  11. User to Android navigation uses app
  12. Wi-Fi setup to Wi-Fi credentials reads and writes
  13. Timer display to 7-segment display drives display
  14. HTTP and WebSocket server to Wi-Fi setup handles Wi-Fi routes
  15. HTTP and WebSocket server to Timer display dispatches timer updates
  16. HTTP and WebSocket server to Browser interface serves pages
  17. HTTP client setup to Timer API contract creates service
  18. HTTP client setup to App preferences initializes preferences
  19. WebSocket client to HTTP and WebSocket server connects to socket
  20. Browser to HTTP and WebSocket server submits controls
  21. Timer API contract to HTTP and WebSocket server calls matching routes

7.4. Public interface

Outside code can use everything listed here. The project also declares 17 public types.

Entry points

Public headers 6

include/ble.h include/config.h include/display.h include/web_page.h include/web_server.h include/wifi.h

7.5. Private interface

These names are internal by the language’s conventions: a leading underscore, private, static or pub(crate).

private / internal method
42

7.6. Services

Service 1

  • TimerApiServiceperformTimerAction, resetWifiCredentials, connectToWiFi and 4 more

7.7. Entities and data model 2

Mermaid Entity class diagram
classDiagram
  direction LR
  class E0["SettingItem"] {
  }
  class E1["Callbacks"] {
    +TimerCallback timerCallback
    +DisplayCallback displayCallback
    +static callbacks
  }

An arrow links a field to the entity its type names.

EntityKindFirst fields
SettingItemRecord or interface
CallbacksData structtimerCallback, displayCallback, callbacks

7.8. Business logic

Once UI code and the services and entities above are set aside, these classes have the most methods.

TimerControlFragment Application services, 27 methods
onCreateView, onViewCreated, onStart, onStop, setupUI, showPopupMenu
WiFiConnectFragment Application services, 15 methods
onCreateView, onViewCreated, requestLocationPermission, checkLocationServiceAndInitiateWifiScan, isLocationEnabled, askToEnableLocation
SettingsFragment Application services, 9 methods
onCreateView, onViewCreated, fetchDeviceInfo, checkWifiPermissionAndFetchSSID, onRequestPermissionsResult, fetchWifiSSID
MainActivity Application services, 5 methods
onCreate, onRequestPermissionsResult, loadWifiNetworks, connectToWifi, onDestroy
WebBrowserFragment Application services, 3 methods
onCreate, onCreateView, onDestroyView
TimerControl Application services, 2 methods
onCreate, callApi
WebSocketEventListener Entry points and API, 4 methods
onOpen, onMessage, onClosing, onFailure

7.9. Database and persistence

7.10. External integrations

HTTP clients

fetch OkHttp / Retrofit

Hosts named in the code

7.11. Stack and dependencies

Embedded (PlatformIO) platformio.ini 1 runtime

platform espressif32 board esp32dev framework arduino

Open the manifest

JVM (Gradle) android/app/build.gradle.kts 19 runtime, 3 dev

compileSdk 34 minSdk 24 targetSdk 34 jvmTarget 1

Open the manifest

External dependencies

19 declared packages (16 runtime, 3 development) in platformio.ini, android/app/build.gradle.kts.

Package table 19
External dependencies
PackageVersionScopePurposeRegistry
bblanchon/ArduinoJson—runtime—registry.platformio.org
androidx.core:core-ktx:1.12.0—runtime—central.sonatype.com
androidx.appcompat:appcompat:1.6.1—runtime—central.sonatype.com
androidx.preference:preference:1.2.1—runtime—central.sonatype.com
com.google.android.material:material:1.11.0—runtime—central.sonatype.com
androidx.constraintlayout:constraintlayout:2.1.4—runtime—central.sonatype.com
com.squareup.okhttp3:okhttp:4.12.0—runtime—central.sonatype.com
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0—runtime—central.sonatype.com
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0—runtime—central.sonatype.com
androidx.cardview:cardview:1.0.0—runtime—central.sonatype.com
androidx.navigation:navigation-fragment-ktx:2.7.7—runtime—central.sonatype.com
androidx.navigation:navigation-ui-ktx:2.7.7—runtime—central.sonatype.com
com.squareup.retrofit2:retrofit:2.9.0—runtime—central.sonatype.com
com.squareup.retrofit2:converter-gson:2.9.0—runtime—central.sonatype.com
com.squareup.retrofit2:converter-scalars:2.9.0—runtime—central.sonatype.com
com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2—runtime—central.sonatype.com
junit:junit:4.13.2—development—central.sonatype.com
androidx.test.ext:junit:1.1.5—development—central.sonatype.com
androidx.test.espresso:espresso-core:3.5.1—development—central.sonatype.com

7.12. CI/CD pipeline

1 GitHub Actions workflow, 2 jobs. Each box is a job; double-bordered boxes publish or deploy, and arrows follow needs.

Mermaid Pipeline flow
flowchart LR
  subgraph wf0["Build and Release Firmware"]
    direction LR
    wf0_build[["build<br/>ubuntu-latest"]]
    wf0_release[["release<br/>ubuntu-latest"]]
  end
  t0(["push"])
  d0[("GitHub Releases")]
  t0 --> wf0_build
  wf0_build --> wf0_release
  wf0_release -.-> d0
Workflows, triggers, jobs and targets
WorkflowTriggersJobsPublishes to
Build and Release Firmware
.github/workflows/firmware.yml
push
  • build ubuntu-latest
    Checkout Repository · Set up Python · Install PlatformIO · Build Firmware · Archive Production Artifacts · Upload Artifact
  • release ← build ubuntu-latest
    Download Firmware Artifact · Create GitHub Release
GitHub Releases

7.13. Deployment

Mermaid Deployment diagram
flowchart LR
  repo[("GitHub repository")]
  ci[["GitHub Actions<br/>1 workflow"]]
  pub_GitHub_Releases[("GitHub Releases")]
  repo -->|"push or pull request"| ci
  ci -->|"publishes"| pub_GitHub_Releases
UML Deployment
Deployment

The outer node is where the code runs. Each base image points to what it builds, solid arrows lead to databases and dashed ones to outside services. Rendered with uml-mcp.

PlantUML source
@startuml
skinparam backgroundColor transparent
skinparam shadowing false
skinparam roundCorner 10
skinparam defaultFontName Arial
skinparam defaultFontSize 13
skinparam ArrowColor #4e6070
skinparam ArrowFontColor #3d4f5f
skinparam titleFontSize 14
skinparam actorBorderColor #006a62
skinparam actorBackgroundColor #e9f3f4
skinparam usecaseBorderColor #006a62
skinparam usecaseBackgroundColor #e9f3f4
skinparam componentBorderColor #006a62
skinparam componentBackgroundColor #e9f3f4
skinparam interfaceBorderColor #006a62
skinparam interfaceBackgroundColor #ffffff
skinparam nodeBorderColor #4e6070
skinparam nodeBackgroundColor #f4f8fb
skinparam databaseBorderColor #006a62
skinparam databaseBackgroundColor #ffffff
skinparam cloudBorderColor #4e6070
skinparam cloudBackgroundColor #f0f5fa
skinparam artifactBorderColor #006a62
skinparam artifactBackgroundColor #ffffff
skinparam rectangleBorderColor #b0c2d3
skinparam activityBorderColor #006a62
skinparam activityBackgroundColor #e9f3f4
skinparam partitionBorderColor #b0c2d3
skinparam stereotypeCBackgroundColor #ffffff
node "PlatformIO firmware build" as H {
  artifact "ESP32-7SEG" as APP
}
cloud "WebSocket" as E0
APP ..> E0
@enduml

Where it runs

Published to

7.14. Monitoring

What the code logs, measures and exposes to tell whether it is working.

7.15. Security

Controls

Supply chain

7.16. Testing

Test files
4
Source files
64
Test cases, about
4
Unit tests
4

No measured coverage report in the analyzed sources.

Where the tests are

android/app/src/androidTest/java/com/esptimer 1 android/app/src/androidTest/java/com/example/esptimer 1 android/app/src/test/java/com/esptimer 1 android/app/src/test/java/com/example/esptimer 1

8. Types and file structure

21 declared types, with 12 in the base-relationship overview.

Type diagram
classDiagram
direction TB
class t0f7089087495["Callbacks"] {
  <<struct>>
}
class tc0b1722c8a7f["ExampleInstrumentedTest"] {
  useAppContext()
}
class taaaa0937cb8a["ExampleInstrumentedTest"] {
  useAppContext()
}
class t0fd594821bdd["MainActivity"] {
  onCreate()
  setupNavigationUI()
  hasPermissions()
  onRequestPermissionsResult()
}
class tf36f30cd8e65["SettingsAdapter"] {
  onCreateViewHolder()
  onBindViewHolder()
  getItemCount()
}
class tb59d4cfbe0b1["SettingsViewHolder"] {
}
class tc5d344b351ed["SettingItem"] {
}
class tce24fcf8fc6e["TimerApiService"] {
  performTimerAction()
  resetWifiCredentials()
  connectToWiFi()
  scanForNetworks()
}
class t64725d5d3582["WebSocketClient"] {
  connect()
  send()
  close()
}
class t181736c31b5e["WebSocketEventListener"] {
  onOpen()
  onMessage()
  onClosing()
  onFailure()
}
class tf5e33f3603df["PreferencesHelper"] {
}
class t1902f7090575["SettingsFragment"] {
  onCreateView()
  onViewCreated()
  fetchDeviceInfo()
  checkWifiPermissionAndFetchSSID()
}
class b4be9ca085545["AppCompatActivity"] {
  <<unresolved_base>>
}
t0fd594821bdd ..> b4be9ca085545 : declared base
class bc58b80af594e["RecyclerView"] {
  <<unresolved_base>>
}
tf36f30cd8e65 ..> bc58b80af594e : declared base
tb59d4cfbe0b1 ..> bc58b80af594e : declared base
class b995bb1f4b9f4["Fragment"] {
  <<unresolved_base>>
}
t1902f7090575 ..> b995bb1f4b9f4 : declared base

Unresolved bases remain labelled; full signatures are not reconstructed.

9. Reference

36 / 36 eligible files read (113 in the tree); 0 oversized, 0 failed reads and 1 syntax diagnostics.

What the scan covers

Known dependency/build folders, credential files and binaries are excluded. The scan covers READMEs, recognized manifests and parser-supported source files.

Linguist statistics cover the whole repository and may include other languages.

11. Files to read 4

12. Glossary

Repository

The versioned source files, configuration, and history of a project.

README

The repository’s entry document, usually covering its purpose and initial setup.

Dependency

A library, tool, or service that another component needs to build or run.

HTTP

A request-and-response protocol used by browsers and web services. A method, path, headers, and optional body describe a request.

Published port

A host port mapped to a service’s container port. Publishing a port can expose that service beyond its container network.

Build

The steps that turn source files and dependencies into a runnable program or distributable artifact.

Firmware

Software running on a device or microcontroller to control its hardware and communication.

13. References

  1. antoinebou12. (2026, November 5). ESP32-7SEG. [Software repository] github.com.
  2. antoinebou12. (2026, November 5). ESP32-7SEG: README. [Repository documentation] github.com.
  3. antoinebou12. (2026, November 5). src/main.cpp. [Source file] github.com.
  4. antoinebou12. (2026, November 5). src/display.cpp. [Source file] github.com.
  5. antoinebou12. (2026, November 5). src/web_server.cpp. [Source file] github.com.
  6. antoinebou12. (2026, November 5). platformio.ini. [Source file] github.com.
  7. Boucher, A. (2026, April 13). ESP32-7SEG. [Project article] antoineboucher.info.
  8. Boucher, A. (2026, October 23). ESP32-7SEG: An embedded clock with network setup. [Project article] antoineboucher.info.

Sources without a publication date show the date they were last checked, November 5, 2026. File links retain the inspected revision where available.