Zbotic Logo Zbotic Logo
  • Home
  • Shop
  • Sale
  • 3D Print Service
  • PCB Service
  • B2B
  • Blogs
  • Contact Us
0 0

View Wishlist Add all to cart

0 0
0 Shopping Cart
Shopping cart (0)
Subtotal: ₹0.00

View cartCheckout

  • Shop
  • About Us
  • Contact Us
  • Reseller
  • Blogs
020 69134444
1800 209 0998
[email protected]
Help Desk
Facebook Twitter Instagram Linkedin YouTube
Zbotic Logo Zbotic Logo
0 0

View Wishlist Add all to cart

0 0
0 Shopping Cart
Shopping cart (0)
Subtotal: ₹0.00

View cartCheckout

All departments
  • 3D Print Service
  • 3D Printer
  • Batteries & Chargers
  • Development Boards
  • Drone Parts
  • EBike parts
  • Sensor Modules
  • Electronic Components
  • Electronic Modules
  • IoT and Wireless
  • Mechanical Parts and Workbench Tools
  • Motors & Drivers & Pumps & Actuators
  • DIY and Robot Kits
  • Show more
  • Home
  • Shop
  • Sale
  • 3D Print Service
  • PCB Service
  • B2B
  • Blogs
  • Contact Us
Return to previous page
Home Arduino & Microcontrollers

Arduino Soil Moisture Sensor Calibration: Get Accurate Values

Arduino Soil Moisture Sensor Calibration: Get Accurate Values

March 11, 2026 /Posted byJayesh Jain / 0

If you’ve ever tried using a soil moisture sensor with Arduino only to get wildly inconsistent readings, you’re not alone. Proper arduino soil moisture calibration is the key difference between a sensor that gives you random noise and one that reliably tells you when your plants need water. In this tutorial, we’ll walk through the complete calibration process for both resistive and capacitive soil moisture sensors, explain the math behind percentage mapping, and give you production-ready code you can use in your own projects.

Table of Contents

  • Types of Soil Moisture Sensors
  • Why Calibration Matters
  • Equipment You’ll Need
  • Finding Dry and Wet Reference Values
  • Mapping Raw Values to Percentage
  • Full Calibrated Code Example
  • Pro Tips for Stable Readings
  • FAQ

Types of Soil Moisture Sensors

Before calibrating, you need to understand what type of sensor you’re working with, because each type behaves differently and requires a slightly different approach.

Resistive sensors are the classic low-cost option — they have two exposed metal probes that you insert into the soil. The Arduino measures the electrical resistance between them. Wet soil conducts electricity better, so resistance drops and the analog voltage reading goes down (the ADC value typically goes down as moisture increases on most breakout boards). The big limitation is corrosion: the exposed metal probes corrode quickly, especially if you leave them in soil for weeks. They’re great for short demos but not ideal for long-term deployments.

Capacitive sensors are the modern alternative. Instead of measuring resistance, they measure the dielectric constant of the soil by detecting how the capacitance of their sensor surface changes. Because no current flows through the soil, there’s no corrosion problem, and they tend to give much more stable readings over time. The readings work in reverse from what you might expect on most boards: dry soil gives a higher ADC reading (less capacitance), and wet soil gives a lower ADC reading (more capacitance). Always check your specific module’s datasheet.

Recommended: Arduino Uno R3 Beginners Kit — ideal starting kit for sensor projects, includes breadboard, jumper wires, and resistors needed for your first soil moisture build.

Why Calibration Matters

Every soil moisture sensor, even two units from the same batch, will have slightly different raw output values for the same moisture level. This is due to manufacturing tolerances, trace resistance variations, and the specific soil composition in your location (sandy soil, clay soil, and loam all have different dielectric properties). Without calibration, you might trigger a watering relay at 40% moisture on one sensor and 60% on another, even though they’re in identical soil conditions.

Calibration also accounts for sensor aging. Resistive sensors corrode over time, shifting their response curve. Capacitive sensors are more stable, but even they can drift slightly. Building a calibration step into your project means you can re-calibrate periodically without rewriting any core logic.

