🌱 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 329 KiB
Languages
Python 100%