Skip to the content
PCBKitNew board
2 layers80 × 80 mmCamp, the printed circuit board in 3D

CAMP v2: an all-through-hole CubeSat-style payload board I designed for my Technocamp 2026 circuitry class (200 students)

Size
80 × 80 mm
Copper layers
2
Thickness
1.6 mm
Parts
21
Nets
43
Pads
82
Tracks, vias
111, 0
Pours
1
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
12 Aug 2026
Updated
11 Oct 2026

Overview

Camp is an open-source printed circuit board by notazizelse, from the notazizelse/camp repository on GitHub. It is a 2-layer board of 80 × 80 mm with 21 parts on 43 nets, routed with 111 tracks and 0 vias.

It is built around the DHT11, KH-6X6X5H-TJ and TJ-L5FCMXHTCSLCRGB-A5. Its parts include 8 resistors, 3 connectors, 3 switches and 2 diodes. It belongs with the AVR (ATmega, ATtiny) boards of this library.

Main components

3

README

README.md

CAMP v2 — TechnoCamp Circuitry Class Board

A CubeSat payload computer you can build in a weekend.

An 80 × 80 mm Arduino Nano carrier board that turns a handful of loose sensor modules into one tidy instrument: it reads the temperature, the humidity and the carbon-monoxide level of the air around it, shows them on a small screen, and reports them over USB — the same job the payload computer of a real CubeSat does.

Every part is through-hole, so it can be assembled with a soldering iron and no magnifying glass. The board carries no chips of its own — the Arduino Nano does all the thinking. What the board gives you is clean wiring, the right resistors in the right places, and connectors that only fit one way.

🇺🇿 Bu hujjatning o'zbekcha versiyasi: README.uz.md 🔧 Designing a rev C, or want the netlist and fab notes? → docs/hardware-reference.md

The CAMP v2 board, top side, with every connector labelled


Table of contents


What you need

Parts that go on the board

RefQtyPartNotes
ARDUINO11Arduino Nano (ATmega328P)Use two 1×15 female headers so the Nano can be unplugged
R4 – R96220 Ω resistor, ¼ WColour bands: red–red–brown–gold
LED1, LED224-pin RGB LED, 5 mmFitted in 1×4 sockets, so they can be swapped
SW1, SW2, SW336 × 6 mm tactile push button4-leg, 5 mm tall
J5 "SEL"11×3 pin header + jumper capChooses common-cathode or common-anode LEDs
DHT1111×3 pin headerFor the temperature / humidity module
MQ-711×4 pin headerFor the carbon-monoxide module
LCD11×4 pin headerFor the I²C display module
U112-way 5 mm screw terminalMounted on the back of the board
H1 – H44M3 screw + standoffOptional, for mounting into a frame

The full machine-readable list, with LCSC order codes, is in campv2/production/bom.csv.

Modules that plug into the board

  • DHT11 temperature + humidity module (3-pin version)
  • MQ-7 carbon-monoxide module (4-pin version, with both analogue and digital outputs)
  • 16 × 2 LCD with an I²C backpack (a small board soldered to the back of the display with only 4 pins: GND, VCC, SDA, SCL)
  • 2 × common-cathode RGB LEDs, 4 legs each

Tools

Soldering iron, solder, side cutters, a small screwdriver for the terminal, and a computer with the Arduino IDE.


How the board works

Block diagram: sensors and buttons on the left, Arduino Nano in the middle, screen and LEDs on the right

Read it left to right. The three things on the left tell the Arduino something. The two things on the right are how the Arduino tells you something. Nothing on this board talks to anything else directly — every signal goes through the Nano.

The pin map

This is the single most important table in the repository. It is what the board is.

Arduino pinGoes toWhat it does
D2DHT11 pin 2Temperature and humidity data (one wire, both values)
A7MQ-7 pin 1CO level, as a voltage — analogue in only, cannot be a digital pin
D12MQ-7 pin 2The MQ-7 module's own alarm output
A0SW1"Next screen" button
A1SW2"Previous screen" button
D8SW3"Change units" button (°C ↔ °F)
A4LCD pin 3I²C SDA — data
A5LCD pin 4I²C SCL — clock
D3 D5 D6LED1 via R4, R5, R6Red, green, blue of the first RGB LED
D9 D10 D11LED2 via R7, R8, R9Red, green, blue of the second RGB LED
VINU1 pin 15 V from the screw terminal
GNDU1 pin 2, every module, H1–H4Ground

All six LED pins are PWM-capable, which is why the LEDs can fade smoothly between colours instead of only switching on and off.

Three details worth understanding

The buttons have no resistors. Each button connects its Arduino pin to GND, and nothing else. The pull-up resistor that holds the pin HIGH lives inside the ATmega328P and is switched on in software with pinMode(pin, INPUT_PULLUP). So a button reads HIGH when it is not pressed and LOW when it is — backwards from what you might expect, and a classic thing to get stuck on.