The goal of calibration is simple: you measure the sensor output in completely dry air (or dry sand) and in fully saturated soil, then use those two values as the endpoints of a 0-100% scale. Everything in between gets linearly interpolated.

Equipment You’ll Need

  • Arduino Uno, Nano, or any Arduino-compatible board
  • Soil moisture sensor (resistive or capacitive)
  • A glass of water (for the wet reference)
  • Dry sand or air (for the dry reference)
  • Jumper wires and a USB cable
  • Arduino IDE installed on your computer
  • Optional: Serial plotter for visualising readings in real time
Recommended: Arduino Nano Every with Headers — compact and affordable, perfect for embedding in a garden pot monitor without taking up much space.

Connect your sensor to the Arduino like this:

  • VCC → 3.3V or 5V (check your module; capacitive sensors often need 3.3V)
  • GND → GND
  • AOUT (analog output) → A0

Finding Dry and Wet Reference Values

This is the most important step in calibration. You need to record two reference values:

Step 1 — Get the dry value: Hold the sensor probe in open air (do not touch the sensing area). Upload the simple sketch below and open the Serial Monitor at 9600 baud. Note the stable reading you see — this is your DRY_VALUE.

void setup() {
  Serial.begin(9600);
}

void loop() {
  int raw = analogRead(A0);
  Serial.println(raw);
  delay(500);
}

For a typical capacitive sensor, the dry value in air is often between 590 and 680. For a resistive sensor, it’s typically 800 to 1023 (because dry soil/air has high resistance, and the ADC maxes out).

Step 2 — Get the wet value: Submerge the sensing portion of the probe in a glass of water (not above the electronics line if you have a breakout board). Wait 5 seconds and note the stable reading. This is your WET_VALUE.

For a capacitive sensor, a wet value in water is typically between 280 and 380. For a resistive sensor, it’s usually between 200 and 400.

Important note: Water is not the same as wet soil. If you want maximum accuracy, do your wet calibration by packing wet soil around the probe instead of using plain water. Water tends to give you a lower bound, which is fine for most garden applications, but precision agricultural projects should calibrate in actual soil.

Recommended: Arduino Starter Kit with 170 Pages Project Book — contains everything for your first sensor projects including in-depth explanations of analog readings, perfect for beginners learning calibration concepts.

Mapping Raw Values to Percentage

Once you have your dry and wet reference values, you use the Arduino map() function to convert any raw ADC reading into a moisture percentage between 0 and 100.

The trick with soil moisture calibration is that the mapping is often inverted depending on your sensor type:

For a capacitive sensor (dry = high value, wet = low value):

// Example: DRY_VALUE = 620, WET_VALUE = 310
int moisturePercent = map(rawValue, DRY_VALUE, WET_VALUE, 0, 100);
moisturPercent = constrain(moisturePercent, 0, 100);

For a resistive sensor (dry = high value, wet = low value — same direction, but different range):

// Example: DRY_VALUE = 950, WET_VALUE = 250
int moisturePercent = map(rawValue, DRY_VALUE, WET_VALUE, 0, 100);
moisturPercent = constrain(moisturePercent, 0, 100);

The constrain() call is critical. Without it, if your sensor reads slightly below WET_VALUE (which can happen in very wet soil), you’ll get values above 100 or below 0, which can confuse any downstream logic.

Full Calibrated Code Example

Here is a complete, production-ready sketch with calibration constants at the top so you can easily adjust them without hunting through your code:

// ============================
// Soil Moisture Sensor Calibration Sketch
// For Capacitive Sensor on Arduino Uno
// ============================

// --- CALIBRATION CONSTANTS ---
// Update these after running calibration!
const int DRY_VALUE = 620;   // Raw ADC value in dry air
const int WET_VALUE = 310;   // Raw ADC value in water

// --- PIN DEFINITIONS ---
const int SENSOR_PIN = A0;
const int SAMPLES = 10;       // Number of samples to average

