This project starts with an Arduino reading environmental sensors, sends the measurements over a dedicated 2.4 GHz radio link, forwards them through a Raspberry Pi gateway, stores them on my own Linux server, and finally displays them on a live web dashboard.

The result is a completely self-hosted weather station running on hardware and software I control.

You can view the live dashboard here, making this more than just a project repository - it's a system that's actively running and publicly accessible.

Architecture Overview

The project consists of three main parts:

[Arduino Station] ── nRF24L01 (2.4 GHz) ── [Raspberry Pi Relay] ── HTTPS ── [Flask API + Frontend]

1. Arduino Weather Station

The sensor node is built around an Arduino connected to:

The Arduino periodically reads the sensors, packages the measurements into a compact packet, and transmits them using an nRF24L01 radio module.

Using a dedicated radio link keeps the station independent from Wi-Fi and avoids putting networking logic on the microcontroller.

Power: The station runs off a 3.7V LiPo battery, charged through a cheap TP4056 module. This keeps the sensor node fully wireless and lets it be placed anywhere within radio range, without needing a permanent power cable. The battery is also wired to one of the Arduino's ADC pins through a voltage divider, so the current battery voltage is read alongside the sensor data and included in every transmitted packet - giving visibility into charge level over time.

Enclosure: The Arduino, sensors, and battery live inside a 3D-printed enclosure that I designed myself. It's printed in PETG, painted white to reflect sunlight, and sealed with silicone to keep moisture out. The enclosure has tilted vents that let air reach the sensors while keeping rain from getting in, plus mounting holes for wall or pole mounting - though in practice I just leave it sitting on my balcony table.

2. Raspberry Pi Relay

A Raspberry Pi receives the radio packets through another nRF24L01 module.

A small Python service continuously listens for incoming readings and forwards them to the server over HTTPS.

This approach keeps the Arduino simple while allowing the Pi to handle:

The relay runs as a systemd service for automatic startup and recovery.

3. Flask API and Web Dashboard

The backend is a Flask application hosted on my own Linux server.

It exposes a small REST API:

Incoming readings are authenticated with an API key and stored in SQLite.

nginx sits in front of Flask, handles SSL termination, serves the frontend at /, and routes /weather requests to the Flask API.

The web dashboard consumes the API and displays:

This makes the weather data accessible from anywhere without relying on third-party cloud services.

Known Limitations

Direct sunlight heats up the enclosure, which in turn skews the temperature readings higher than the actual ambient air temperature. Painting the enclosure white helps reduce this effect by reflecting more sunlight, but it doesn't eliminate it—on sunny days the reported temperature can still run a bit warm compared to reality. Properly solving this would likely require a radiation shield or a more ventilated mounting setup, which isn't in place yet.

This effect is clearly visible in the historical graphs: between morning and midday, as the sun starts hitting the enclosure directly, temperature spikes upward, humidity dips correspondingly, and even the battery voltage trace shows a noticeable rise because of the solar panel charging it and likely aslo from the LiPo itself warming up alongside the enclosure.

Lessons Learned

This project touched multiple layers of the stack:

The most interesting challenge wasn't collecting sensor data—it was building a reliable path from a microcontroller all the way to a browser.

Future Improvements

Possible next steps include:

Because the system is modular, each layer can evolve independently.

Source Code

The entire project is open source and available on GitHub.

If you're interested in embedded systems, wireless communication, self-hosting, or full-stack projects, feel free to explore the code and build your own version.