In this project, I designed and deployed an IoT monitoring system to collect, transmit, store, and visualize environmental data from a remote greenhouse using long-range, low-power wireless communication.
This system integrates embedded firmware, LoRa radio communication, a data ingestion pipeline, a web-based monitoring dashboard, and is automated to run automatically on boot/reboot.
Using a Heltec WiFi LoRa 32 V3 board (containing ESP32-S3 microcontroller and LoRa radio) connected to a DHT22 temperature and humidity sensor, I built:
This node is stationed in the greenhouse to send environmental readings. Example transmitted packet (node, temperature, humidity):
GH0,73.2,49.3
Sender Firmware: lora_sender.ino
A second Heltec board acts as the receiver.
Example output:
Received from GH0: GH0,73.2,49.3 | RSSI: -25
Receiver Firmware: lora_receiver.ino
Using simon.muzi’s (muzi.works) 3D model “H1 - Case for Heltec V3 running Meshtastic,” I printed cases for both boards, drilling a hole in the back of the case for the sender to make room for the sensor.
muzi works
On a Raspberry Pi 5, I built a Python ingestion service that:
Using Flask and Chart.js, I built a dashboard to visualize and monitor the data.
To make the dashboard accessible outside the local network, I used Tailscale Funnel to securely expose the dashboard over HTTPS, allowing remote access when off-site.
See the Dashboard!To ensure the system operates continuously, I created systemd service unit files for both the ingestion service and the dashboard, as well as running the Tailscale Funnel in the background. This allows the system to automatically start on boot, restart if a service crashes, and run without manual intervention.
Running Tailscale Funnel in background:
sudo tailscale funnel --bg localhost:5000
greenhouse-ingest.service (also very similar to greenhouse-dashboard.service):
[Unit]
Description=Greenhouse Ingestion Service
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=teletraanx
WorkingDirectory=/home/teletraanx/greenhouse-monitor
ExecStart=/home/teletraanx/greenhouse-monitor/venv/bin/python /home/teletraanx/greenhouse-monitor/ingest.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Developed LoRa-based sensor communication examples (DHT22) and submitted an open-source contribution to ropg’s heltec_esp32_lora_v3 repo, including debugging and resolving OLED initialization issues on Heltec ESP32 LoRa v3 hardware.