J5 decides which way the LEDs are wired. A 4-pin RGB LED has three separate colour legs and one leg they all share. On a common-cathode LED that shared leg must go to GND; on a common-anode LED it must go to +5 V. Rather than pick one and lock you in, this board brings the shared leg out to the middle pin of J5, marked SEL on the silkscreen, with − (GND) on one side and + (5 V) on the other. Put the jumper cap on the side your LEDs need, and set COMMON_ANODE in the sketch to match.

Each LED colour gets its own 220 Ω resistor. An LED will happily draw enough current to destroy itself, and the three colours inside an RGB package have different forward voltages, so one shared resistor would make the colours uneven. Six resistors, one per colour channel: R4/R5/R6 for LED1, R7/R8/R9 for LED2.


The schematic

Full schematic of the CAMP v2 board

Higher-resolution vector version: docs/images/schematic.svg. The KiCad source is campv2/campv2.kicad_sch.

The drawing is deliberately split into labelled boxes — Buttons, Temp & Humid, Gas, Screen, Mounting holes, and the two LED blocks — so you can read one idea at a time. Instead of drawing a wire all the way from the Nano to each block, the schematic uses net labels: two wire ends carrying the same label, like A4, are the same electrical node even though no line connects them on paper. This is how real schematics stay readable.


Build it

Full step-by-step version with photos of each stage: docs/assembly.md. The short version:

Solder from shortest part to tallest, so that each time you flip the board over, the parts you have already fitted hold themselves flat against it.

  1. R4 – R9, the six 220 Ω resistors. They lie flat. Direction does not matter.
  2. SW1, SW2, SW3, the tactile buttons. They only drop in one way round.
  3. J5, the 3-pin SEL header.
  4. DHT11 / MQ-7 / LCD headers (3, 4 and 4 pins).
  5. LED1, LED2 sockets — 1×4 female headers, not the LEDs themselves.
  6. ARDUINO1 — two 1×15 female headers. Fit the Nano into them before soldering so they end up parallel, then solder one pin at each end, check it is square, and finish.
  7. U1, the screw terminal — on the back of the board, wire openings facing out.

Then plug in the modules, put a jumper cap on J5, and drop the Nano into its socket with the USB connector facing the edge of the board (the silkscreen shows you where).

⚠️ Power the board from USB or the screw terminal — never both at once. The screw terminal feeds the Nano's VIN pin. Feeding 5 V into VIN while USB is also connected puts the Nano's regulator and your USB port in a fight neither wins.


Flash it

The sketch is campv2/firmware/CubeSat/CubeSat.ino.

  1. Install the Arduino IDE.
  2. Install three libraries via Tools → Manage Libraries…
    • LiquidCrystal I2C by Frank de Brabander
    • DHT sensor library by Adafruit
    • Adafruit Unified Sensor by Adafruit (No internet in the classroom? Known-good copies are vendored in Arduino/libraries/ — see the README there.)
  3. Tools → Board → Arduino Nano, Tools → Processor → ATmega328P. If uploading fails with a avrdude: stk500_recv() error, switch the processor to ATmega328P (Old Bootloader). Most cheap Nano clones need this.
  4. Open CubeSat.ino, put your own name in STUDENT_NAME, and press Upload.

Settings you are meant to change

They are all together at the top of the sketch, in the block marked PART 1 — SETTINGS YOU ARE MEANT TO CHANGE:

SettingWhat it is for
STUDENT_NAMEShown on the LCD at start-up
LCD_ADDRESS0x27 for most I²C backpacks; try 0x3F if the screen stays blank
COMMON_ANODEfalse for common-cathode LEDs (J5 on −), true for common-anode (J5 on +)
TEMP_COLD_C, TEMP_HOT_CWhen LED1 turns blue and when it turns red
CO_WARNING_PPM, CO_DANGER_PPMWhen LED2 turns amber and when it turns red
CALIBRATE_MODE, MQ7_R0MQ-7 calibration — see below

Everything below that block is the wiring, and changing it will simply stop the board from matching the copper.


Use it

The LCD shows one screen at a time. SW1 walks forward through them, SW2 walks back, and they wrap around:

text
   NAME  →  TEMPERATURE  →  HUMIDITY  →  CARBON MONOXIDE
     ↑                                          │
     └──────────────────────────────────────────┘

SW3 switches the temperature between °C and °F.

The two RGB LEDs are status lights, exactly like the ones on a real satellite:

LED1 — temperatureLED2 — air quality
🔵 bluebelow 18 °C—
🟢 greencomfortableCO below 35 ppm
🟡 amber—CO 35 – 200 ppm
🔴 redabove 28 °CCO above 200 ppm

