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:
- DHT11 (temperature and humidity)
- MPL115A2 (atmospheric pressure)
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:
- Internet connectivity
- HTTPS communication
- API authentication
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:
POST /api/dataGET /api/latestGET /api/history
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:
- Current temperature
- Current humidity
- Atmospheric pressure
- Historical trends
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:
- Embedded C++ on Arduino
- Radio communication
- Linux services
- Python and Flask
- REST APIs
- SQLite
- Web development
- Self-hosted server administration
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:
- Additional sensors
- Better historical visualizations
- Data analytics
- Multiple sensor nodes
- Weather prediction
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.