void setup() {
  Serial.begin(9600);
  Serial.println("Soil Moisture Sensor - Calibrated");
  Serial.print("Dry Reference: "); Serial.println(DRY_VALUE);
  Serial.print("Wet Reference: "); Serial.println(WET_VALUE);
  Serial.println("---");
}

int readSmoothedRaw() {
  long total = 0;
  for (int i = 0; i < SAMPLES; i++) {
    total += analogRead(SENSOR_PIN);
    delay(10);
  }
  return (int)(total / SAMPLES);
}

void loop() {
  int rawValue = readSmoothedRaw();
  
  // Map and constrain to 0-100%
  int moisturePercent = map(rawValue, DRY_VALUE, WET_VALUE, 0, 100);
  moisturePercent = constrain(moisturePercent, 0, 100);
  
  Serial.print("Raw ADC: ");
  Serial.print(rawValue);
  Serial.print("  |  Moisture: ");
  Serial.print(moisturePercent);
  Serial.println("%");
  
  // Example thresholds for irrigation control
  if (moisturePercent > STATUS: DRY - Water needed!");
  } else if (moisturePercent > STATUS: OPTIMAL");
  } else {
    Serial.println(">> STATUS: WET - No watering needed");
  }
  
  delay(2000);
}

This sketch uses sample averaging (10 readings averaged together) to smooth out electrical noise, which is especially important for resistive sensors that can pick up interference from nearby AC wiring. The threshold values (30% and 60%) should be adjusted based on your plant type — succulents prefer the soil to dry out completely between waterings, while tropical plants like it consistently moist.

Recommended: Arduino Nano RP2040 Connect with Header — dual-core processor with built-in WiFi for sending calibrated soil moisture readings to the cloud or a home automation dashboard.

Pro Tips for Stable Readings

1. Average multiple readings. A single analogRead() can vary by 10-20 ADC counts due to electrical noise. Always average at least 5-10 readings taken 10ms apart.

2. Power the sensor only when reading. Connect the sensor VCC to a digital output pin set HIGH only when you’re about to take a reading, then set it LOW again. This dramatically reduces corrosion on resistive sensors and extends battery life on solar-powered projects.

// Power sensor only when reading
digitalWrite(SENSOR_POWER_PIN, HIGH);
delay(100); // Let sensor stabilize
int raw = analogRead(SENSOR_PIN);
digitalWrite(SENSOR_POWER_PIN, LOW);

3. Use the internal voltage reference. If your Arduino is running on USB power that fluctuates, the VCC reference for the ADC changes, affecting your readings. For battery-powered projects, use the internal 1.1V reference with analogReference(INTERNAL) for much more stable results (though this limits your input range).

4. Recalibrate in your actual soil. Calibrating in water gives you a ballpark, but the dielectric properties of clay, sandy loam, and potting mix are all different. Do your final calibration in the exact soil you’ll be monitoring.

5. Store calibration in EEPROM. For a professional build, store your DRY_VALUE and WET_VALUE in EEPROM so they survive power cycles. You can then implement a simple “calibrate now” button that re-runs the calibration procedure and saves the new values automatically.

Recommended: Arduino Mega 2560 R3 Board — if you’re building a multi-zone garden monitor with 8+ soil sensors, the Mega’s 16 analog inputs and 256KB flash give you plenty of room to expand.

FAQ

Why does my soil moisture sensor give different readings in different soils?

Different soil compositions have different dielectric constants and electrical conductivity. Clay retains more water and has higher conductivity, sandy soil drains quickly, and potting mix with perlite behaves differently from garden soil. Always calibrate your sensor in the actual soil you intend to monitor for the most accurate results.

My sensor reads 0% even when the soil is wet. What’s wrong?

This usually means your DRY_VALUE and WET_VALUE are swapped in the map() call, or your sensor type is different from what you assumed. Check if your sensor outputs a high value when dry and low when wet (capacitive) or the opposite. Also verify your wiring — a loose AOUT connection will read 0 consistently.

How often should I re-calibrate my soil moisture sensor?

