
HAN ESP TSS721
UtilitechAS/amsreader-firmware
ESP8266 and ESP32 compatible firmware to read, interpret and publish data to MQTT from smart electrical meters, both DLMS and DSMR is supported

adding repository for strictly arduino
Wave box is an open-source printed circuit board by Cingciong, from the Cingciong/wave_box repository on GitHub. It is a 2-layer board with 37 parts on 107 nets, routed with 143 tracks and 0 vias.
It is built around the DS18B20. Its parts include 15 resistors, 6 transistors, 6 connectors, 1 IC and 1 diode. It belongs with the AVR (ATmega, ATtiny) boards of this library.
This project is a modular IoT system built on Arduino Mega / STM32 / ESP32, integrating multiple sensors and actuators with a web-based control interface.
It supports Ethernet communication (static or DHCP), relay/device control, and sensor monitoring, with configuration stored in EEPROM.
schematic/schematic.pdfsrc/ directory, modularized by peripherals, network, and utilitiesIn schematics folder whole KiCad's project is available. Also the full circuit design is available in PDF format:
(exported from KiCad)
| Component | Quantity | Notes |
|---|---|---|
| Microcontroller | 1 | Arduino Mega / STM32 / ESP32 |
| DHT22 | 1 | Temperature & humidity sensor |
| URS-ES1 LAN module | 1 | Ethernet interface |
| BMP280 | 1 | Pressure + temperature sensor |
| SRD-05VDC-SL-C1 relay | 1 | System on/off relay |
| 0.1Ω shunt resistor | 4 | Current measurement |
| IRL540N MOSFET | 5 | 4 for shunt circuit, 1 for fan control |
| Fan | 1 | Active cooling |
| ACS712 | 1 | AC current sensor |
| Dallas DS18B20 | 1 | Digital temperature sensor |
src/
├── config.h // Pin definitions, constants
├── globals/ // Global structs & variables
│ ├── globals.h
│ ├── globals.cpp
├── peripherals/ // Sensors & actuators
│ ├── sensors.h / .cpp
│ ├── basic_peripheral.h / .cpp
│ ├── poe_device.h / .cpp
├── network/ // Ethernet + HTTP
│ ├── ethernet_server_class.h / .cpp
│ ├── routes.h / .cpp
├── utils/ // Helpers
│ ├── fan_controller.h / .cpp
│ ├── env.h / .cpp // EEPROM config persistence
├── main.cpp // setup() + loop()Global Declarations
globals.cpp.extern references are exposed in globals.h.setup()
globals.cpp.env.loop()
?pwd=your_password).| Endpoint | Description | Auth Required |
|---|---|---|
/ | Main control panel (status, config) | ✅ |
/reset | Restart device via watchdog | ✅ |
/get_data | JSON with current sensor/device state | ✅ |
/system_toggle | Toggle main system relay | ✅ |
/device1_toggle | Toggle PoE device 1 | ✅ |
/device2_toggle | Toggle PoE device 2 | ✅ |
/device3_toggle | Toggle PoE device 3 | ✅ |
/device4_toggle | Toggle PoE device 4 | ✅ |
http://device_ip/?pwd=my_secret
DHCP = false and configure IP, mask, and gateway.The project uses a custom HTTP routing system in routes.cpp.
Each route is defined as a Route object with:
/system_toggle)(String requestPath, IPAddress clientIP) that returns a string"text/html" for pages, "application/json" for APIRoute("/hello", [](String requestPath, IPAddress clientIP) {
Serial.println("Hello route called from IP: " + ipToString(clientIP));
return String("Hello, World!");
}, "text/plain"),The project has two types of routes:
| Endpoint | Action | Returns JSON |
|---|---|---|
/ | Main control panel (status, config) | ❌ HTML |
/reset | Restart device via watchdog | ❌ HTML |
/get_data | Get current sensor/device state | ✅ |
/system_toggle | Toggle main system relay | ✅ |
/device1_toggle | Toggle PoE device 1 | ✅ |
/device2_toggle | Toggle PoE device 2 | ✅ |
/device3_toggle | Toggle PoE device 3 | ✅ |
/device4_toggle | Toggle PoE device 4 | ✅ |
/ and /reset) require password via ?pwd=YOUR_PASSWORD and return HTML.{
"system": {
"isOn": true,
"power": 12.34
},
"poe": {
"device1": {"isOn": true, "power": 1.23},
"device2": {"isOn": false, "power": 0.00},
"device3": {"isOn": true, "power": 0.56},
"device4": {"isOn": false, "power": 0.00}
},
"sensors": {
"tempInside": 24.50,
"tempOutside": 22.30,
"humidity": 55.30,
"pressure": 1013.20
}
}The project uses an Env class (env.h / env.cpp) to handle persistent configuration and energy logging.
EEPROM is limited in write cycles, so special care is taken to extend its lifetime.
0xAB) is used to check if EEPROM is initialized.Env::load() checks if EEPROM is valid:
Because power measurements are updated very frequently, saving them directly to EEPROM would wear it out quickly.
To prevent this, the project uses a slot-based circular buffer:
100 → 511 is divided into slots.0xABCD = valid, 0x0000 = empty)Env::loadPowerFromEEPROM() → Reads the last valid saved energy value.Env::savePowerToEEPROM(float energy) → Stores the latest energy measurement into the next free slot.Env::debugEEPROMPower() → Dumps all EEPROM slots to the Serial Monitor for debugging.The project is built using PlatformIO.
Below is the configuration from platformio.ini:
[env:megaatmega2560]
platform = atmelavr
board = megaatmega2560
framework = arduino
monitor_speed = 115200
lib_deps =
adafruit/Adafruit NeoPixel@^1.15.1
Wire
LiquidCrystal_I2C
adafruit/DHT sensor library@^1.4.6
adafruit/Adafruit Unified Sensor@^1.1.15
adafruit/Adafruit BMP280 Library@^2.6.8
https://github.com/adafruit/Ethernet2.git
https://github.com/NicksonYap/Arduino-Ping-W5500.git
bblanchon/ArduinoJson@^7.0.4
https://github.com/RobTillaart/ACS712.git
paulstoffregen/OneWire@^2.3.7
milesburton/DallasTemperature@^3.11.0| Qty | Value | Footprint | References |
|---|---|---|---|
| 6 | 1k | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R2, R4, R7, R10, R13, R15 |
| 5 | 500 | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R1, R5, R8, R11, R14 |
| 5 | NMOS | Library:TO-220-3_Vertical | Q1, Q2, Q3, Q4, Q5 |
| 4 | 0.1 | Resistor_THT:R_Axial_DIN0922_L20.0mm_D9.0mm_P25.40mm_Horizontal | R3, R6, R9, R12 |
| 4 | Screw_Terminal_01x02 | TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-2_1x02_P5.00mm_Horizontal | J2, J3, J4, J5 |
| 1 | 1N4148 | Diode_THT:D_DO-35_SOD27_P7.62mm_Horizontal | D1 |
| 1 | Arduino_Mega2560_R3_Shield | PCM_arduino-library:Arduino_Mega2560_R3_Shield | A1 |
| 1 | DS18B20 | Package_TO_SOT_THT:TO-92_Inline | U1 |
| 1 | Q_NPN_BCE | Package_TO_SOT_THT:TO-92_Inline | Q6 |
| 1 | SANYOU_SRD_Form_C | Relay_THT:Relay_SPDT_SANYOU_SRD_Series_Form_C | K1 |
| 1 | Screw_Terminal_01x03 | TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-3-5.08_1x03_P5.08mm_Horizontal | J6 |
| 1 | Screw_Terminal_01x04 | TerminalBlock_Phoenix:TerminalBlock_Phoenix_MKDS-1,5-4_1x04_P5.00mm_Horizontal | J7 |
| 1 | ~ | Library:acs712 | ACS_1 |
| 1 | ~ | Library:RLEAY | SRD-05VDC-SL-C1 |
| 1 | ~ | Library:DHT22 | DHT1 |
| 1 | ~ | Library:bmp-280 | BMP-2 |
| 1 | ~ | Library:USR-ES1 | USR-ES1 |
The 36 most common of 37 parts.
37 parts, built around the DS18B20. 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.
From the Cingciong/wave_box repository on GitHub, at the commit this page was made from: the board is schematic/test.kicad_pcb and its schematic schematic/test.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask Cingciong before reusing the design.

UtilitechAS/amsreader-firmware
ESP8266 and ESP32 compatible firmware to read, interpret and publish data to MQTT from smart electrical meters, both DLMS and DSMR is supported

pablozg/freeds
Derivador de energía solar excedente creado por Pablo Zerón, Diseño PCB por Amcalo, Tester original por Aeizoon, Wiki por Zoilo Mora

AK-Homberger/NMEA2000WifiGateway-with-ESP32
This repository shows how to build a NMEA2000 WiFi Gateway with voltage and temperature alarms.

fehlfarbe/arduino-motorfocus
Arduino motorfocus with moonlite protocol for telescopes



felixwittwer/homeassistant_automaic_greenhouse
A cool Project to make your greenhouse smart. What about automaic irrigation and collecting enviromental data right from your garden.

Neumi/fastLOGIC
An affordable Arduino-based board designed for straightforward (industrial) logic control, ideal for building small-scale automation and control solutions.