Libelle is a spectrally-resolving shortwave pyranometer that measures solar irradiance across six spectral bands from UV-B through short-wave infrared (~280–1700 nm). The name is German for both "dragonfly" — an organism with up to 30 types of photoreceptors spanning UV to near-IR — and "spirit level," a nod to the onboard accelerometer used to correct measurements for sensor tilt.
| Channel | Sensor | Approx. range |
|---|---|---|
| UV-B | VEML6075 | ~280–315 nm |
| UV-A | VEML6075 | ~315–400 nm |
| Visible (ALS) | VEML6030 | ~400–700 nm |
| White (broadband) | VEML6030 | ~300–700 nm |
| Near-IR (short) | VEMD1060X01 | ~700–1100 nm |
| Near-IR (mid) | SD003-151-001 | ~1000–1700 nm |
| Temperature | NTC thermistor | — |
| Tilt (roll + pitch) | ADXL343 | — |
Spectral response curves for each channel are in Analysis/SpectrumResponsePlots/.
The board integrates its sub-sensors through an ATtiny841, which aggregates their readings and presents a single I²C slave interface to the host. The host never addresses the sub-sensors directly.
Key ICs: VEML6075 (UV), VEML6030 (visible/lux), VEMD1060X01 + SD003-151-001 (NIR photodiodes), ADS1115 (16-bit ADC), ADXL343 (accelerometer), ATtiny841 (I²C bridge), TPS79733 (3.3 V LDO)
Two Libelle modules can share a single I²C bus simultaneously — one facing skyward (UP) and one facing down (DOWN) — to compute net shortwave radiation (↓ − ↑). The I²C address is set by solder jumper JP1:
| Orientation | Address |
|---|---|
| Up (default, JP1 open) | 0x40 |
| Down (JP1 bridged) | 0x41 |
- Supply: 3.3–5.5 V (onboard 3.3 V LDO, max input 5.5 V; I²C lines are level-shifted to match host supply)
- Interface: I²C (slave)
- Connectors: 4-pin screw terminal (J1) and 4-pin headers (J2–J4); ISP header for ATtiny firmware updates (ISP1)
- JP1: module I²C address select (open →
0x40; bridged →0x41) - JP2: ADXL343 accelerometer I²C address select (open →
0x1D; bridged →0x53); for advanced use only — firmware assumes0x1D
| Pin | Function |
|---|---|
| VIN | Supply (3.3–5.5 V) |
| GND | Ground |
| SDA | I²C data |
| SCL | I²C clock |
| Pin | Function |
|---|---|
| D0 | Lux interrupt (active low) |
| D1 | ADC interrupt (active low) |
| D7 | Address select (pull low → 0x41) |
Install the Libelle Arduino library from the Arduino Library Manager or by cloning the repository.
#include <Libelle.h>
Libelle pyroUp(UP);
void setup() {
Serial.begin(38400);
pyroUp.begin();
Serial.println(pyroUp.getHeader());
}
void loop() {
Serial.println(pyroUp.getString());
delay(1000);
}For a net radiation setup with two modules:
Libelle pyroUp(UP);
Libelle pyroDown(DOWN);| Method | Returns | Description |
|---|---|---|
begin() |
bool |
Initialize; returns false if bridge or accelerometer unreachable |
getHeader() |
String |
Comma-separated column names with units |
getString() |
String |
Comma-separated measurement values |
getUVA() |
long |
UV-A raw counts |
getUVB() |
long |
UV-B raw counts |
getLux() |
float |
Illuminance (lux) |
getIR_Short() |
float |
NIR ~700–1100 nm, TIA output voltage (V) |
getIR_Mid() |
float |
NIR ~1000–1700 nm, TIA output voltage (V) |
getTemp() |
float |
Housing temperature (°C) |
getRoll() |
float |
Roll angle (°) |
getPitch() |
float |
Pitch angle (°) |
getIR_Short() and getIR_Mid() return transimpedance amplifier output voltage, not W/m². Converting to irradiance requires calibration against a reference pyranometer; see the library documentation for details.
CNC-millable mounting hardware designs are available on Easel (Inventables):
- Pipe mount — accepts 1.25"–3.25" ID pipe with 1/4" U-bolts (common US sizes: 1.25", 1.5", 1.75", 2")
- Drilling jig — for the Libelle enclosure box
| Pipe mount | Enclosure circle cut |
|---|---|
![]() |
![]() |
SolidWorks source files and STLs are in Mechanical/.
- Project-Liasis — companion longwave (thermal IR) pyrgeometer
- Liasis Library — Arduino library for the Liasis pyrgeometer
Hardware: 
Firmware: GNU General Public License v3