Capacitive sensors are very stable and rarely need re-calibration unless they’re physically damaged. Resistive sensors should be re-calibrated every 1-3 months as corrosion changes their characteristics. A good practice is to re-calibrate whenever you notice your readings drifting significantly from expected values.

Can I use the same calibration values for all my sensors of the same type?

No — even sensors from the same batch can vary by 5-10% in their raw output values. Each sensor should ideally be calibrated individually. If you have many sensors, calibrate a few and average the values as a compromise, but individual calibration is best for accuracy-critical applications.

What’s the difference between using map() and doing manual percentage calculation?

The Arduino map() function uses integer arithmetic and can introduce rounding errors for small ranges. For higher precision, use floating-point math: float pct = (float)(rawValue - DRY_VALUE) / (WET_VALUE - DRY_VALUE) * 100.0;. The difference is minor for most garden projects but matters in scientific applications.

Start growing smarter today. With a properly calibrated soil moisture sensor, you can automate your garden watering, prevent overwatering, and build IoT dashboards that show real-time plant health data. Explore our full range of Arduino boards and sensor modules at Zbotic to get all the components you need for your next smart garden project.

Tags: agriculture, Arduino, calibration, garden automation, iot, Sensors, soil moisture sensor
Share Post
  • Facebook
  • Linkedin
  • Whatsapp
Arduino NFC Reader: PN532 Modu...
blog arduino nfc reader pn532 module rfid and nfc projects 594713
blog arduino oled display ssd1306 menu and graphics tutorial 594720
Arduino OLED Display SSD1306: ...

Related posts

Svg%3E
Read more

Arduino Batch Programming: Flash Multiple Boards Quickly

April 1, 2026 0
Table of Contents Introduction Components and Hardware Setup Wiring Diagram and Connections Complete Code with Explanation Customization and Improvements Troubleshooting... Continue reading
Svg%3E
Read more

Arduino Based Radar System with Ultrasonic Sensor

April 1, 2026 0
Table of Contents Introduction Components and Hardware Setup Wiring Diagram and Connections Complete Code with Explanation Customization and Improvements Troubleshooting... Continue reading
Svg%3E
Read more

Arduino Automatic Plant Monitor: Sunlight, Moisture, Temperature

April 1, 2026 0
Table of Contents Introduction Components and Hardware Setup Wiring Diagram and Connections Complete Code with Explanation Customization and Improvements Troubleshooting... Continue reading
Svg%3E
Read more

Arduino Lie Detector: GSR Sensor Polygraph Project

April 1, 2026 0
Table of Contents Introduction Components and Hardware Setup Wiring Diagram and Connections Complete Code with Explanation Customization and Improvements Troubleshooting... Continue reading
Svg%3E
Read more

Arduino Metal Detector: Build a Treasure Finder

April 1, 2026 0
Table of Contents Introduction Components and Hardware Setup Wiring Diagram and Connections Complete Code with Explanation Customization and Improvements Troubleshooting... Continue reading

Add comment Cancel reply

Your email address will not be published. Required fields are marked

Facebook Twitter Instagram Pinterest Linkedin Youtube

Get the latest deals and more.

Download on Google Play Download on the App Store

Call us: 020 69134444 / 1800 209 0998

Monday - Saturday 09:30 AM - 06:00 PM
For Technical Supports Email: [email protected]
For Sales / Enquiries Email: [email protected]

  • My Account

    • Cart

    • Wishlist

    • Checkout

    • My Orders

    • Track Order

    • My Account

  • Information

    • FAQs

    • Blogs

    • Career

    • About Us

    • Contact Us

    • Payment Options

  • Policies

    • Privacy Policy

    • Terms & Conditions

    • GST Input Tax Credit

    • Shipping Return Policy

    • E-Waste Collection Points

    • Our Sitemap

© Zbotic.in is registered trademark of Moxie Supply Pvt Ltd – All Rights Reserved
Login
Use Phone Number
Use Email Address
Not a member yet? Register Now
Reset Password
Use Phone Number
Use Email Address
Register
Already a member? Login Now