← Back to Home

LoRa Greenhouse Monitoring System

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.

Key Features and Technologies Used

System Diagram

Embedded Sensor Sender

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

Receiver

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

3D Printing the Heltec Cases

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

Data Ingestion

On a Raspberry Pi 5, I built a Python ingestion service that:

Ingestion Script: ingest.py

Web Dashboard

Using Flask and Chart.js, I built a dashboard to visualize and monitor the data.

Dashboard Script: app.py

Accessing the Dashboard

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!

Deployment and Automation

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
        
      

Open Source Contribution

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.

Future Improvements and Expansion