# 🌡️ Lab Weather Tracker ### *Environmental Monitoring System for Raspberry Pi* [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) [![Python 3.7+](https://img.shields.io/badge/python-3.7+-blue.svg)](https://www.python.org/downloads/) [![Raspberry Pi](https://img.shields.io/badge/Raspberry%20Pi-Compatible-red.svg)](https://www.raspberrypi.org/) *A professional Python-based weather monitoring system for tracking lab environmental conditions using the Pimoroni Enviro HAT* [Features](#-features) • [Installation](#-installation) • [Usage](#-usage) • [Dashboard](#-web-dashboard) • [Configuration](#-configuration)
--- ## 📋 Table of Contents - [Features](#-features) - [Hardware Requirements](#-hardware-requirements) - [Installation](#-installation) - [Usage](#-usage) - [Web Dashboard](#-web-dashboard) - [Temperature Compensation](#-temperature-compensation) - [Data Storage](#-data-storage) - [Running as a Service](#-running-as-a-service) - [Configuration](#-configuration) - [Troubleshooting](#-troubleshooting) - [Future Enhancements](#-future-enhancements) - [License](#-license) --- ## ✨ Features
### 📊 Data Collection - 🌡️ **Temperature Monitoring** with CPU heat compensation - 💧 **Humidity Tracking** (relative humidity %) - 🔽 **Barometric Pressure** (hPa) - 💡 **Ambient Light** levels (lux) - 🎨 **Color Detection** (RGB values) ### 🎯 Core Features - ⏱️ **5-minute sampling interval** (configurable) - 📁 **CSV logging** (one file per day) - 📈 **Real-time console display** - 🌐 **Web dashboard** with live charts - 🔄 **Auto-refresh** every 10 seconds - 📊 **Historical data** visualization
### 🔥 Temperature Compensation This system implements **intelligent CPU temperature compensation** to ensure accurate ambient temperature readings: - 🧮 Compensates for Raspberry Pi CPU heat affecting the BME280 sensor - 📉 Uses rolling average of 5 CPU temperature samples to reduce jitter - 🎯 Applies scientifically-proven compensation formula - 📊 Logs both raw and compensated temperatures for analysis - ⚙️ Configurable compensation factor (default: 2.25) > **Formula:** `compensated_temp = raw_temp - ((avg_cpu_temp - raw_temp) / factor)` --- ## 🔧 Hardware Requirements | Component | Description | |-----------|-------------| | **Raspberry Pi** | Any model with 40-pin GPIO header (3/4/Zero recommended) | | **Pimoroni Enviro HAT** | Environmental monitoring HAT with BME280 & LTR559 sensors | | **Power Supply** | Official Raspberry Pi power supply (5V, 2.5A+) | | **microSD Card** | 8GB+ with Raspberry Pi OS installed | --- ## 📥 Installation ### 1️⃣ Install System Dependencies ```bash sudo apt-get update sudo apt-get install -y python3-pip python3-dev git ``` ### 2️⃣ Clone the Repository ```bash git clone https://github.com/yourusername/raspi-enviro.git cd raspi-enviro ``` ### 3️⃣ Install Python Dependencies ```bash pip3 install -r requirements.txt ``` ### 4️⃣ Enable I2C Interface The Enviro HAT requires I2C to be enabled: ```bash sudo raspi-config ``` Navigate to: **Interfacing Options → I2C → Enable** Then reboot: ```bash sudo reboot ``` ### 5️⃣ Verify Installation ```bash i2cdetect -y 1 ``` You should see device addresses `76` (BME280) and `23` (LTR559). --- ## 🚀 Usage ### Console Mode (Data Logger) Start the weather tracker to log data every 5 minutes: ```bash python3 weather_tracker.py ``` **Output:** ``` Lab Weather Tracker Starting... Logging interval: 300 seconds (5.0 minutes) ✓ BME280 sensor initialized ✓ LTR559 sensor initialized ================================================== Lab Weather Report - 2025-12-03T14:23:45.123456 ================================================== Temperature (raw): 24.32°C Temperature (compensated): 21.85°C Pressure: 1013.25 hPa Humidity: 45.60% Light Level: 234.50 lux Proximity: 12.00 ================================================== ✓ Data logged to data/weather_log_2025-12-03.csv Next reading in 300 seconds... ``` **Keyboard Shortcuts:** - `Ctrl + C` - Gracefully stop the tracker --- ## 🌐 Web Dashboard ### Starting the Dashboard ```bash python3 web_dashboard.py ``` Then open your browser: - **Local:** `http://localhost:5000` - **Network:** `http://:5000` ### Dashboard Features
#### 📊 Current Readings Card - Live temperature (compensated + raw) - Real-time pressure - Current humidity - Light levels - Color swatch visualization #### 📈 Analytics - Min/Max/Average statistics - Historical trend charts - Last 100 data points - Auto-refresh every 60 seconds - Responsive mobile design
### Dashboard Preview ``` ╔════════════════════════════════════════════╗ ║ MBTECH Binglab Envoro Dashboard ║ ╠════════════════════════════════════════════╣ ║ ║ ║ 🌡️ Temperature 🔽 Pressure ║ ║ 21.85°C 1013.25 hPa ║ ║ Raw: 24.32°C ║ ║ ║ ║ 💡 Light 🎨 Color ║ ║ 234.5 lux [■■■] ║ ║ ║ ╠════════════════════════════════════════════╣ ║ 📊 Today's Statistics ║ ║ Temperature: 18.2°C - 22.5°C (avg 20.3) ║ ║ Pressure: 1010-1015 hPa (avg 1012.5) ║ ║ ║ ╠════════════════════════════════════════════╣ ║ 📈 Historical Trends (24 hours) ║ ║ [Temperature Chart] ║ ║ [Pressure Chart] ║ ║ [Light Chart] ║ ╚════════════════════════════════════════════╝ ``` > **💡 Tip:** Run both the tracker and dashboard simultaneously! The tracker logs data, while the dashboard displays it. --- ## 🌡️ Temperature Compensation ### Why Temperature Compensation? The BME280 sensor is located near the Raspberry Pi CPU, which generates heat. This causes raw temperature readings to be **2-5°C higher** than actual ambient temperature. ### How It Works 1. **Read CPU Temperature** from `/sys/class/thermal/thermal_zone0/temp` 2. **Smooth with Rolling Average** of last 5 readings to reduce jitter 3. **Apply Compensation Formula:** ```python compensated_temp = raw_temp - ((avg_cpu_temp - raw_temp) / 2.25) ``` 4. **Log Both Values** for comparison and analysis ### Adjusting the Compensation Factor Edit the `TEMP_COMP_FACTOR` in both files: ```python # weather_tracker.py (line 27) TEMP_COMP_FACTOR = 2.25 # Decrease for more compensation, increase for less # web_dashboard.py (line 40) TEMP_COMP_FACTOR = 2.25 # Keep values synchronized ``` **Tuning Guide:** - **Too Hot?** Decrease factor → `2.0` (more aggressive compensation) - **Too Cold?** Increase factor → `2.5` (less aggressive compensation) --- ## 💾 Data Storage Data is automatically saved to the `data/` directory: ``` data/ ├── weather_log_2025-12-01.csv ├── weather_log_2025-12-02.csv └── weather_log_2025-12-03.csv ``` ### CSV Format | Column | Description | Unit | |--------|-------------|------| | `timestamp` | ISO 8601 timestamp | - | | `temperature_raw_c` | Raw BME280 reading | °C | | `temperature_c` | CPU-compensated temperature | °C | | `pressure_hpa` | Barometric pressure | hPa | | `humidity_percent` | Relative humidity | % | | `light_lux` | Ambient light level | lux | | `proximity` | Proximity sensor value | - | **Example:** ```csv timestamp,temperature_raw_c,temperature_c,pressure_hpa,humidity_percent,light_lux,proximity 2025-12-03T14:23:45.123456,24.32,21.85,1013.25,45.60,234.50,12.00 ``` --- ## 🔄 Running as a Service For 24/7 operation, configure systemd services: ### Weather Tracker Service ```bash sudo nano /etc/systemd/system/weather-tracker.service ``` ```ini [Unit] Description=Lab Weather Tracker with Temperature Compensation After=network.target [Service] Type=simple User=pi WorkingDirectory=/home/pi/raspi-enviro ExecStart=/usr/bin/python3 /home/pi/raspi-enviro/weather_tracker.py Restart=on-failure RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target ``` ### Web Dashboard Service ```bash sudo nano /etc/systemd/system/weather-dashboard.service ``` ```ini [Unit] Description=Lab Weather Dashboard After=network.target weather-tracker.service [Service] Type=simple User=pi WorkingDirectory=/home/pi/raspi-enviro ExecStart=/usr/bin/python3 /home/pi/raspi-enviro/web_dashboard.py Restart=on-failure RestartSec=10 Environment="FLASK_ENV=production" StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target ``` ### Enable and Start Services ```bash # Enable auto-start on boot sudo systemctl enable weather-tracker.service sudo systemctl enable weather-dashboard.service # Start services now sudo systemctl start weather-tracker.service sudo systemctl start weather-dashboard.service # Check status sudo systemctl status weather-tracker.service sudo systemctl status weather-dashboard.service # View logs journalctl -u weather-tracker.service -f journalctl -u weather-dashboard.service -f ``` ### Service Management Commands ```bash # Stop services sudo systemctl stop weather-tracker.service sudo systemctl stop weather-dashboard.service # Restart services sudo systemctl restart weather-tracker.service sudo systemctl restart weather-dashboard.service # Disable auto-start sudo systemctl disable weather-tracker.service sudo systemctl disable weather-dashboard.service ``` --- ## ⚙️ Configuration ### weather_tracker.py ```python # Line 25-27 DATA_DIR = "data" # Change data storage location LOG_INTERVAL = 300 # Seconds between readings (300 = 5 min) TEMP_COMP_FACTOR = 2.25 # Temperature compensation tuning ``` ### web_dashboard.py ```python # Line 38-40 DATA_DIR = "data" # Must match weather_tracker.py MAX_HISTORY_POINTS = 100 # Number of points on charts TEMP_COMP_FACTOR = 2.25 # Temperature compensation tuning ``` **Common Configurations:** | Interval | Seconds | Use Case | |----------|---------|----------| | 1 minute | `60` | High-frequency monitoring | | 5 minutes | `300` | **Default** - Balanced | | 15 minutes | `900` | Low power consumption | | 1 hour | `3600` | Long-term trends | --- ## 🔍 Troubleshooting ### ❌ `ImportError: No module named 'bme280'` **Solution:** ```bash pip3 install pimoroni-bme280 pip3 install smbus2 ``` ### ❌ I2C Errors / Sensor Not Detected **Solution:** ```bash # 1. Enable I2C sudo raspi-config # Interface Options → I2C → Enable # 2. Check I2C devices i2cdetect -y 1 # 3. Add user to i2c group sudo usermod -a -G i2c $USER newgrp i2c # Or logout and login again # 4. Verify connections # BME280 should show at 0x76 # LTR559 should show at 0x23 ``` ### ❌ Permission Denied Errors **Solution:** ```bash sudo usermod -a -G i2c,gpio $USER sudo chmod 644 /sys/class/thermal/thermal_zone0/temp ``` ### ❌ Web Dashboard Not Accessible from Network **Solution:** ```bash # 1. Check firewall sudo ufw allow 5000/tcp # 2. Find Raspberry Pi IP address hostname -I # 3. Verify Flask is running on all interfaces # web_dashboard.py line 176 should be: # app.run(host='0.0.0.0', port=5000, ...) ``` ### ❌ Temperature Readings Too High/Low **Solution:** Adjust the `TEMP_COMP_FACTOR`: - **Too high?** Decrease factor (e.g., `2.0` for more compensation) - **Too low?** Increase factor (e.g., `2.5` for less compensation) Test with a calibrated thermometer and adjust accordingly. --- ## 🎯 Future Enhancements ### Planned Features - [ ] 📧 Email/SMS alerts for threshold breaches - [ ] 🏠 Home Assistant integration - [ ] 🗄️ Database storage (SQLite/InfluxDB) - [ ] 📥 CSV export from web dashboard - [ ] 📊 Multi-day comparison views - [ ] 🔔 Push notifications - [ ] 📱 Mobile app - [ ] ☁️ Cloud sync capabilities - [ ] 🤖 AI-powered anomaly detection - [ ] 📈 Predictive analytics ### Contributing Contributions are welcome! Feel free to: - 🐛 Report bugs - 💡 Suggest features - 🔧 Submit pull requests --- ## 📄 License ``` MIT License Copyright (c) 2025 MBTECH Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` ---
### Made with ❤️ by MBTECH **MBTECH Binglab Environmental Monitoring System** *Keeping your lab conditions perfect, one reading at a time.* [![GitHub](https://img.shields.io/badge/GitHub-Repository-black.svg)](https://github.com/yourusername/raspi-enviro) [![Documentation](https://img.shields.io/badge/Docs-Latest-green.svg)](#) [![Support](https://img.shields.io/badge/Support-Community-orange.svg)](#)