Rename project esp+sensair -> esp-sensair; publish fabrication files as release assets

- Rename KiCad project/schematic/board (and local .prl) to drop the '+',
  updating all internal cross-references (project name, sheetfile, title blocks)
- Remove the '+' from Gerber/drill/job filenames and the job file's internal
  Name/Path references; rebuild the upload zip with clean names
- Stop tracking gerber/ (derived artifacts): untrack, gitignore, and publish
  the fabrication zip as a GitHub Release asset instead
- README/CHANGELOG: point fabrication data at the release, mark the '+' naming
  issue as fixed, refresh the repository layout
This commit is contained in:
Hannes committed 2026-10-19 23:01:37 +02:00
1 parent 58cabbc97c
commit 504e4e1454
17 files changed
+54 -11163

No files matched your search

+4 -1
View File
@@ -15,7 +15,10 @@ _restore_backup_*/
netlist/
reports/
# Generated fabrication outputs are published in gerber/ ; keep ad-hoc exports out
# Fabrication outputs (Gerbers, drills, job file, upload zip) are derived
# artifacts published as GitHub Release assets, not committed to the tree.
# Regenerate from KiCad and attach the zip to the matching release tag.
gerber/
*.gbr.bak
*.drl.bak
+5 -4
View File
@@ -14,8 +14,9 @@ First public release of the ESP32-C3 CO₂ & environment sensor board (prototype
(`esp_sensair_stuff.pretty/`) for the ESP32-C3 module, Sensirion S8 and BME280.
- Project-local library tables (`fp-lib-table`, `sym-lib-table`) so the design
opens with all custom parts resolved on a fresh clone.
- **Fabrication data** in `gerber/`: Gerber X2 plot, Excellon PTH/NPTH drills,
Gerber job/stackup file, and a ready-to-upload `esp-sensair.zip`.
- **Fabrication data**: Gerber X2 plot, Excellon PTH/NPTH drills, Gerber
job/stackup file, packaged as a ready-to-upload `esp-sensair.zip`. These are
derived artifacts published as GitHub Release assets (not committed to the tree).
- **Bill of materials** (`bom/esp-sensair-bom.csv`) plus the human-readable BOM
in the README.
- **Documentation** in `docs/`: schematic PDF, top/bottom layer plots, 3D render.
@@ -32,5 +33,5 @@ First public release of the ESP32-C3 CO₂ & environment sensor board (prototype
See the "Known issues and lessons learned (v1 → v2)" section of the
[README](README.md). Highlights: power delivered through the module's USB-C 5 V
path, single decoupling capacitor, no mounting holes, no populated I²C pull-ups,
unannotated schematic, leaded HASL, and a `+` in the project name that leaks
into Gerber file names.
unannotated schematic, and leaded HASL. (The `+` that was in the project name has
been removed; the project and fabrication files are now `esp-sensair`.)
+21 -14
View File
@@ -14,7 +14,7 @@ running.
| Assembly | through-hole / pin-header plug-in modules |
| Firmware | ESPHome (see [`firmware/`](firmware/)) |
| Schematic | [`docs/esp-sensair-schematic.pdf`](docs/esp-sensair-schematic.pdf) |
| Fabrication data | [`gerber/`](gerber/) (Gerber X2 + Excellon + ODB job) |
| Fabrication data | Gerber X2 + Excellon + job file — attached to the [latest release](../../releases/latest) (`esp-sensair.zip`) |
![3D render](docs/esp-sensair-3d-top.png)
@@ -93,13 +93,17 @@ Order data used for the v1 prototype:
| Stencil | not ordered (THT assembly) |
| Qty / lead time / cost | _fill in from your order confirmation_ |
Fabrication files:
Fabrication files are **derived artifacts** and are not committed to the tree. They are
published as assets on the matching GitHub release:
- `gerber/esp-sensair.zip` — Gerber X2 plot + drill files, ready to upload
- `gerber/esp+sensair-job.gbrjob` — Gerber job / stackup description
- `esp-sensair.zip` — Gerber X2 plot + Excellon drill files + job file, ready to upload
(attached to the [latest release](../../releases/latest))
To regenerate them from the design: open `esp-sensair.kicad_pro` in KiCad, plot Gerber X2 +
drills with the project's stored export settings, and zip the result.
> **Note on the job file:** the v1 project was started from a 4-layer KiCad stackup, so
> `esp+sensair-job.gbrjob` declares `LayerNumber: 4` and labels the copper layers `L1`/`L4` even
> `esp-sensair-job.gbrjob` declares `LayerNumber: 4` and labels the copper layers `L1`/`L4` even
> though only the outer layers are used. The board was fabricated correctly as a 2-layer board.
> For the next revision: set the stackup to 2 layers in *Board Setup → Stackup* before exporting,
> so the job file is self-consistent for anyone re-ordering the board.
@@ -152,8 +156,9 @@ ESPHome on `esp32-c3-devkitm-1`, framework **esp-idf**. Config template:
v2: annotate, set MPNs, and export the BOM from the schematic.
6. **Leaded HASL** is not RoHS-compliant. v2: HASL lead-free, and ENIG for any impedance-controlled
design.
7. **Project name contains `+`.** It propagates into the Gerber file names (`esp+sensair-Front.gbr`),
which some fabricator upload portals and drill parsers reject. v2: `esp-sensair`.
7. **Project name contained `+`.** It propagated into the Gerber file names
(`esp+sensair-Front.gbr`), which some fabricator upload portals and drill parsers reject.
Fixed: the project and all fabrication files are now named `esp-sensair`.
8. **Antenna keep-out** for the ESP32-C3 module is defined as a rule area (pads and footprints
excluded, copper pour allowed). v2: verify it against the module datasheet's antenna keep-out
figure, and check the pour's clearance to the antenna region specifically.
@@ -162,14 +167,13 @@ ESPHome on `esp32-c3-devkitm-1`, framework **esp-idf**. Config template:
```
.
├── esp+sensair.kicad_pro KiCad project
├── esp+sensair.kicad_sch schematic
├── esp+sensair.kicad_pcb board layout
├── esp-sensair.kicad_pro KiCad project
├── esp-sensair.kicad_sch schematic
├── esp-sensair.kicad_pcb board layout
├── esp_sensair_stuff.kicad_sym custom symbols (ESP32-C3, Sensirion S8, BME280)
├── esp_sensair_stuff.pretty/ custom footprints, drawn from component datasheets
├── fp-lib-table project-local footprint library table (${KIPRJMOD})
├── sym-lib-table project-local symbol library table (${KIPRJMOD})
├── gerber/ Gerber X2, Excellon drills, job file, ready-to-upload zip
├── bom/ bill of materials (CSV)
├── docs/ schematic PDF, layer plots, 3D render
├── firmware/ ESPHome config templates, secrets templates, notes
@@ -177,14 +181,17 @@ ESPHome on `esp32-c3-devkitm-1`, framework **esp-idf**. Config template:
├── CHANGELOG.md release history
├── LICENSE CERN-OHL-S-2.0 (hardware)
└── LICENSE.MIT MIT (firmware config, BOM, docs)
(Fabrication outputs — Gerber X2, Excellon drills, job file, upload zip — are generated
from the design and published as GitHub Release assets, not committed to the tree.)
```
## Rebuilding the board
1. Open `esp+sensair.kicad_pro` in KiCad 10.
1. Open `esp-sensair.kicad_pro` in KiCad 10.
2. Run DRC; fix anything you change.
3. Export Gerbers/drill (the settings are stored in the project) and upload `gerber/*.zip` to your
fabricator with the parameters from the fabrication table.
3. Export Gerbers/drill (the settings are stored in the project) and upload the resulting zip to
your fabricator with the parameters from the fabrication table.
4. Order parts per BOM, solder through-hole parts and pin headers.
5. Flash the ESPHome configuration and add the device to Home Assistant.
@@ -197,7 +197,7 @@
)
(path "/28d3bedc-b718-42e9-a807-433ec5be91c1")
(sheetname "/")
(sheetfile "esp+sensair.kicad_sch")
(sheetfile "esp-sensair.kicad_sch")
(units
(unit
(name "A")
@@ -707,7 +707,7 @@
)
(path "/f8ce7ede-a8d1-4384-9bf4-f3d2a1fc666d")
(sheetname "/")
(sheetfile "esp+sensair.kicad_sch")
(sheetfile "esp-sensair.kicad_sch")
(units
(unit
(name "A")
@@ -1151,7 +1151,7 @@
)
(path "/4a778978-25b1-454b-a42c-4810845485d3")
(sheetname "/")
(sheetfile "esp+sensair.kicad_sch")
(sheetfile "esp-sensair.kicad_sch")
(units
(unit
(name "A")
@@ -1515,7 +1515,7 @@
(property ki_fp_filters "C_*")
(path "/6a596542-3929-4c58-9dee-69c62daa1a6d")
(sheetname "/")
(sheetfile "esp+sensair.kicad_sch")
(sheetfile "esp-sensair.kicad_sch")
(units
(unit
(name "A")
@@ -1687,7 +1687,7 @@
)
(path "/4f5fe11c-9a41-4a9b-9222-ab45477e272d")
(sheetname "/")
(sheetfile "esp+sensair.kicad_sch")
(sheetfile "esp-sensair.kicad_sch")
(units
(unit
(name "A")
@@ -1954,7 +1954,7 @@
(property ki_fp_filters "R_*")
(path "/864c5d02-fcf9-4f36-9cf1-ef22f661070e")
(sheetname "/")
(sheetfile "esp+sensair.kicad_sch")
(sheetfile "esp-sensair.kicad_sch")
(units
(unit
(name "A")
@@ -517,7 +517,7 @@
]
},
"meta": {
"filename": "esp+sensair.kicad_pro",
"filename": "esp-sensair.kicad_pro",
"version": 3
},
"net_settings": {
@@ -693,7 +693,7 @@
"subpart_id_separator": 0,
"top_level_sheets": [
{
"filename": "esp+sensair.kicad_sch",
"filename": "esp-sensair.kicad_sch",
"name": "Root",
"uuid": "d19c68d2-fb5a-4249-a650-17ae87065123"
}
+16 -16
View File
@@ -1953,7 +1953,7 @@
(uuid "1f023e11-d5bb-4435-86a9-68cd9353f80f")
)
(instances
(project "esp+sensair"
(project "esp-sensair"
(path "/d19c68d2-fb5a-4249-a650-17ae87065123"
(reference "#PWR06")
(unit 1)
@@ -2075,7 +2075,7 @@
(uuid "0604badf-b8c6-44c9-aa14-d10e5c7972fc")
)
(instances
(project "esp+sensair"
(project "esp-sensair"
(path "/d19c68d2-fb5a-4249-a650-17ae87065123"
(reference "U1")
(unit 1)
@@ -2154,7 +2154,7 @@
(uuid "80abebea-700a-460e-8d26-ba412c31482c")
)
(instances
(project "esp+sensair"
(project "esp-sensair"
(path "/d19c68d2-fb5a-4249-a650-17ae87065123"
(reference "#PWR09")
(unit 1)
@@ -2234,7 +2234,7 @@
(uuid "4cb491b8-abf1-4d47-af13-57822ce13f40")
)
(instances
(project "esp+sensair"
(project "esp-sensair"
(path "/d19c68d2-fb5a-4249-a650-17ae87065123"
(reference "SW1")
(unit 1)
@@ -2326,7 +2326,7 @@
(uuid "8adc1395-9637-44f4-b2a4-0c1c8e84cb89")
)
(instances
(project "esp+sensair"
(project "esp-sensair"
(path "/d19c68d2-fb5a-4249-a650-17ae87065123"
(reference "U3")
(unit 1)
@@ -2405,7 +2405,7 @@
(uuid "7ae7c3c0-a3ee-458b-aefa-2cb48c888dd3")
)
(instances
(project "esp+sensair"
(project "esp-sensair"
(path "/d19c68d2-fb5a-4249-a650-17ae87065123"
(reference "#PWR05")
(unit 1)
@@ -2484,7 +2484,7 @@
(uuid "d0fc399a-5caf-44cd-b698-2c6a29f27638")
)
(instances
(project "esp+sensair"
(project "esp-sensair"
(path "/d19c68d2-fb5a-4249-a650-17ae87065123"
(reference "#PWR02")
(unit 1)
@@ -2563,7 +2563,7 @@
(uuid "c1994da0-6b29-49fd-b20a-f23989474bc4")
)
(instances
(project "esp+sensair"
(project "esp-sensair"
(path "/d19c68d2-fb5a-4249-a650-17ae87065123"
(reference "C1")
(unit 1)
@@ -2642,7 +2642,7 @@
(uuid "eb81d86e-c2ae-4a24-820c-4e43e813d264")
)
(instances
(project "esp+sensair"
(project "esp-sensair"
(path "/d19c68d2-fb5a-4249-a650-17ae87065123"
(reference "#PWR01")
(unit 1)
@@ -2721,7 +2721,7 @@
(uuid "4cb673ee-18d1-47f0-8020-c62ed7284ea2")
)
(instances
(project "esp+sensair"
(project "esp-sensair"
(path "/d19c68d2-fb5a-4249-a650-17ae87065123"
(reference "#PWR03")
(unit 1)
@@ -2801,7 +2801,7 @@
(uuid "b06b746e-cccc-4a38-9346-00dc77a0807b")
)
(instances
(project "esp+sensair"
(project "esp-sensair"
(path "/d19c68d2-fb5a-4249-a650-17ae87065123"
(reference "R1")
(unit 1)
@@ -2880,7 +2880,7 @@
(uuid "ee269251-6f77-4b1b-801c-a4ad6474269a")
)
(instances
(project "esp+sensair"
(project "esp-sensair"
(path "/d19c68d2-fb5a-4249-a650-17ae87065123"
(reference "#PWR04")
(unit 1)
@@ -2959,7 +2959,7 @@
(uuid "147f26b9-66d8-4cf8-9806-c5be6a827591")
)
(instances
(project "esp+sensair"
(project "esp-sensair"
(path "/d19c68d2-fb5a-4249-a650-17ae87065123"
(reference "#PWR08")
(unit 1)
@@ -3038,7 +3038,7 @@
(uuid "f7b9e5ef-1f7e-47d6-ab4e-ea2e18ddc22b")
)
(instances
(project "esp+sensair"
(project "esp-sensair"
(path "/d19c68d2-fb5a-4249-a650-17ae87065123"
(reference "#PWR010")
(unit 1)
@@ -3117,7 +3117,7 @@
(uuid "83e5a1fd-cc70-403a-8112-0a74cbb3e7e9")
)
(instances
(project "esp+sensair"
(project "esp-sensair"
(path "/d19c68d2-fb5a-4249-a650-17ae87065123"
(reference "#PWR07")
(unit 1)
@@ -3218,7 +3218,7 @@
(uuid "c60ab5fb-2a8f-4f6a-828a-d1a01feb0768")
)
(instances
(project "esp+sensair"
(project "esp-sensair"
(path "/d19c68d2-fb5a-4249-a650-17ae87065123"
(reference "U2")
(unit 1)
File diff suppressed because it is too large. Load diff
-15
View File
@@ -1,15 +0,0 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,10.0.6*
G04 #@! TF.CreationDate,2026-09-08T00:42:25+02:00*
G04 #@! TF.ProjectId,esp+sensair,6573702b-7365-46e7-9361-69722e6b6963,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Legend,Bot*
G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 10.0.6) date 2026-09-08 00:42:25*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 APERTURE END LIST*
M02*
File diff suppressed because it is too large. Load diff
-34
View File
@@ -1,34 +0,0 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,10.0.6*
G04 #@! TF.CreationDate,2026-09-08T00:42:25+02:00*
G04 #@! TF.ProjectId,esp+sensair,6573702b-7365-46e7-9361-69722e6b6963,rev?*
G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Profile,NP*
%FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW 10.0.6) date 2026-09-08 00:42:25*
%MOMM*%
%LPD*%
G01*
G04 APERTURE LIST*
G04 #@! TA.AperFunction,Profile*
%ADD10C,0.050000*%
G04 #@! TD*
G04 APERTURE END LIST*
D10*
X126300000Y-67000000D02*
X99500000Y-67000000D01*
X126300000Y-50500000D02*
X126300000Y-67000000D01*
X126300000Y-50500000D02*
X138500000Y-50500000D01*
X99500000Y-50500000D02*
X99500000Y-67000000D01*
X88500000Y-50500000D02*
X99500000Y-50500000D01*
X88500000Y-90500000D02*
X88500000Y-50500000D01*
X138500000Y-90500000D02*
X88500000Y-90500000D01*
X138500000Y-50500000D02*
X138500000Y-90500000D01*
M02*
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
-6
View File
@@ -1,6 +0,0 @@
M48
INCH,TZ
%
G90
G05
M30
-51
View File
@@ -1,51 +0,0 @@
M48
INCH,TZ
T1C0.0315
T2C0.0394
T3C0.0433
%
G90
G05
T1
X35558Y-28343
X35558Y-34343
X36558Y-28343
X36558Y-34343
X37558Y-28343
X37558Y-34343
X38504Y-20520
X38504Y-21520
X38504Y-22520
X38504Y-23520
X38558Y-28343
X38558Y-34343
X39558Y-28343
X39558Y-34343
X40558Y-28343
X40558Y-34343
X41558Y-28343
X41558Y-34343
X42558Y-28343
X42558Y-34343
X44610Y-31563
X44610Y-34563
X50197Y-20520
X50197Y-21520
X50197Y-22520
X50197Y-23520
X50197Y-24520
X50417Y-29587
X50417Y-30587
X50417Y-31587
X50417Y-32587
X50417Y-33587
X50417Y-34587
T2
X45146Y-27953
X45146Y-29921
T3
X50984Y-26280
X50984Y-28051
X53543Y-26280
X53543Y-28051
M30
-147
View File
@@ -1,147 +0,0 @@
{
"Header": {
"GenerationSoftware": {
"Vendor": "KiCad",
"Application": "Pcbnew",
"Version": "10.0.6"
},
"CreationDate": "2026-09-08T00:42:25+02:00"
},
"GeneralSpecs": {
"ProjectId": {
"Name": "esp+sensair",
"GUID": "6573702b-7365-46e7-9361-69722e6b6963",
"Revision": "rev?"
},
"Size": {
"X": 50.05,
"Y": 40.05
},
"LayerNumber": 4,
"BoardThickness": 1.6002,
"Finish": "None"
},
"DesignRules": [
{
"Layers": "Outer",
"PadToPad": 0.15,
"PadToTrack": 0.15,
"TrackToTrack": 0.15,
"MinLineWidth": 0.4,
"TrackToRegion": 0.5,
"RegionToRegion": 0.5
},
{
"Layers": "Inner",
"PadToPad": 0.15,
"PadToTrack": 0.15,
"TrackToTrack": 0.15
}
],
"FilesAttributes": [
{
"Path": "esp+sensair-Front.gbr",
"FileFunction": "Copper,L1,Top",
"FilePolarity": "Positive"
},
{
"Path": "esp+sensair-Back.gbr",
"FileFunction": "Copper,L4,Bot",
"FilePolarity": "Positive"
},
{
"Path": "esp+sensair-F_Silkscreen.gbr",
"FileFunction": "Legend,Top",
"FilePolarity": "Positive"
},
{
"Path": "esp+sensair-B_Silkscreen.gbr",
"FileFunction": "Legend,Bot",
"FilePolarity": "Positive"
},
{
"Path": "esp+sensair-F_Mask.gbr",
"FileFunction": "SolderMask,Top",
"FilePolarity": "Negative"
},
{
"Path": "esp+sensair-B_Mask.gbr",
"FileFunction": "SolderMask,Bot",
"FilePolarity": "Negative"
},
{
"Path": "esp+sensair-Edge_Cuts.gbr",
"FileFunction": "Profile",
"FilePolarity": "Positive"
}
],
"MaterialStackup": [
{
"Type": "Legend",
"Name": "Top Silk Screen"
},
{
"Type": "SolderPaste",
"Name": "Top Solder Paste"
},
{
"Type": "SolderMask",
"Thickness": 0.01,
"Name": "Top Solder Mask"
},
{
"Type": "Copper",
"Thickness": 0.035,
"Name": "Front"
},
{
"Type": "Dielectric",
"Thickness": 0.4801,
"Material": "FR4",
"Name": "Front/In1.Cu",
"Notes": "Type: dielectric layer 1 (from Front to In1.Cu)"
},
{
"Type": "Copper",
"Thickness": 0.035,
"Name": "In1.Cu"
},
{
"Type": "Dielectric",
"Thickness": 0.4801,
"Material": "FR4",
"Name": "In1.Cu/In2.Cu",
"Notes": "Type: dielectric layer 2 (from In1.Cu to In2.Cu)"
},
{
"Type": "Copper",
"Thickness": 0.035,
"Name": "In2.Cu"
},
{
"Type": "Dielectric",
"Thickness": 0.4801,
"Material": "FR4",
"Name": "In2.Cu/Back",
"Notes": "Type: dielectric layer 3 (from In2.Cu to Back)"
},
{
"Type": "Copper",
"Thickness": 0.035,
"Name": "Back"
},
{
"Type": "SolderMask",
"Thickness": 0.01,
"Name": "Bottom Solder Mask"
},
{
"Type": "SolderPaste",
"Name": "Bottom Solder Paste"
},
{
"Type": "Legend",
"Name": "Bottom Silk Screen"
}
]
}
Binary file not shown.