Open the Serial Monitor at 9600 baud and the board reports every reading once a second. That is your ground station.

Calibrating the MQ-7

An MQ-7 does not measure CO directly — it measures its own resistance, which changes when CO touches it. To turn that into a number in ppm the sketch needs R0, the sensor's resistance in clean air, and every sensor's R0 is different.

  1. Set CALIBRATE_MODE = true and upload.
  2. Leave the board in fresh air, powered, for a few minutes.
  3. Read the number printed in the Serial Monitor, copy it into MQ7_R0.
  4. Set CALIBRATE_MODE = false and upload again.

Until you do this, treat the ppm figure as "roughly" rather than "actually". Also give the sensor about 20 seconds after power-on before believing anything — its heater has to come up to temperature first, and the screen says warming up while it does.


Things to try

The board was designed to be poked at. Some starting points, roughly in order of difficulty:

  1. Change the temperature thresholds so the LED turns red when you breathe on the sensor.
  2. Add a fifth screen showing how long the board has been running.
  3. Make LED2 pulse instead of sitting at a steady colour when CO is in the warning band.
  4. Log the serial output to a file and plot a day of temperature readings.
  5. Use the MQ-7's digital alarm pin (D12) to flash both LEDs at once.
  6. Replace the DHT11 with a DHT22 — same 3 pins, better accuracy. What changes in the code?
  7. Sketch a rev C: what would you add if you had two more pins?

When it does not work

The full list is in docs/troubleshooting.md. The four that catch nearly everybody:

SymptomAlmost always
LCD backlight is on but shows nothing, or white squaresWrong I²C address — change LCD_ADDRESS from 0x27 to 0x3F
Upload fails, stk500_recv(): programmer is not respondingWrong bootloader — Tools → Processor → ATmega328P (Old Bootloader)
LEDs are on when they should be off, colours invertedJ5 jumper and COMMON_ANODE disagree — flip one of them
Temperature reads nan or the screen says the sensor failedDHT11 in backwards, or its middle pin not seated

Repository layout

text
camp/
├── README.md                    ← you are here (English)
├── README.uz.md                 ← same thing, in Uzbek
├── CHANGELOG.md                 ← what changed between board revisions
│
├── campv2/                      ← THE BOARD, and everything that belongs to it
│   ├── campv2.kicad_pro         ·  open this one in KiCad
│   ├── campv2.kicad_sch         ·  schematic
│   ├── campv2.kicad_pcb         ·  layout
│   ├── fp-lib-table             ·  points at ../lib (project-relative)
│   ├── sym-lib-table
│   │
│   ├── firmware/
│   │   └── CubeSat/CubeSat.ino  ← THE CODE. Open this in the Arduino IDE
│   │
│   └── production/              ← WHAT THE FACTORY GETS. Do not edit by hand
│       ├── …PCB_B.zip           ·  upload this file to JLCPCB / PCBWay as-is
│       ├── bom.csv              ·  parts list with LCSC codes
│       ├── positions.csv        ·  pick-and-place positions
│       ├── designators.csv
│       └── netlist.ipc          ·  for the fab's electrical test
│
├── lib/                         ← shared KiCad libraries
│   ├── lcsc/                    ·  symbols + footprints pulled from LCSC

The rule: everything the current board needs is inside campv2/ — schematic, layout, sketch and fab package, one folder. lib/ is what KiCad loads behind the scenes. docs/ is for you. Nobody needs archive/.

⚠️ Two folders are called production, and they are not the same thing. campv2/production/ is the fab package — the gerbers, BOM and pick-and-place file you send to the factory. The top-level production/ holds the logo footprints and reference plots. "Send them the production files" means the zip in campv2/production/.


Opening the project in KiCad

You need KiCad 10.0 or newer — the files use the 2026 file format and older KiCad will refuse to open them.

bash
git clone https://github.com/notazizelse/camp.git
cd camp

Then open campv2/campv2.kicad_pro. That is all. There is no "configure paths" step, no environment variables to set, and no libraries to install:

  • The symbol and footprint libraries are found through ${KIPRJMOD}, KiCad's built-in "wherever this project happens to be" variable, so they resolve on any machine.
  • The 3D models resolve the same way.
  • Everything the board actually uses lives inside this repository.

If KiCad still complains about a missing library, that is a bug in this repository — please open an issue rather than fixing it locally, so the next person does not hit it.


Getting the board made

Upload campv2/production/TechnoCamp_Circuitry_Class_PCB_B.zip to any PCB house without unzipping it, and take the defaults:

SettingValue
Size80 × 80 mm
Layers2
Thickness1.6 mm
Min track / clearance0.5 mm / 0.5 mm
Min hole0.3 mm
Viasnone — every connection is a track or a pad
Surface finishHASL is fine

The design rules are deliberately loose — nothing on this board is near any fab's limits, which is what makes it cheap and reliable to produce in class quantities.

