A soil compaction sensor measuring root zone health provides farmers with actionable data on one of the most overlooked constraints to crop yield. Soil compaction reduces root penetration, water infiltration, and microbial activity — reducing yield by 20-50% in severe cases. This guide covers measuring soil compaction with penetrometers, building a digital soil penetrometer logger with Arduino, and interpreting compaction data for better farm management in India.
Table of Contents
- The Soil Compaction Problem in India
- How to Measure Soil Compaction
- Components Required
- Circuit Design
- Digital Penetrometer Code
- Interpreting Compaction Data
- Soil Compaction Remediation
- Frequently Asked Questions
The Soil Compaction Problem in India
Soil compaction affects an estimated 68 million hectares of cropland in India. Primary causes:
- Heavy machinery: Combine harvesters weighing 10-15 tonnes compact soil to 60 cm depth in wet conditions
- Repeated tillage at same depth: Creates “plough pan” hardpan layer at 15-20 cm
- Livestock trampling: Particularly on irrigated fields grazed during dry months
- Waterlogging: Reduces soil pore structure over time in clay-heavy soils (Vertisols of Maharashtra, MP)
- Burning stubble: Destroys soil organic matter and earthworm populations that naturally break up compaction
Yield losses: Compaction at 15 bar penetration resistance reduces wheat yield 25-35% and paddy yield 20-30% compared to uncompacted soil.
How to Measure Soil Compaction
Soil compaction is measured as penetration resistance using a cone penetrometer. The cone (typically 30-degree half-angle, 1.27 cm base diameter) is pushed into soil at a constant rate (2-3 cm/second) and the force required is recorded as pressure (bar or psi).
Threshold values for crop root penetration:
- Below 1.5 bar: Good root growth
- 1.5 – 2.5 bar: Restricted root growth
- Above 3.0 bar: Root growth practically stops
- Above 5.0 bar: Impenetrable (hardpan layer)
The digital penetrometer logger records resistance at 1 cm depth intervals as the probe is pushed down, creating a depth-vs-compaction profile.
Components Required
Related Products from Zbotic
- Capacitive Soil Moisture Sensor — soil moisture at compaction measurement points (compaction thresholds vary with moisture)
- GY-BME280 Sensor — ambient temperature and humidity logging with compaction data
Penetrometer logger components:
- Arduino Nano (compact, battery-powered)
- HX711 24-bit ADC + 50kg load cell (measures cone force)
- MPU6050 IMU (measures probe angle — only vertical measurements valid)
- HC-SR04 ultrasonic sensor or rotary encoder (measures insertion depth)
- MicroSD card module (data logger)
- DS3231 RTC (timestamped measurements)
- OLED 0.96″ display
- Push button (trigger reading)
- 18650 LiPo battery + TP4056 charger
- Steel cone (30-degree, 1.27 cm base diameter, stainless)
- 1-metre graduated probe rod (stainless steel, 12mm diameter)
Circuit Design
Key connections:
- HX711 DT -> Arduino A0, SCK -> A1 (load cell for force measurement)
- MPU6050 SDA -> Arduino A4, SCL -> A5
- HC-SR04 TRIG -> D8, ECHO -> D9 (depth measurement via surface-to-probe distance)
- SD card CS -> D10, MOSI -> D11, MISO -> D12, SCK -> D13
- DS3231 SDA -> A4, SCL -> A5 (shared I2C)
- OLED SDA -> A4, SCL -> A5
- Trigger button -> D2 (interrupt)
The HC-SR04 is mounted above the soil surface pointing down at the probe. As the probe is pushed deeper, the distance to the probe collar increases, allowing depth calculation. Alternatively, a rotary encoder on a wheel running along the probe rod provides more accurate depth measurement.
Digital Penetrometer Code
#include <Wire.h>
#include <HX711.h>
#include <SPI.h>
#include <SD.h>
#include <RTClib.h>
#include <Adafruit_SSD1306.h>
#include <MPU6050.h>
HX711 loadCell;
RTC_DS3231 rtc;
Adafruit_SSD1306 display(128, 64, &Wire, -1);
MPU6050 imu;
#define TRIG_PIN 8
#define ECHO_PIN 9
// Penetrometer cone specs: 30-degree half-angle, 1.27cm base = 1.267 cm2 area
const float CONE_AREA_CM2 = 1.267;
// Load cell calibration
const float CALIB_FACTOR = -22.456; // Adjust per your load cell
float baseDistance = 0; // Surface distance before insertion
float sampleDepth = 0;
float coneForce = 0;
float conePressure = 0;
float readDistance() {
digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long dur = pulseIn(ECHO_PIN, HIGH, 30000);
return dur / 58.0; // cm
}
bool isVertical() {
int16_t ax, ay, az, gx, gy, gz;
imu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
// Check if probe is within 10 degrees of vertical
float tiltAngle = atan2(sqrt(ax*ax + ay*ay), abs(az)) * 180.0 / 3.14159;
return tiltAngle < 10.0;
}
void setup() {
Serial.begin(9600);
Wire.begin();
imu.initialize();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
rtc.begin();
SD.begin(10);
loadCell.begin(A0, A1);
loadCell.set_scale(CALIB_FACTOR);
loadCell.tare();
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(2, INPUT_PULLUP); // Trigger button
// Record baseline surface distance
baseDistance = readDistance();
Serial.println("Baseline distance: " + String(baseDistance) + " cm");
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 20);
display.print("Penetrometer Ready");
display.setCursor(0, 35);
display.print("Press button + push");
display.display();
}
String logFile = "penet01.csv";
bool measuring = false;
void loop() {
if (!digitalRead(2)) { // Button pressed
if (!measuring) {
// Start new measurement
measuring = true;
logFile = "penet" + String(rtc.now().unixtime()) + ".csv";
File f = SD.open(logFile, FILE_WRITE);
if (f) {
f.println("depth_cm,force_kg,pressure_bar,valid_angle");
f.close();
}
}
delay(50);
}
if (measuring) {
float currentDist = readDistance();
sampleDepth = currentDist - baseDistance; // Negative = probe going deeper
if (sampleDepth > 0) { // Probe below surface
coneForce = loadCell.get_units(5); // kg
conePressure = (coneForce / CONE_AREA_CM2) / 10.0; // Convert kg/cm2 to bar
bool vertical = isVertical();
// Log to SD
File f = SD.open(logFile, FILE_WRITE);
if (f) {
f.print(sampleDepth, 1);
f.print(",");
f.print(coneForce, 2);
f.print(",");
f.print(conePressure, 2);
f.print(",");
f.println(vertical ? "Y" : "N");
f.close();
}
// Display
display.clearDisplay();
display.setCursor(0, 0);
display.print("Depth: "); display.print(sampleDepth, 1); display.print(" cm");
display.setCursor(0, 15);
display.print("Force: "); display.print(coneForce, 1); display.print(" kg");
display.setCursor(0, 30);
display.print("Press: "); display.print(conePressure, 2); display.print(" bar");
// Visual indicator
String status = (conePressure < 1.5) ? "GOOD" : (conePressure < 3.0) ? "RESTRICT" : "COMPACT!";
display.setCursor(0, 50);
display.print(status);
if (!vertical) { display.print(" TILT!"); }
display.display();
Serial.printf("Depth:%.1fcm Force:%.2fkg Pressure:%.2f barn",
sampleDepth, coneForce, conePressure);
}
delay(200); // 5 readings per second
}
}
Interpreting Compaction Data
The depth profile reveals different types of compaction:
- Surface compaction (0-10 cm): Caused by rain impact on bare soil or foot traffic. Remedied by mulching and reduced tillage.
- Plough pan (15-25 cm): Consistent high resistance layer at tillage depth. Requires subsoiling or chisel ploughing to 35 cm.
- Subsoil compaction (25-50 cm): Caused by heavy machinery. Very difficult to remediate — requires deep-rooted cover crops (radish, sunhemp) or deep ripper.
Soil Compaction Remediation
Based on penetrometer data, select the appropriate remedy:
- Surface (0-15 cm): Rotary tiller or disc harrow; increase organic matter (vermicompost, FYM)
- Plough pan (15-30 cm): Subsoiler at 35 cm depth; deep-rooted cover crops (Daikon radish creates bio-channels)
- Deep (30-50 cm): Ripper subsoiler; Dhaincha (Sesbania) grown as green manure for 2 seasons
- All depths: Promote earthworm populations (protect from burning, avoid pesticide overuse)
Frequently Asked Questions
When is the best time to measure soil compaction?
Measure at field capacity — 24-48 hours after irrigation or rainfall when soil is neither too wet nor too dry. Dry soil always shows artificially high compaction readings; waterlogged soil shows artificially low readings. Standardised measurement at field capacity allows meaningful season-to-season comparisons.
How many penetrometer readings should I take per field?
Take 10-15 readings per field in a grid pattern (one per zone of interest). Always measure in both wheel tracks and between wheel tracks to quantify traffic compaction. Take readings along one transect from field entrance to far end to identify severity gradient.
Can the digital penetrometer data link with precision agriculture software?
Yes. Export the SD card CSV data to QGIS with GPS coordinates for each measurement point to create compaction maps. These maps guide variable-depth subsoiling passes, saving fuel by subsoiling only high-compaction zones.
Is soil compaction getting worse in India?
Yes. ICAR studies show average soil bulk density in wheat-rice belt has increased from 1.4 to 1.7 g/cc in the last 30 years. Minimum tillage and direct seeding are government-promoted solutions under ICAR’s Natural Farming initiative, but measurement tools are needed to track improvement.
Add comment