sickprodigy 9fda192f0b Bug: Enhance schedule handling with improved request processing and validation
Sometimes page loads, sometimes doesn't trying to implement something to figure out why the page isn't loading. In python everything loads in certain order so if something hangs, it could prevent something else from running. (Like web page from loading :()
2025-11-08 15:47:39 -05:00
2025-11-05 12:23:45 -05:00

🌱 Auto Garden

Automated garden monitoring and control system using Raspberry Pi Pico W

Overview

This project automates garden monitoring using a Raspberry Pi Pico W with temperature sensors, Discord notifications, and AC control for climate management.

Features

  • WiFi connectivity with auto-reconnect
  • Inside/Outside temperature monitoring (DS18B20 sensors)
  • Discord notifications for temperature readings
  • Separate alert channel for critical temperatures
  • Temperature logging to CSV file
  • Configurable alert thresholds
  • Automated AC control with temperature swing logic
  • Relay control via opto-coupler for 110V AC
  • 🚧 Humidity monitoring (planned)
  • 🚧 Soil moisture monitoring (planned)
  • 🚧 Additional relay control for fans, heaters (planned)

Quick Start

1. Hardware Setup

Required Components:

  • Raspberry Pi Pico W
  • DS18B20 temperature sensors (waterproof recommended)
  • 4.7kΩ resistor (pull-up for 1-Wire bus)
  • Opto-coupler relay module (3.3V logic, 110V AC rated)
  • Momentary button (optional, for easy reset)

See the Items Needed Wiki for full parts list.

2. Wiring

DS18B20 Temperature Sensors:

Sensor Wire    →  Pico Pin
─────────────────────────────
Red (VDD)      →  3V3 (OUT) - Pin 36
Black (GND)    →  GND - Any ground pin
Yellow (Data)  →  GP10 (Inside) - Pin 14
               →  GP11 (Outside) - Pin 15

Add 4.7kΩ resistor between Data line and 3.3V

⚠️ Important: The 4.7kΩ pull-up resistor is required for reliable 1-Wire communication. While it may work without it occasionally, you'll experience intermittent failures, communication errors, and unreliable readings.

Opto-Coupler Relay Module:

Low Voltage Side (Pico):
GP15 (Pin 20)  →  IN (Signal)
3.3V (Pin 36)  →  VCC
GND            →  GND

High Voltage Side (AC Unit):
NO (Normally Open)  →  AC Control Wire 1
COM (Common)        →  AC Control Wire 2

Note: Most opto-coupler modules work with standard logic:

  • relay.on() = relay energized (NO closes) = AC ON
  • relay.off() = relay de-energized (NC closes) = AC OFF

If your AC behavior is inverted (turns on when it should be off), your module may be active LOW—see troubleshooting section.

Optional Reset Button:

RUN pin  →  Button  →  GND

Pressing button grounds RUN and resets the Pico.

3. Software Setup

Install MicroPython:

  1. Download MicroPython firmware
  2. Hold BOOTSEL button while plugging in Pico
  3. Copy .uf2 file to the Pico drive

IDE Setup:

4. Configuration

Create secrets.py (copy from secrets.example.py):

secrets = {
    'ssid': 'YOUR_WIFI_NAME',
    'password': 'YOUR_WIFI_PASSWORD',
    'discord_webhook_url': 'https://discord.com/api/webhooks/...',
    'discord_alert_webhook_url': 'https://discord.com/api/webhooks/...',
}

Configure sensors and AC in main.py:

# Sensor configuration
SENSOR_CONFIG = {
    'inside': {
        'pin': 10,
        'label': 'Inside',
        'alert_high': 80.0,
        'alert_low': 70.0
    },
    'outside': {
        'pin': 11,
        'label': 'Outside',
        'alert_high': 85.0,
        'alert_low': 68.0
    }
}

# AC Controller options
relay_pin = 15
min_run_time = 300      # Minimum 5 minutes run time
min_off_time = 180      # Minimum 3 minutes off time

# AC Monitor options
target_temp = 75.0      # Target temperature in °F
temp_swing = 2.0        # ±2°F swing (AC on at 77°F, off at 73°F)

5. Upload & Run

Upload all files to your Pico:

/
├── main.py
├── secrets.py
└── scripts/
    ├── air_conditioning.py
    ├── discord_webhook.py
    ├── monitors.py
    ├── networking.py
    └── temperature_sensor.py

The Pico will auto-start main.py on boot.

Project Structure

Auto-Garden/
├── main.py                      # Entry point, configuration, monitor setup
├── secrets.py                   # WiFi & Discord credentials (gitignored)
├── secrets.example.py           # Template for secrets.py
└── scripts/
    ├── air_conditioning.py      # AC controller with short-cycle protection
    ├── discord_webhook.py       # Discord notification handling
    ├── monitors.py              # Monitor base class & implementations
    ├── networking.py            # WiFi connection management
    └── temperature_sensor.py    # DS18B20 sensor interface

How It Works

Temperature Monitoring

  • Every 10 seconds: Check temperatures, send alerts if out of range
  • Every 30 seconds: Regular temperature reports to Discord + log to file

Discord Channels:

  • discord_webhook_url: Regular temperature updates, connection status
  • discord_alert_webhook_url: Critical temperature alerts (Inside sensor only)

AC Control Logic

  • Every 30 seconds: Check inside temperature and decide AC state
  • Temperature swing: Creates a "dead band" to prevent rapid cycling
    • Example: Target 75°F with 2°F swing
    • AC turns ON when temp > 77°F
    • AC turns OFF when temp < 73°F
    • Between 73-77°F: maintains current state

Short-Cycle Protection:

  • Minimum run time (default 5 min) prevents AC from turning off too quickly
  • Minimum off time (default 3 min) protects compressor from rapid restarts

WiFi Monitoring

  • Every 5 seconds: Check WiFi connection status
  • LED Indicator:
    • Slow blink (1 sec on/off): Connected
    • Fast blink (0.2 sec): Disconnected
  • Auto-reconnect: Attempts reconnection every 60 seconds if disconnected

Temperature Logs

Logs are saved to /temp_logs.csv on the Pico:

2025-11-05 14:30:00,Inside,28000012,72.50
2025-11-05 14:30:00,Outside,28000034,45.30

Format: timestamp,location,sensor_id,temperature_f

Customization

All configuration is centralized in main.py:

Sensor Settings:

  • Pin assignments
  • Alert thresholds (high/low)
  • Labels

AC Settings:

  • Relay pin
  • Target temperature
  • Temperature swing (dead band)
  • Minimum run/off times

Monitor Intervals:

  • Temperature check/report intervals
  • WiFi check interval
  • AC control interval

Safety Notes

⚠️ High Voltage Warning:

  • Opto-couplers isolate the Pico from AC voltage
  • Never connect GPIO pins directly to 110V AC
  • Ensure your opto-coupler module is rated for your voltage
  • Test relay switching with a multimeter before connecting AC
  • Consider hiring a licensed electrician if uncomfortable with AC wiring

Compressor Protection:

  • Always use minimum run/off times (defaults are safe)
  • Minimum 3 minutes off time protects compressor bearings
  • Minimum 5 minutes run time prevents short cycling

Future Expansion

Planned Features

  • Humidity Sensors: DHT22 or SHT31 for air humidity monitoring
  • Soil Moisture: Capacitive sensors for plant watering automation
  • Additional Relays: Control for fans, heaters, grow lights
  • Smart Ventilation: Auto-open windows when outside air is optimal
  • Light Monitoring: LDR or BH1750 for day/night cycles

Adding More Sensors

To add a new temperature sensor:

First Add to SENSOR_CONFIG in main.py:

'greenhouse': {
    'pin': 12,
    'label': 'Greenhouse',
    'alert_high': 90.0,
    'alert_low': 50.0
}

Second Add a TemperatureMonitor to the monitors list:

TemperatureMonitor(
    sensor=sensors['greenhouse'],
    label=SENSOR_CONFIG['greenhouse']['label'],
    check_interval=10,
    report_interval=30,
    alert_high=SENSOR_CONFIG['greenhouse']['alert_high'],
    alert_low=SENSOR_CONFIG['greenhouse']['alert_low'],
    log_file="/temp_logs.csv",
    send_alerts_to_separate_channel=False
)

Troubleshooting

No temperature readings:

  • Check 4.7kΩ pull-up resistor is connected between data line and 3.3V
  • Verify sensor wiring (VDD to 3.3V, not 5V)
  • Check GPIO pin numbers in SENSOR_CONFIG
  • Run sensor.scan_sensors() to detect connected sensors

WiFi not connecting:

  • Verify SSID/password in secrets.py
  • Check 2.4GHz WiFi (Pico W doesn't support 5GHz)
  • Look for connection messages in serial console
  • LED should blink slowly when connected

Discord messages not sending:

  • Verify webhook URLs are correct
  • Test webhooks with curl/Postman first
  • Check Pico has internet access

AC not switching:

  • Verify relay pin number (default GP15)
  • Test relay manually: Pin(15, Pin.OUT).off() should activate it
  • Check if module is active LOW or active HIGH
  • Ensure opto-coupler has 3.3V power
  • Look for LED on relay module (should light when active)
  • Verify minimum run/off times haven't locked out switching

AC behavior inverted:

  • Your opto-coupler is likely active LOW
  • In air_conditioning.py, swap relay.on() and relay.off() calls

Contributing

Feel free to open issues or submit pull requests for improvements!

License

MIT License - See LICENSE file for details

Resources


Note: Always ensure proper electrical safety when working with high-voltage relays and AC power. Test thoroughly before leaving unattended.

Description
Growing a garden with automation and raspberry pi pico.
https://gitea.rcs1.top/sickprodigy/Auto-Garden
Readme 696 KiB
Languages
Python 100%