Front and back copper pours: +5 V on the front, GND on the back

The board has a +5 V pour on the front and a GND pour on the back. That gives every part a low-impedance path to both rails without routing a single power track, and it is why the back of the board looks almost empty.

The back of the board, with PER ASPERA AD ASTRA across the top

Across the top of the back, above the mounting holes, the board carries PER ASPERA AD ASTRA — through hardships, to the stars.


Credits

Designed by Azizbek N for TechnoCamp 2026, run by the Robotics and Engineering Association at Turin Polytechnic University in Tashkent. Both logos are printed on the back of the board.

The Arduino Nano pinout reference embedded in the schematic is from Last Minute Engineers and is used for reference only.

Licence: not yet chosen. Until one is added, treat this as "ask before reusing". For a teaching board like this, the usual pairing is CERN-OHL-P v2 for the hardware and MIT for the firmware.

Parts

21
QtyValueFootprintReferences
6220Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR4, R5, R6, R7, R8, R9
4MHMountingHole:MountingHole_3.2mm_M3H1, H2, H3, H4
3buttoneasyeda2kicad:SW-TH_4P-L6.0-W6.0-P4.50-LS6.5SW1, SW2, SW3
210kResistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_HorizontalR10, R11
2TJ-L5FCMXHTCSLCRGB-A5Connector_PinSocket_2.00mm:PinSocket_1x04_P2.00mm_VerticalLED2, LED3
1Arduino_NanoModule:Arduino_NanoA2
1DHT11Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ2
1LCDConnector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ3
1MQ-7Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ4

Questions

How big is the Camp PCB?

It measures 80 × 80 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Camp use?

21 parts, built around the DHT11, KH-6X6X5H-TJ and TJ-L5FCMXHTCSLCRGB-A5. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Camp KiCad files?

From the notazizelse/camp repository on GitHub, at the commit this page was made from: the board is archive/camp/camp.kicad_pcb and its schematic archive/camp/camp.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Camp design in my own project?

Its repository states no licence, so its author keeps all rights: ask notazizelse before reusing the design.

More from notazizelse/camp

2
  • 2 layers80 × 80 mmCampv2, the printed circuit board in 3D

    Campv2

    notazizelse/camp

    CAMP v2: an all-through-hole CubeSat-style payload board I designed for my Technocamp 2026 circuitry class (200 students)

    23 parts
  • 2 layersCamp demo, the printed circuit board in 3D

    Camp demo

    notazizelse/camp

    CAMP v2: an all-through-hole CubeSat-style payload board I designed for my Technocamp 2026 circuitry class (200 students)

    2 parts

Similar boards

  • 2 layers96.6 × 82.8 mmStarbie, the printed circuit board in 3D

    Starbie

    SharKingStudios/Starbie

    Half-Life Week 1 Example Project

    11 parts28MIT
  • 2 layers100 × 50 mmConveyor belt pcb, the printed circuit board in 3D

    Conveyor belt pcb

    lansidev/conveyor-belt

    Miniature 3D printed conveyor belt for simulation and fun working with sensors, all controllable with Raspberry Pi

    22 parts9MIT
  • 2 layers93 × 20 mmWiFi VFD, the printed circuit board in 3D

    WiFi VFD

    ciisaichan/WiFi-VFD

    开源的ESP8266驱动VFD屏电路,支持BiliBili粉丝数、时间、温度、湿度

    23 parts8MIT
  • 2 layersOpenMQTTGatewayPCB, the printed circuit board in 3D

    OpenMQTTGatewayPCB

    ebrithiljonas/OMG_PCB

    All in One PCB for the OpenMQTTGateway Project

    36 parts7GPL-3.0
  • 2 layers62 × 19.3 mmSniffingTrinket, the printed circuit board in 3D

    SniffingTrinket

    GeorgK/SniffingTrinket

    A room climate monitor using the Adafruit Trinket Pro

    23 parts6GPL-3.0
  • 2 layersArduino relay, the printed circuit board in 3D

    Arduino relay

    bhaskar9980/Guardian

    Guardian is an advanced, fully automated hydroponics system designed to optimize plant growth and maximize yield.

    58 parts5MIT
  • 2 layers100 × 43.5 mmFirefly, the printed circuit board in 3D

    Firefly

    Twistx77/Firefly

    Open WIFI-enabled RGB lamp with temperature, humidity, suspended air particles and eCO2 sensors.

    33 parts5GPL-3.0
  • 2 layers30.5 × 77.5 mmProyecto sensor temperatura, the printed circuit board in 3D

    Proyecto sensor temperatura

    unla-investigacion-desarrollo/ecosistema-iot

    Antes de desarrollar el sistema final, realizamos una etapa de exploración donde investigamos y experimentamos con las siguientes tecnologías:

    8 parts5